# systemd-dissect(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
}

_systemd_dissect() {
    local comps
    local cur=${COMP_WORDS[COMP_CWORD]} prev_1=${COMP_WORDS[COMP_CWORD-1]} prev_2=${COMP_WORDS[COMP_CWORD-2]} words cword
    local -A OPTS=(
        [STANDALONE]='-h --help --version
                     --no-pager
                     --no-legend
                     -r --read-only
                     --mkdir
                     --rmdir'
        [ARG]='-m --mount -M
               -u --umount -U
               -l --list
               -x --copy-from
               -a --copy-to
               --fsck
               --growfs
               --discard
               --root-hash
               --root-hash-sig
               --verity-data
               --json'
    )

    _init_completion || return

    if __contains_word "$prev_1" ${OPTS[ARG]}; then
        case $prev_1 in
            -l|--list|-m|--mount|-M|-x|--copy-from|-a|--copy-to|--verity-data)
                comps=$(compgen -A file -- "$cur")
                compopt -o filenames
                ;;
            -u|--umount|-U)
                comps=$(compgen -A directory -- "$cur" )
                compopt -o dirnames
                ;;
            --fsck|--growfs)
                comps='yes no'
                ;;
            --discard)
                comps='disabled loop all crypto'
                ;;
            --root-hash-sig)
                comps="base64: $(compgen -A file -- "$cur")"
                compopt -o filenames
                ;;
            --json)
                comps='pretty short off'
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

    if __contains_word "$prev_2" ${OPTS[ARG]}; then
        case $prev_2 in
            -m|--mount|-M)
                comps=$(compgen -A directory -- "$cur" )
                compopt -o dirnames
                ;;
            *)
                comps=$(compgen -A file -- "$cur" )
                compopt -o filenames
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

    COMPREPLY=( $(compgen -A file -- "$cur") )
    compopt -o filenames
    return 0
}

complete -F _systemd_dissect systemd-dissect
