# shellcheck shell=bash
# shellcheck disable=SC2207  # Standard pattern for bash completions
# Bash completion for Ollama CLI
# Hand-written because ollama does not yet expose a "completion" subcommand.
# TODO: Replace with cached_completion once "ollama completion bash" is available.

command -v ollama &>/dev/null || return

_ollama_models() {
    timeout 2 ollama list 2>/dev/null | awk 'NR>1 {print $1}'
}

_ollama_running_models() {
    timeout 2 ollama ps 2>/dev/null | awk 'NR>1 {print $1}'
}

_OLLAMA_LAUNCH_INTEGRATIONS="claude cline codex droid opencode openclaw clawdbot moltbot pi"

_ollama_completions() {
    local cur prev
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    local commands="serve create show run stop pull push signin signout list ls ps cp rm launch help"
    local global_opts="--help --nowordwrap --verbose --version"

    case "${prev}" in
        run|show|rm|cp|push|--model)
            COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
            return 0
            ;;
        stop)
            COMPREPLY=( $(compgen -W "$(_ollama_running_models)" -- "${cur}") )
            return 0
            ;;
        pull)
            return 0
            ;;
        launch)
            COMPREPLY=( $(compgen -W "${_OLLAMA_LAUNCH_INTEGRATIONS}" -- "${cur}") )
            return 0
            ;;
        help)
            COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
            return 0
            ;;
        --format)
            COMPREPLY=( $(compgen -W "json" -- "${cur}") )
            return 0
            ;;
        --quantize|-q)
            COMPREPLY=( $(compgen -W "q4_0 q4_1 q4_K_S q4_K_M q5_0 q5_1 q5_K_S q5_K_M q8_0" -- "${cur}") )
            return 0
            ;;
        --file|-f)
            COMPREPLY=( $(compgen -f -- "${cur}") )
            return 0
            ;;
    esac

    local subcmd=""
    local i
    for (( i=1; i < COMP_CWORD; i++ )); do
        case "${COMP_WORDS[i]}" in
            run|show|stop|pull|push|cp|rm|create|serve|list|ls|ps|launch|signin|signout|help)
                subcmd="${COMP_WORDS[i]}"
                break
                ;;
        esac
    done

    if [[ "${cur}" == -* ]]; then
        local sub_opts=""
        case "${subcmd}" in
            run)
                sub_opts="--format --insecure --keepalive --nowordwrap --verbose
                    --hidethinking --think --experimental --experimental-websearch
                    --experimental-yolo --dimensions --truncate
                    --width --height --steps --seed --negative"
                ;;
            show)
                sub_opts="--license --modelfile --parameters --system --template --verbose"
                ;;
            pull|push)
                sub_opts="--insecure"
                ;;
            create)
                sub_opts="--file --quantize --experimental"
                ;;
            launch)
                sub_opts="--config --model --yes"
                ;;
        esac
        COMPREPLY=( $(compgen -W "${sub_opts} --help" -- "${cur}") )
        return 0
    fi

    # rm supports multiple model arguments
    if [[ "${subcmd}" == "rm" ]]; then
        COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
        return 0
    fi

    # cp destination (second argument)
    if [[ "${subcmd}" == "cp" && ${COMP_CWORD} -ge 3 ]]; then
        COMPREPLY=( $(compgen -W "$(_ollama_models)" -- "${cur}") )
        return 0
    fi

    if [[ ${COMP_CWORD} -eq 1 ]]; then
        COMPREPLY=( $(compgen -W "${commands} ${global_opts}" -- "${cur}") )
    fi

    return 0
}

complete -F _ollama_completions ollama
