# hostnamectl(1) completion                               -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# Copyright © 2010 Ran Benita
#
# systemd 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.
#
# systemd 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 systemd; If not, see <https://www.gnu.org/licenses/>.

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

__get_machines() {
    local a b
    machinectl list --full --no-legend --no-pager 2>/dev/null |
        { while read a b; do echo " $a"; done; };
}

_hostnamectl() {
    local i verb comps
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local -A OPTS=(
        [STANDALONE]='-h --help --version --transient --static --pretty --no-ask-password'
        [ARG]='-H --host -M --machine --json'
    )

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --host|-H)
                comps=$(compgen -A hostname)
                ;;
            --machine|-M)
                comps=$( __get_machines )
                ;;
            --json)
                comps=$( hostnamectl --json=help 2>/dev/null )
                ;;
            *)
                return 0
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

    local -A VERBS=(
        [STANDALONE]='status'
        [ICONS]='icon-name'
        [NAME]='hostname deployment location'
        [CHASSIS]='chassis'
    )

    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
        comps=${VERBS[*]}
    elif __contains_word "$verb" ${VERBS[CHASSIS]}; then
        comps='desktop laptop convertible server tablet handset watch embedded vm container'
    elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[ICONS]} ${VERBS[NAME]}; then
        comps=''
    fi

    COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
    return 0
}

complete -F _hostnamectl hostnamectl
