# Debian apt-get(8) completion                             -*- shell-script -*-

_apt_get()
{
    local cur prev words cword package
    _init_completion -n ':=' || return

    local special i
    for ((i = 1; i < ${#words[@]} - 1; i++)); do
        if [[ ${words[i]} == @(install|remove|autoremove|purge|source|build-dep|download|changelog) ]]; then
            special=${words[i]}
            break
        fi
    done

    if [[ -v special ]]; then
        case $special in
            remove | autoremove | purge)
                if [[ -f /etc/debian_version ]]; then
                    # Debian system
                    COMPREPLY=($(
                        _xfunc dpkg _comp_dpkg_installed_packages $cur
                    ))
                else
                    # assume RPM based
                    _xfunc rpm _rpm_installed_packages
                fi
                ;;
            source)
                COMPREPLY=($(_xfunc apt-cache _apt_cache_packages)
                $(compgen -W "$(apt-cache dumpavail |
                    awk '$1 == "Source:" { print $2 }' | sort -u)" -- "$cur"))
                ;;
            install)
                if [[ $cur == */* ]]; then
                    _filedir deb
                    return
                elif [[ $cur == *=* ]]; then
                    package="${cur%%=*}"
                    cur="${cur#*=}"
                    COMPREPLY=($(IFS=$'\n' compgen -W "$(
                        apt-cache --no-generate madison "$package" 2>/dev/null |
                            while IFS=' |' read -r _ version _; do
                                echo "$version"
                            done
                    )" \
                        -- "$cur"))
                    __ltrim_colon_completions "$cur"
                    return
                fi
                ;;&
            build-dep)
                _filedir -d
                [[ $cur != */* ]] || return
                ;;&
            *)
                COMPREPLY+=($(_xfunc apt-cache _apt_cache_packages))
                ;;
        esac
        return
    fi

    case $prev in
        --help | --version | --option | -!(-*)[hvo])
            return
            ;;
        --config-file | -!(-*)c)
            _filedir
            return
            ;;
        --target-release | --default-release | -!(-*)t)
            COMPREPLY=($(compgen -W "$(apt-cache policy | command sed -ne \
                's/^ *release.*[ ,]o=\(Debian\|Ubuntu\),a=\(\w*\).*/\2/p')" \
                -- "$cur"))
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '--no-install-recommends --install-suggests
            --download-only --fix-broken --ignore-missing --fix-missing
            --no-download --quiet --simulate --just-print --dry-run --recon
            --no-act --yes --assume-yes --assume-no --no-show-upgraded
            --verbose-versions --host-architecture --build-profiles --compile
            --build --ignore-hold --with-new-pkgs --no-upgrade --only-upgrade
            --allow-downgrades --allow-remove-essential
            --allow-change-held-packages --force-yes --print-uris --purge
            --reinstall --list-cleanup --target-release --default-release
            --trivial-only --no-remove --auto-remove --autoremove --only-source
            --diff-only --dsc-only --tar-only --arch-only --indep-only
            --allow-unauthenticated --no-allow-insecure-repositories
            --allow-releaseinfo-change --show-progress --with-source --help
            --version --config-file --option' -- "$cur"))
    else
        COMPREPLY=($(compgen -W 'update upgrade dist-upgrade
            dselect-upgrade install remove purge source build-dep check
            download clean autoclean autoremove changelog indextargets' \
            -- "$cur"))
    fi

} &&
    complete -F _apt_get apt-get

# ex: filetype=sh
