_dw_filedir() {
    if typeset -f _filedir > /dev/null; then
        _filedir
    else
        COMPREPLY=( $(compgen -f -- $cur) )
    fi
}

_options() {
    local optlist
    optlist=$(drweb-ctl $1 --help | grep -E '^[[:space:]]+-.*' | sed 's/^[[:space:]]*\|[[:space:]][[:space:]]*[^[:space:]-][^[:space:]]*//g;s/[[:space:]][[:space:]]*/\n/g')
    ( echo "${optlist}"; echo "${optlist}" | tr '[:upper:]' '[:lower:]' ) | sort -u
}

_cmds() {
    drweb-ctl --help | grep -E '^[[:space:]].*' | sed 's|^[[:space:]]*||g' | grep -v -E '^-|^[A-Z]' | cut -d' ' -f1
}


_cfs() {
    drweb-ctl cfshow | awk '{print $1}' | tr '[:upper:]' '[:lower:]'
}

_drweblc() {
    echo "$1" | tr '[:upper:]' '[:lower:]'
}

_have_cmd() {
    local word cmd cmds
    cmds="$(_cmds)"
    for word in ${COMP_WORDS[*]} ; do
        for cmd in $cmds ; do
            if [ "$word" = "$cmd" ] ; then
                echo $cmd
                return
            fi
        done
    done
    echo ""
}

_gen_ids() {
    local cmd
    cmd="$1"
    ids=$(drweb-ctl $cmd 2>/dev/null | grep 'ID:' | awk '{print $2}')
    if [ -n "$ids" ] ; then
        ids="$ids ALL"
    fi
    COMPREPLY=( $(compgen -W "${ids}" -- $cur) )
}

_drweb_ctl()
{
    local cur prev options cmds cmd cfs

    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    prev=${COMP_WORDS[COMP_CWORD-1]}
    cmd=$(_have_cmd)

    if [ -n "$cmd" ] ; then
        if [[ "$cur" == -* ]]; then
            options="$(_options) $(_options $cmd)"
            COMPREPLY=( $(compgen -W "$options" -- $cur) )
            return 0
        fi
        case "$cmd" in
            cfset)
                if [[ "${prev}" == "${cmd}" ]]; then
                    cfs=$(_cfs)
                    COMPREPLY=( $(compgen -W "${cfs}" -- $(_drweblc $cur)) )
                else
                    _dw_filedir
                fi
                return 0
            ;;
            cfshow)
                if [[ "${prev}" == "${cmd}" ]]; then
                    cfs=$(_cfs)
                    COMPREPLY=( $(compgen -W "${cfs}" -- $(_drweblc $cur)) )
                fi
                return 0
            ;;
            scan|flowscan|rawscan|netscan|cloudscan|checkmail)
                _dw_filedir
                return 0
            ;;
            bootscan)
                cur=${cur:=/dev/}
                _dw_filedir
                return 0
            ;;
            threats)
                case "$(_drweblc "$prev")" in
                    --cure|--quarantine|--delete|--ignore)
                        _gen_ids "$cmd"
                        return 0
                    ;;
                esac
            ;;
            quarantine)
                case "$(_drweblc "$prev")" in
                    --delete|--restore)
                        _gen_ids "$cmd"
                        return 0
                    ;;
                esac
            ;;
            remotescan)
                case "$(_drweblc "$prev")" in
                    -i|--identity)
                        _dw_filedir
                        return 0
                    ;;
                esac
            ;;
        esac
    else
        options=$(_options)
        cmds=$(_cmds)
        options+=$cmds
    fi

    COMPREPLY=( $(compgen -W "$options" -- $cur) )
    return 0
}
complete -F _drweb_ctl drweb-ctl
