# bootctl(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_entry_ids() {
    bootctl --no-pager list 2>/dev/null | { while read -r a b; do [[ $a == 'id:' ]] && echo " $b"; done }
}

_bootctl() {
    local i verb comps
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local -A OPTS=(
        [STANDALONE]='-h --help -p --print-esp-path -x --print-boot-path --version --no-variables --no-pager --graceful --dry-run'
        [ARG]='--esp-path --boot-path --make-machine-id-directory --root --image --install-source'
    )

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --esp-path|--boot-path)
                if [[ -z $cur ]]; then
                    comps=$(compgen -A directory -- "/" )
                else
                    comps=$(compgen -A directory -- "$cur" )
                fi
                compopt -o filenames
                ;;
            --make-machine-id-directory)
                comps="yes no auto"
                ;;
            --image|--root)
                compopt -o nospace
                comps=$( compgen -A file -- "$cur" )
                ;;
            --install-source)
                comps="image host auto"
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

    local -A VERBS=(
        # systemd-efi-options takes an argument, but it is free-form, so we cannot complete it
        [STANDALONE]='help status install update remove is-installed random-seed systemd-efi-options list set-timeout set-timeout-oneshot cleanup'
        [BOOTENTRY]='set-default set-oneshot unlink'
        [BOOLEAN]='reboot-to-firmware'
    )

    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[STANDALONE]}; then
        comps=''
    elif __contains_word "$verb" ${VERBS[BOOTENTRY]}; then
        name=
        for ((i++; i < COMP_CWORD; i++)); do
            if ! __contains_word "${COMP_WORDS[i]}" ${OPTS[*]} ${VERBS[*]} &&
                    ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
                name=${COMP_WORDS[i]}
                break;
            fi
        done

        if [[ -z $name ]]; then
            comps=$( __get_entry_ids )
        else
            comps=''
        fi
    elif __contains_word "$verb" ${VERBS[BOOLEAN]}; then
        comps="yes no"
    fi

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

complete -F _bootctl bootctl
