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

_systemd_cgtop() {
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword
    local comps

    local -A OPTS=(
        [STANDALONE]='-h --help --version -p -t -c -m -i -b --batch -r --raw -k -P'
        [ARG]='--cpu --depth -M --machine --recursive -n --iterations -d --delay --order'
    )

    _init_completion || return

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --machine|-M)
                comps=$( __get_machines )
                ;;
            --recursive)
                comps='yes no'
                ;;
            --order)
                comps='path tasks cpu memory io'
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

    COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
    if [ -d /sys/fs/cgroup/systemd/ ]; then
        COMPREPLY+=( $(cd /sys/fs/cgroup/systemd/ && compgen -o nospace -o dirnames "$cur") )
    elif [ -d /sys/fs/cgroup/ ]; then
        COMPREPLY+=( $(cd /sys/fs/cgroup/ && compgen -o nospace -o dirnames "$cur") )
    fi
}

complete -F _systemd_cgtop systemd-cgtop
