#
# virt-viewer completer
#

_virt_viewer_complete()
{
    local words cword c w cur URI CMDLINE MODE DOMS

    # Here, $COMP_WORDS is an array of words on the bash
    # command line that user wants to complete. However, when
    # parsing command line, the default set of word breaks is
    # applied. This doesn't work for us as it mangles virt-viewer
    # arguments, e.g. connection URI (with the default set it's
    # split into multiple items within the array). Fortunately,
    # there's a fixup function for the array.
    _get_comp_words_by_ref -n "\"'><=;|&(:" -w words -i cword
    COMP_WORDS=( "${words[@]}" )
    COMP_CWORD=${cword}
    cur=${COMP_WORDS[$COMP_CWORD]}

    MODE="--name"
    ALL="--all"
    # See what URI is user trying to connect to. Honour that.
    for ((c=1; c<=${COMP_CWORD}; c++)); do
        case "${COMP_WORDS[c]}" in
            -c|--connect)
                if [[ -n "${COMP_WORDS[c+1]}" ]]; then
                    URI="${COMP_WORDS[c+1]}"
                    c=$((++c))
                fi
                ;;

            --connect=*)
                w=${COMP_WORDS[c]#*=}
                if [[ -z "$w" ]] ; then
                    return
                fi
                URI=$w
                ;;

            --domain-name)
                # Generate list of domain names which is done below
                MODE="--name"
                ALL="--all"
                ;;

            --uuid)
                # Generate list of domain UUIDs which is done below
                MODE="--uuid"
                ALL="--all"
                ;;

            --id)
                # Generate list of domain IDs which is done below
                MODE=""
                ALL=""
                ;;
        esac
    done

    case "$cur" in
        --connect=*)
            # Nada
            return
            ;;

        --display=*)
            cur=${cur#*=}
            DISPLAYS=$(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
            COMPREPLY=($(compgen -W '${DISPLAYS}' -- "$cur"))
            __ltrim_colon_completions "$cur"
            return
            ;;

        --kiosk-quit=*)
            cur=${cur#*=}
            COMPREPLY=($(compgen -W 'never on-disconnect' -- "$cur"))
            return
            ;;

        -*)
            # If the current option already ends with '=' then don't generate
            # any more --options
            if [[ $cur == *= ]] ; then
                return
            fi
            COMPREPLY=($(compgen -W '$( _parse_help "$1" -h )' -- "$cur"))
            if [[ $COMPREPLY == *= ]] ; then
                compopt -o nospace
            fi
            return
            ;;
    esac

    CMDLINE=
    if [ -n "${URI}" ]; then
        CMDLINE="${CMDLINE} -c ${URI}"
    fi

    DOMS=($(virsh -q -r ${CMDLINE} list ${ALL} ${MODE} 2>/dev/null | awk '{print $1;}' ))

    COMPREPLY=($(compgen -W "${DOMS[*]%--}" -- ${cur}))

    __ltrim_colon_completions "${cur}"
    return
} &&
complete -F _virt_viewer_complete virt-viewer

# vim: ft=sh:et:ts=4:sw=4:tw=80
