# 
# Apport bash-completion
#
###############################################################################

# get available symptoms
_apport_symptoms ()
{
    local syms
    if [ -r /usr/share/apport/symptoms ]; then 
        for FILE in $(ls /usr/share/apport/symptoms); do
           syms="$syms ${FILE%.py}"
        done
    fi
    echo $syms

}

# completion when used without parameters
_apport_parameterless ()
{
    local param
    # parameter-less completion
    # param= COMMAND parameters
    #        package names
    #        PIDs
    #        Symptoms
    #        any file
    param="$dashoptions \
           $( apt-cache pkgnames $cur 2> /dev/null ) \
           $( command ps axo pid | sed 1d ) \
           $( _apport_symptoms ) \
           $( compgen -G "${cur}*" )"
    COMPREPLY=( $( compgen -W "$param" -- $cur) )

}

# apport-bug ubuntu-bug completion
_apport-bug ()
{
    local cur dashoptions prev param

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}


    # available options
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom -p \
                 --package -P --pid -c --crash-file --save -v --version'

    case "$prev" in
    ubuntu-bug | apport-bug)
        case "$cur" in
        -*)
            # parameter completion
            COMPREPLY=( $( compgen -W "$dashoptions" -- $cur ) )

        ;;
        *)
            # no parameter given
            _apport_parameterless 

        ;;
        esac

    ;;
    -f | --file-bug)
        param="-P --pid -p --package -s --symptom"
        COMPREPLY=( $( compgen -W "$param $(_apport_symptoms)" -- $cur) )

    ;;
    -p | --package)
        COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )

    ;;
    -u | --update-bug)
        param="-p --package"
        COMPREPLY=( $( compgen -W "$param" -- $cur) )

    ;;
    -s | --symptom)
        COMPREPLY=( $( compgen -W "$(_apport_symptoms)" -- $cur) )

    ;;
    -P | --pid)
	COMPREPLY=( $( compgen -W '$( command ps axo pid | sed 1d )' -- $cur ) )

    ;;
    --save)
        COMPREPLY=( $( compgen -o default -G "$cur*" ) )
    
    ;;
    -c | --crash-file)
        # only show *.apport *.crash files
        COMPREPLY=( $( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ) )

    ;;
    -h | --help | -v | --version)
        # standalone parameters
        return 0

    ;;
    *)
        if [ "${COMP_WORDS[COMP_CWORD-2]}" == "--save" ]; then
            # use same completion as if no parameter is given
            case "$cur" in
            -*)
                # parameter completion
                COMPREPLY=( $( compgen -W "$dashoptions" -- $cur ) )

            ;;
            *)
                _apport_parameterless 

            ;;
            esac

        else
            # save is allowed for most parameters
            param="--save"
            COMPREPLY=( $( compgen -W "$param" -- $cur) )

        fi

    ;;
    esac
}

# apport-cli completion
_apport-cli ()
{
    local cur dashoptions prev param

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}


    # available options
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version'

    case "$prev" in
    apport-cli)
        case "$cur" in
        -*)
            # parameter completion
            COMPREPLY=( $( compgen -W "$dashoptions" -- $cur ) )

        ;;
        *)
            # no parameter given
            _apport_parameterless 

        ;;
        esac

    ;;
    -f | --file-bug)
        param="-P --pid -p --package -s --symptom"
        COMPREPLY=( $( compgen -W "$param $(_apport_symptoms)" -- $cur) )

    ;;
    -s | --symptom)
        COMPREPLY=( $( compgen -W "$(_apport_symptoms)" -- $cur) )

    ;;
    --save)
        COMPREPLY=( $( compgen -o default -G "$cur*" ) )
    
    ;;
    -c | --crash-file)
        # only show *.apport *.crash files
        COMPREPLY=( $( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ) )

    ;;
    -h | --help | -v | --version)
        # standalone parameters
        return 0

    ;;
    *)
        if [ "${COMP_WORDS[COMP_CWORD-2]}" == "--save" ]; then
            # use same completion as if no parameter is given
            case "$cur" in
            -*)
                # parameter completion
                COMPREPLY=( $( compgen -W "$dashoptions" -- $cur ) )

            ;;
            *)
                _apport_parameterless 

            ;;
            esac

        else
            # save is allowed for most parameters
            param="--save"
            COMPREPLY=( $( compgen -W "$param" -- $cur) )

        fi

    ;;
    esac
}

# apport-unpack completion
_apport-unpack ()
{
    local cur prev

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case "$prev" in
    apport-unpack)
        # only show *.apport *.crash files
        COMPREPLY=( $( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ) )

    ;;
    esac
}

# apport-collect completion
_apport-collect ()
{
    local cur prev

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case "$prev" in 
    apport-collect)
            COMPREPLY=( $( compgen -W "-p --package" -- $cur) )

    ;;
    -p | --package)
        # list package names
        COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )

    ;;
    esac
}

# bind completion to apport commands
complete -F _apport-bug -o filenames -o dirnames ubuntu-bug
complete -F _apport-bug -o filenames -o dirnames apport-bug
complete -F _apport-cli -o filenames -o dirnames apport-cli
complete -F _apport-unpack -o filenames -o dirnames apport-unpack
complete -F _apport-collect apport-collect
