# gnokii(1) completion                                     -*- shell-script -*-

_gnokii_memory_type()
{
    # TODO: reduce the number of choices
    COMPREPLY=($(compgen -W "IN OU SM ME MT" -- "$cur"))
}

_gnokii()
{
    local cur prev words cword pprev tprev fprev
    _init_completion || return

    case $prev in
        --config)
            _filedir
            return
            ;;
        --phone)
            local config_file
            for config_file in "$XDG_CONFIG_HOME/gnokii/config" \
                "$HOME/.config/gnokii/config" "$HOME/.gnokiirc" \
                "$XDG_CONFIG_DIRS/gnokii/config" /etc/gnokiirc; do
                [[ -f $config_file ]] && break
            done
            [[ ! -f $config_file ]] && return
            COMPREPLY=($(compgen -W \
                "$(command sed -n 's/^\[phone_\(.*\)\]/\1/p' $config_file)" \
                -- "$cur"))
            return
            ;;
        --help)
            COMPREPLY=($(compgen -W 'all monitor sms mms phonebook calendar
                todo dial profile settings wap logo ringtone security file
                other' -- "$cur"))
            return
            ;;
        --version | --shell | ping)
            return
            ;;

        # MONITOR
        --monitor)
            COMPREPLY=($(compgen -W 'delay once' -- "$cur"))
            return
            ;;
        --getdisplaystatus | --displayoutput)
            return
            ;;
        --netmonitor)
            COMPREPLY=($(compgen -W 'reset off field devel next nr' \
                -- "$cur"))
            return
            ;;

        # SMS
        --sendsms)
            # (how)TODO ?
            return
            ;;
        --savesms)
            COMPREPLY=($(compgen -W '--sender --smsc --smscno --folder
                --location --sent --read --deliver --datetime' -- "$cur"))
            return
            ;;
        --memory-type | --memory | --getsms | --deletesms | --getmms | --deletemms | \
            --getphonebook | --deletephonebook)
            _gnokii_memory_type
            return
            ;;
        --getsmsc | --getcalendarnote | --deletecalendarnote | --gettodo | \
            --getspeeddial)
            # TODO: grab a specific entry ID
            return
            ;;
        --setsmsc | --smsreader | --createsmsfolder | --deletealltodos | \
            --showsmsfolderstatus)
            return
            ;;
        --deletesmsfolder | --folder)
            # TODO: folderid
            return
            ;;
        --writephonebook)
            COMPREPLY=($(compgen -W '--overwrite --find-free --memory-type
                --location --vcard --ldif' -- "$cur"))
            return
            ;;
        --writecalendarnote | --writetodo)
            _filedir vcf
            return
            ;;

        # DIAL
        --setspeeddial | --dialvoice | --senddtmf | --answercall | --hangup)
            # TODO
            return
            ;;
        --divert)
            COMPREPLY=($(compgen -W '--op' -- "$cur"))
            return
            ;;

        # PROFILE
        --getprofile | --setactiveprofile)
            # TODO
            return
            ;;
        --setprofile | --getactiveprofile)
            return
            ;;

        # SETTINGS
        --reset)
            COMPREPLY=($(compgen -W 'soft hard' -- "$cur"))
            return
            ;;
        --setdatetime | --setalarm)
            # TODO
            return
            ;;
        --getdatetime | --getalarm)
            return
            ;;

        # WAP
        --getwapbookmark | --writewapbookmark | --deletewapbookmark | \
            --getwapsetting | --writewapsetting | --activatewapsetting)
            return
            ;;

        # LOGOS
        --sendlogo)
            COMPREPLY=($(compgen -W 'caller op picture' -- "$cur"))
            return
            ;;
        --setlogo | --getlogo)
            COMPREPLY=($(compgen -W 'op startup caller dealer text' \
                -- "$cur"))
            return
            ;;
        --viewlogo)
            # TODO: logofile
            return
            ;;

        --entersecuritycode)
            COMPREPLY=($(compgen -W 'PIN PIN2 PUK PUK2 SEC' -- "$cur"))
            return
            ;;

            # TODO: RINGTONES
    esac

    # second level completion
    if [[ $((cword - 2)) -ge 1 && ${words[cword - 2]} =~ --* ]]; then
        pprev=${words[cword - 2]}
        case $pprev in
            --setspeeddial)
                _gnokii_memory_type
                return
                ;;
            --getsms | --deletesms | --getmms | --deletemms | --getphonebook | \
                --writetodo | --writecalendarnote)
                # TODO: start number
                return
                ;;
            --gettodo | --getcalendarnote)
                COMPREPLY=($(compgen -W '{1..9} end --vCal' -- "$cur"))
                return
                ;;
            --deletecalendarnote)
                COMPREPLY=($(compgen -W '{1..9} end' -- "$cur"))
                return
                ;;
            --divert)
                COMPREPLY=($(compgen -W 'register enable query disable
                    erasure' -- "$cur"))
                return
                ;;
        esac
    fi

    # third level completion
    if [[ $((cword - 3)) -ge 1 && ${words[cword - 3]} =~ --* ]]; then
        tprev=${words[cword - 3]}
        case $tprev in
            --deletesms | --deletemms)
                COMPREPLY=($(compgen -W 'end' -- "$cur"))
                return
                ;;
            --getphonebook | --writetodo | --writecalendarnote)
                COMPREPLY=($(compgen -W '{1..9} end' -- "$cur"))
                return
                ;;
            --gettodo | --getcalendarnote)
                [[ ${words[cword - 1]} == end ]] &&
                    COMPREPLY=($(compgen -W '--vCal' -- "$cur"))
                return
                ;;
            --divert)
                COMPREPLY=($(compgen -W '--type' -- "$cur"))
                return
                ;;
        esac
    fi

    # fourth level completion
    if [[ $((cword - 4)) -ge 1 && ${words[cword - 4]} =~ --* ]]; then
        fprev=${words[cword - 4]}
        case $fprev in
            --getphonebook)
                COMPREPLY=($(compgen -W '--raw --vcard --ldif' -- "$cur"))
                return
                ;;
            --divert)
                COMPREPLY=($(compgen -W 'all busy noans outofreach notavail' \
                    -- "$cur"))
                return
                ;;
        esac
    fi

    # safer to use LANG=C
    local all_cmd="$(LANG=C _parse_help $1 "--help all")"
    # these 2 below are allowed in combination with others
    local main_cmd=$(command grep -v -- '--config\|--phone' <<<"$all_cmd")

    # don't provide main command completions if one is
    # already on the command line
    [[ $COMP_LINE =~ $(tr ' ' '\b|' <<<$main_cmd) ]] && return

    COMPREPLY=($(compgen -W "$all_cmd" -- "$cur"))
} &&
    complete -F _gnokii gnokii

# ex: filetype=sh
