# kmod completion                                          -*- shell-script -*-
#
# This file is part of kmod.
#
# Copyright 2010 Ran Benita
# Copyright (C) 2013  Intel Corporation. All rights reserved.
#
# This program 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 program 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
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.

__contains_word () {
        local word=$1; shift
        for w in "$@"; do [[ "$w" = "$word" ]] && return 0; done
        return 1
}

__is_opt () {
        local prevprev=${COMP_WORDS[COMP_CWORD-2]}
        local short="$1" long="$2"

        if [[ "$prev" = "$short" || "$prev" = "$long" ]]; then
                declare -g cur=${cur#=}
                return 0
        elif [[ "$prev" = "=" && "$prevprev" = "$long" ]]; then
                return 0
        fi

        return 1
}

_kmod_static_nodes () {
        local OPTS='-o -f -h --help'
        local OPTS_EQUAL='--output --format'
        local GROUP_FORMAT='human tmpfiles devname'

        if __is_opt '-o' '--output'; then
                compopt -o filenames
                COMPREPLY=( $(compgen -f -- "$cur") )
                return 0
        elif __is_opt '-f' '--format'; then
                COMPREPLY=( $(compgen -W "$GROUP_FORMAT" -- "$cur" ) )
                return 0
        fi

        local cur=${COMP_WORDS[COMP_CWORD]}

        compopt -o nospace
        COMPREPLY=( $(compgen -W "$OPTS" -- "$cur") )
        COMPREPLY+=( $(compgen -W "$OPTS_EQUAL" -S= -- "$cur") )
}

_kmod() {
        local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
        local VERBS=(help list static-nodes)
        local OPTS='-h --help -V --version'
        local verb

        # standalone options, no other option or action allowed
        for ((i=0; $i < $COMP_CWORD; i++)); do
                if __contains_word "${COMP_WORDS[i]}" ${OPTS}; then
                        return 0
                fi
        done

        # find the action
        for ((i=0; $i <= $COMP_CWORD; i++)); do
                if __contains_word "${COMP_WORDS[i]}" "${VERBS[@]}"; then
                        verb=${COMP_WORDS[i]}
                        break
                fi
        done

        if [[ -z $verb ]]; then
                COMPREPLY=( $(compgen -W '${OPTS[*]} ${VERBS[*]}' -- "$cur") )
                return 0
        fi

        local func=${verb//-/_}

        if declare -F _kmod_${func} > /dev/null; then
                _kmod_${func}
        fi

        # allow the space if there's only one completion and it doesn't end with
        # '='
        if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != *"=" ]] ; then
                compopt +o nospace
        fi

        return 0
}

complete -F _kmod kmod
