# bash completion for mkhint
# Install: sudo cp mkhint.bash-completion /etc/bash-completion.d/mkhint

_mkhintfile_completions() {
    local cur prev repo_dir hint_dir mkhint_config
    _init_completion || return

    repo_dir="/var/lib/sbopkg/SBo-danix"
    hint_dir="/etc/slackrepo/SBo-danix/hintfiles"
    mkhint_config="$HOME/.config/mkhint/config"
    # shellcheck disable=SC1090
    [[ -f "$mkhint_config" ]] && source "$mkhint_config"
    repo_dir="${REPO_DIR:-$repo_dir}"
    hint_dir="${HINT_DIR:-$hint_dir}"
    repo_dir="${repo_dir%/}"; hint_dir="${hint_dir%/}"

    local all_flags="--version -v --set-version -V --hintfile -f --new -n --list -l --review -R --clean -c --check -C --fix-current -F --delete -d --no-dl -N --force --help -h"

    # -R/--review and -l/--list take any number of hint names; complete them repeatedly.
    local w in_review=""
    for w in "${COMP_WORDS[@]:1}"; do
        [[ "$w" == "-R" || "$w" == "--review" || "$w" == "-l" || "$w" == "--list" ]] && in_review=1
    done
    if [[ -n "$in_review" && "$cur" != -* ]]; then
        local -a rwords=()
        for f in "$hint_dir"/*.hint; do
            [[ -f "$f" ]] && rwords+=("$(basename "${f%.hint}")")
        done
        COMPREPLY=($(compgen -W "${rwords[*]}" -- "$cur"))
        return
    fi

    case "$prev" in
        --new|-n)
            local -a words=()
            while IFS= read -r f; do
                words+=("$(basename "${f%.info}")")
            done < <(find "$repo_dir" -mindepth 2 -maxdepth 2 -name "*.info" 2>/dev/null)
            COMPREPLY=($(compgen -W "${words[*]}" -- "$cur"))
            ;;
        --hintfile|-f|--delete|-d|--check|-C)
            local -a words=()
            for f in "$hint_dir"/*.hint; do
                [[ -f "$f" ]] && words+=("$(basename "${f%.hint}")")
            done
            COMPREPLY=($(compgen -W "${words[*]}" -- "$cur"))
            ;;
        --set-version|-V)
            local pkg="" i
            for (( i=1; i<${#COMP_WORDS[@]}-1; i++ )); do
                if [[ "${COMP_WORDS[i]}" == "--hintfile" || "${COMP_WORDS[i]}" == "-f" ]]; then
                    pkg="${COMP_WORDS[i+1]}"
                    break
                fi
            done
            if [[ -n "$pkg" ]]; then
                local hint_file="$hint_dir/${pkg}.hint"
                if [[ -f "$hint_file" ]]; then
                    local ver
                    ver=$(grep -m1 '^VERSION=' "$hint_file" | cut -d= -f2 | tr -d '"')
                    [[ -n "$ver" ]] && COMPREPLY=($(compgen -W "$ver" -- "$cur"))
                fi
            fi
            ;;
        *)
            COMPREPLY=($(compgen -W "$all_flags" -- "$cur"))
            ;;
    esac
}

complete -F _mkhintfile_completions mkhint.sh mkhint
