# 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 <http://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'

    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
