# Debian apt-cache(8) completion

# List APT binary packages
# @since 2.12
_comp_xfunc_apt_cache_compgen_packages()
{
    _comp_cmd_apt_cache__compgen_packages apt-cache
}

# List APT binary packages
# @param $1  Name of executable
_comp_cmd_apt_cache__compgen_packages()
{
    _comp_compgen_split -- "$("$1" --no-generate pkgnames "$cur" 2>/dev/null)"
}

# List APT source packages
# @since 2.12
_comp_xfunc_apt_cache_compgen_sources()
{
    _comp_cmd_apt_cache__compgen_sources apt-cache
}

# List APT source packages
# @param $1  Name of executable
_comp_cmd_apt_cache__compgen_sources()
{
    _comp_compgen_split -- "$("$1" dumpavail |
        _comp_awk '$1 == "Source:" { print $2 }' | sort -u)"
}

# List APT binary packages
# @deprecated 2.12
_apt_cache_packages()
{
    local packages
    _comp_compgen -v packages -i apt-cache packages apt-cache &&
        printf '%s\n' "${packages[@]}"
}

# List APT source packages
# @deprecated 2.12
_apt_cache_sources()
{
    local sources
    _comp_compgen -v sources -c "$1" -i apt-cache sources apt-cache &&
        printf '%s\n' "${sources[@]}"
}

# List APT source packages
# @deprecated 2.12
_apt_cache_src_packages()
{
    local sources
    _comp_compgen -v sources -i apt-cache sources apt-cache &&
        printf '%s\n' "${sources[@]}"
}

_comp_cmd_apt_cache()
{
    local cur prev words cword comp_args
    _comp_initialize -- "$@" || return

    local special="" ispecial
    if [[ $cur != show ]]; then
        for ((ispecial = 1; ispecial < ${#words[@]}; ispecial++)); do
            if [[ ${words[ispecial]} == @(add|depends|dotty|madison|policy|rdepends|show?(pkg|src|)) ]]; then
                special=${words[ispecial]}
                break
            fi
        done
    fi

    if [[ $special && $ispecial -lt $cword ]]; then
        case $special in
            add)
                _comp_compgen_filedir
                ;;

            showsrc)
                _comp_cmd_apt_cache__compgen_sources "$1"
                ;;

            *)
                _comp_cmd_apt_cache__compgen_packages "$1"
                ;;

        esac
        return
    fi

    local noargopts='!(-*|*[cps]*)'
    # shellcheck disable=SC2254
    case $prev in
        --config-file | --pkg-cache | --src-cache | -${noargopts}[cps])
            _comp_compgen_filedir
            return
            ;;
        --with-source)
            _comp_compgen_filedir '@(deb|dsc|changes)'
            _comp_compgen -a -- -f -o plusdirs -X '!?(*/)@(Sources|Packages)'
            return
            ;;
        search)
            if [[ $cur != -* ]]; then
                return
            fi
            ;;
    esac

    if [[ $cur == -* ]]; then
        _comp_compgen -- -W '--pkg-cache --src-cache --quiet --important
            --no-pre-depends --no-depends --no-recommends --no-suggests
            --no-conflicts --no-breaks --no-replaces --no-enhances --implicit
            --full --all-versions --no-all-versions --generate --no-generate
            --names-only --all-names --recurse --installed --with-source
            --help --version --audit --config-file --option --cli-version
            --no-color --color'
    elif [[ ! $special ]]; then
        _comp_compgen -- -W 'gencaches showpkg stats showsrc dump dumpavail
            unmet show search depends rdepends pkgnames dotty xvcg policy
            madison'
    fi

} &&
    complete -F _comp_cmd_apt_cache apt-cache
