# shellcheck shell=dash

___x_cmd_chat_provider(){
    local op="$1"
    case "$op" in
        pick_|get_|get|ls)  shift; ___x_cmd_chat_provider_"$op" "$@" ;;
        *)      N=chat M="Not support such [subcmd=$op]" log:ret:64 ;;
    esac
}

___x_cmd_chat_provider_pick_(){
    x_=
    local apikey=; local token=
    while [ $# -gt 0 ]; do
        ___x_cmd_chat_provider___validate "$1" || return $?

        if ___x_cmd_chat_provider___validate_local "$1"; then
            if ! ___x_cmd "$1" --hascmd 2>/dev/null >&2; then
                return 1
            else
                x_="$1"
                return 0
            fi
        else
            # if not empty, then use it
            apikey=""; token=""
            ___x_cmd "$1" --cfg --current apikey:= token:= 2>/dev/null

            if [ -n "${apikey}${token}" ]; then
                x_="$1"
                return 0
            fi
        fi
        shift
    done
    return 1
}

___x_cmd_chat_provider_get(){
    local x_=; ___x_cmd_chat_provider_get_ "$@" || return $?
    printf "%s\n" "$x_"
}

___x_cmd_chat_provider_get_(){
    x_=""
    local cur_provider="$1"
    ___x_cmd_chat_cur cur_provider:=provider 2>/dev/null
    cur_provider="${cur_provider:-gemini}"
    ___x_cmd_chat_provider_pick_ "$cur_provider" gemini openai moonshot mistral gh deepseek grok siliconflow openrouter ollama llmf lms || {
        chat:info "Automatically redirect to use [provider=${cur_provider}] for response requests"
        x_="$cur_provider"
    }
}

___x_cmd_chat_provider_ls(){
    printf "%s\n" openai gemini mistral deepseek grok gh moonshot zhipu siliconflow openrouter ollama llmf lms
}

___x_cmd_chat_provider___validate(){
    local provider="$1"
    case "$provider" in
        openai|gemini|mistral|deepseek|grok|gh|moonshot|zhipu|siliconflow|openrouter|ollama|llmf|lms) ;;
        *)
            N=chat M="Provider must be [openai|gemini|mistral|deepseek|grok|gh|moonshot|zhipu|siliconflow|openrouter|ollama|llmf|lms]" log:ret:64
            ;;
    esac
}

___x_cmd_chat_provider___validate_local(){
    local provider="$1"
    case "$provider" in
        ollama|llmf|lms)    return 0  ;;
        *)                  return 1  ;;
    esac
}
