# 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: ts=4 sw=4 et filetype=sh
