# portablectl(1) completion                             -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# 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 --max-addresses=0 --no-legend --no-pager 2>/dev/null; echo ".host"; } | \
	{ while read a b; do echo " $a"; done; } | \
        sort -u
}

_portablectl() {
    local i n comps verb
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local -A OPTS=(
        [STANDALONE]='-q --quiet --runtime --no-reload --cat --no-pager --no-legend
                              --no-ask-password --enable --now -h --help --version'
        [ARG]='-p --profile --copy -H --host -M --machine'
    )

    local -A VERBS=(
        [STANDALONE]='list'
        [IMAGE]='attach detach reattach inspect is-attached set-limit'
        [IMAGES]='remove'
        [IMAGE_WITH_BOOL]='read-only'
    )

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --profile|-p)
                comps="default nonetwork strict trusted"
                ;;
            --copy)
                comps="copy symlink auto"
                ;;
            --host|-H)
                comps=$(compgen -A hostname)
                ;;
            --machine|-M)
                comps=$( __get_machines )
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

    for ((i=0; i < COMP_CWORD; i++)); do
        if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
                ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
            verb=${COMP_WORDS[i]}
            break
        fi
    done

    n=$(($COMP_CWORD - $i))

    if [[ -z ${verb-} ]]; then
        comps=${VERBS[*]}
    elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
        comps=''
    elif __contains_word "$verb" ${VERBS[IMAGE]}; then
        if [[ $n == 1 ]]; then
            comps=$( compgen -A file -- "$cur" )
            compopt -o filenames
        else
            comps=''
        fi
    elif __contains_word "$verb" ${VERBS[IMAGES]}; then
        comps=$( compgen -A file -- "$cur" )
        compopt -o filenames
    elif __contains_word "$verb" ${VERBS[IMAGE_WITH_BOOL]}; then
        if [[ $n == 1 ]]; then
            comps=$( compgen -A file -- "$cur" )
            compopt -o filenames
        elif [[ $n == 2 ]]; then
            comps='yes no'
        else
            comps=''
        fi
    fi

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

complete -F _portablectl portablectl
