# 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 <http://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'
        [ARG]='--esp-path --boot-path'
    )

    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
                ;;
        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'
        [BOOTENTRY]='set-default set-oneshot'
        [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
