# loginctl(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 <http://www.gnu.org/licenses/>.

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

__get_all_sessions () { loginctl --no-legend list-sessions | { while read -r a b; do printf "%s\n" "$a"; done; } ; }
__get_all_users    () { loginctl --no-legend list-users    | { while read -r a b; do printf "%s\n" "$b"; done; } ; }
__get_all_seats    () { loginctl --no-legend list-seats    | { while read -r a b; do printf "%s\n" "$a"; done; } ; }

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

_loginctl () {
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local i verb comps

    local -A OPTS=(
        [STANDALONE]='--all -a --help -h --no-pager --version
                      --no-legend --no-ask-password -l --full --value'
        [ARG]='--host -H --kill-who --property -p --signal -s -M --machine
                      -n --lines -o --output -P'
    )

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --signal|-s)
                _signals
                return
                ;;
            --kill-who)
                comps='all leader'
                ;;
            --host|-H)
                comps=$(compgen -A hostname)
                ;;
            --machine|-M)
                comps=$( __get_machines )
                ;;
            --property|-p|-P)
                comps=''
                ;;
            --output|-o)
                comps=$( loginctl --output=help 2>/dev/null )
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

    local -A VERBS=(
        [SESSIONS]='session-status show-session activate lock-session unlock-session terminate-session kill-session'
        [USERS]='user-status show-user enable-linger disable-linger terminate-user kill-user'
        [SEATS]='seat-status show-seat terminate-seat'
        [STANDALONE]='list-sessions lock-sessions unlock-sessions list-users list-seats flush-devices'
        [ATTACH]='attach'
    )

    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

    if   [[ -z ${verb-} ]]; then
        comps="${VERBS[*]}"

    elif __contains_word "$verb" ${VERBS[SESSIONS]}; then
        comps=$( __get_all_sessions )

    elif __contains_word "$verb" ${VERBS[USERS]}; then
        comps=$( __get_all_users )

    elif __contains_word "$verb" ${VERBS[SEATS]}; then
        comps=$( __get_all_seats )

    elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
        comps=''

    elif __contains_word "$verb" ${VERBS[ATTACH]}; then
        if [[ $prev = $verb ]]; then
            comps=$( __get_all_seats )
        else
            comps=$(compgen -A file -- "$cur" )
            compopt -o filenames
        fi
    fi

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

complete -F _loginctl loginctl
