# systemd-resolve(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_interfaces(){
    local name
    for name in $(cd /sys/class/net && command ls); do
        [[ "$name" != "lo" ]] && echo "$name"
    done
}

_systemd-resolve() {
    local i comps
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local -A OPTS=(
        [STANDALONE]='-h --help --version --no-pager -4 -6
                      --service --openpgp --tlsa --status --statistics
                      --reset-statistics --service-address=no --service-txt=no
                      --cname=no --search=no --legend=no --flush-caches
                      --reset-server-features --revert'
        [ARG]='-i --interface -p --protocol -t --type -c --class --raw
                      --set-dns --set-domain --set-llmnr --set-mdns --set-dnssec --set-nta'
    )

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --interface|-i)
                comps=$( __get_interfaces )
                ;;
            --protocol|-p|--type|-t|--class|-c)
                comps=$( systemd-resolve --legend=no "$prev" help; echo help )
                ;;
            --raw)
                comps="payload packet"
                ;;
            --set-dns|--set-domain|--set-nta)
                comps=""
                ;;
            --set-llmnr|--set-mdns)
                comps="yes no resolve"
                ;;
            --set-dnssec)
                comps="yes no allow-downgrade"
                ;;
            --set-dnsovertls)
                comps="yes no opportunistic"
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

complete -F _systemd-resolve systemd-resolve
