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

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

__journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
                  ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID} COREDUMP_EXE
                  _{P,U,G}ID _COMM _EXE _CMDLINE
                  _AUDIT_{SESSION,LOGINUID}
                  _SYSTEMD_{CGROUP,SESSION,UNIT,OWNER_UID}
                  _SELINUX_CONTEXT _SOURCE_REALTIME_TIMESTAMP
                  _{BOOT,MACHINE}_ID _HOSTNAME _TRANSPORT
                  _KERNEL_{DEVICE,SUBSYSTEM}
                  _UDEV_{SYSNAME,DEVNODE,DEVLINK}
                  __CURSOR __{REALTIME,MONOTONIC}_TIMESTAMP)
_coredumpctl() {
    local i verb comps
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local OPTS='-h --help --version --no-pager --no-legend -o --output -F --field -1
                -r --reverse -S --since -U --until -D --directory -q --quiet --debugger
                -A --debugger-arguments --json -n --all'

    local -A VERBS=(
        [LIST]='list info'
        [DUMP]='dump debug'
    )

    if __contains_word "$prev" '--output -o'; then
        comps=$( compgen -A file -- "$cur" )
        compopt -o filenames
    elif __contains_word "$prev" '-D --directory'; then
        comps=$( compgen -A directory -- "$cur" )
        compopt -o filenames
    elif __contains_word "$prev" '--debugger'; then
        comps=$( compgen -A command -- "$cur" )
        compopt -o filenames
    elif __contains_word "$prev" '--field -F'; then
        comps=$( compgen -W '${__journal_fields[*]}' -- "$cur" )
    elif __contains_word "$prev" '--json'; then
        comps=$( compgen -W 'pretty short off' -- "$cur" )
    elif [[ $cur = -* ]]; then
        comps=${OPTS}
    elif __contains_word "$prev" ${VERBS[*]} &&
            ! __contains_word ${COMP_WORDS[COMP_CWORD-2]} \
              '--output -o -D --directory -F --field --debugger'; then
        compopt -o nospace
        COMPREPLY=( $(compgen -W '${__journal_fields[*]}' -S= -- "$cur") )
        return 0
    elif [[ $cur = *=* ]]; then
        mapfile -t field_vals < <(coredumpctl -F "${prev%=}" 2>/dev/null)
        COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "${cur#=}") )
        return 0
    elif [[ $prev = '=' ]]; then
        mapfile -t field_vals < <(coredumpctl -F "${COMP_WORDS[COMP_CWORD-2]}" 2>/dev/null)
        comps=${field_vals[*]}
    else
        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[LIST]} ${VERBS[DUMP]}; then
            comps=''
        fi
    fi

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

complete -F _coredumpctl coredumpctl
