# vim:set et ts=4 sts=4:
# bash completion for ibus
#
# ibus - The Input Bus
#
# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
# Copyright (c) 2007-2010 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
# USA

if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
if [[ -z ${ZSH_VERSION:+set} ]]; then
_get_comp_words_by_ref ()
{
    local exclude cur_ words_ cword_
    if [ "$1" = "-n" ]; then
        exclude=$2
        shift 2
    fi
    __git_reassemble_comp_words_by_ref "$exclude"
    cur_=${words_[cword_]}
    while [ $# -gt 0 ]; do
        case "$1" in
        cur)
            cur=$cur_
            ;;
        prev)
            prev=${words_[$cword_-1]}
            ;;
        words)
            words=("${words_[@]}")
            ;;
        cword)
            cword=$cword_
            ;;
        esac
        shift
    done
}
else
_get_comp_words_by_ref ()
{
    while [ $# -gt 0 ]; do
        case "$1" in
        cur)
            cur=${COMP_WORDS[COMP_CWORD]}
            ;;
        prev)
            prev=${COMP_WORDS[COMP_CWORD-1]}
            ;;
        words)
            words=("${COMP_WORDS[@]}")
            ;;
        cword)
            cword=$COMP_CWORD
            ;;
        -n)
            # assume COMP_WORDBREAKS is already set sanely
            shift
            ;;
        esac
        shift
    done
}
fi
fi

__ibus_engine()
{
    if [[ "$cmd" == "$prev" ]]; then
        local imes=$( ibus list-engine --name-only 2>/dev/null )
        COMPREPLY=( $( compgen -W "$imes" -- "$cur" | sed "s/^$cur/$cur_/" ))
    fi
}

__ibus_list_engine()
{
   if [[ "$cur" == -* ]]; then
       local options=( --name-only )
       COMPREPLY=( $( compgen -W '${options[@]}' -- "$cur" ))
   fi
}

__ibus()
{
    COMPREPLY=()

    local cur_=$2 prev_=$3 cur words cword prev
    _get_comp_words_by_ref -n =: cur words cword prev

    # echo
    # echo "cur='$cur'"
    # echo "prev='$prev'"
    # echo "words='${words[@]}'"
    # echo "cwords='${cwords[@]}'"

    # Commands
    local cmds=( engine list-engine watch restart exit )

    local i c cmd subcmd
    for (( i=1; i < ${#words[@]}-1; i++)) ; do
        [[ -n $cmd ]] && subcmd=${words[i]} && break
        for c in ${cmds[@]}; do
            [[ ${words[i]} == $c ]] && cmd=$c && break
        done
    done

    case $cmd in
        engine)
            __ibus_engine;
            return 0
            ;;
        list-engine)
            __ibus_list_engine;
            return 0
            ;;
        watch)
            return 0
            ;;
        *)
            COMPREPLY=( $( compgen -W '${cmds[@]}' -- "$cur" ))
            return 0
            ;;
    esac
} &&
complete -o bashdefault -o default -o nospace -F __ibus ibus
