# shellcheck shell=dash disable=SC2034

___x_cmd log init chat

# ___X_CMD_CHAT_TMP="$___X_CMD_ROOT_TMP/chat"
# x mkdirp "$___X_CMD_CHAT_TMP"

___X_CMD_CHAT_SESSION_DIR="$___X_CMD_ROOT_DATA/chat/session"

xrc:mod:lib chat    util cfg request/_index file minion/_index session/_index exec/_index provider wctoken

if ___x_cmd_is_suitable_advise_env; then
    xrc:mod:lib chat    advise
fi

# Stage 1:
# x chat cfg apikey=XXXX proxy=localhost:7070
# x chat proxy=localhost:7070
# Running the web service in background.

# Stage 2:
# x chat --md "Tell me how to do"

# Providing the list of file as the json, return me the list of json in the json format.
# , --file=a.txt,b.txt,c.txt /en
# , --send
# , --convert

___x_cmd_chat___main(){
     local X_help_cmd=; X_help_cmd='___x_cmd help -m chat' help:arg-null:parse

    local ___X_CMD_CHAT_LOCAL_CONFIG="${___X_CMD_CHAT_LOCAL_CONFIG}"
    local ___X_CMD_CHAT_LOCAL_PROFILE="${___X_CMD_CHAT_LOCAL_PROFILE}"
    # local ___X_CMD_CHAT_OUTPUT=""

    local ___X_CMD_CHAT_CFG_DATA_CURRENT_history="$___X_CMD_CHAT_CFG_DATA_CURRENT_history"
    # local ___X_CMD_CHAT_CFG_DATA_CURRENT_maxtoken="$___X_CMD_CHAT_CFG_DATA_CURRENT_maxtoken"
    local ___X_CMD_CHAT_SEND_IN_FILE_LIST=

    local ___X_CMD_CHAT_CONFIRM_BEFORE_SEND="$___X_CMD_CHAT_CONFIRM_BEFORE_SEND"

    while [ $# -gt 0 ]; do
        local op="$1";          shift
        case "$op" in
            session)            ___x_cmd_chat_session "$@"; return ;;
            # --raw)              ___X_CMD_CHAT_OUTPUT=${op#--} ;; # Output the response data in json format or yml format, default output the data in text format
            :*:*)
                                ___X_CMD_CHAT_LOCAL_CONFIG="${op#:}"
                                ___X_CMD_CHAT_LOCAL_CONFIG="${___X_CMD_CHAT_LOCAL_CONFIG%%:*}"
                                ___X_CMD_CHAT_LOCAL_PROFILE="${op#:"$___X_CMD_CHAT_LOCAL_CONFIG":}"
                                ;;
            :*)                 ___X_CMD_CHAT_LOCAL_PROFILE="${op#:}" ;;

            --profile)          ___X_CMD_CHAT_LOCAL_PROFILE="$1";               shift ;;
            --config)           ___X_CMD_CHAT_LOCAL_CONFIG="$1";                shift ;;

            # --request)          ___x_cmd_chat_send "$@"; return ;;

            --jqu)              ___x_cmd_chat_jqu "$@"; return ;;

            -c|--confirm-before-send)
                                ___X_CMD_CHAT_CONFIRM_BEFORE_SEND=1 ;;

            -n)                 ___X_CMD_CHAT_CFG_DATA_CURRENT_history="${1}";  shift ;;
            # --maxtoken)         ___X_CMD_CHAT_CFG_DATA_CURRENT_maxtoken="${1}"; shift ;;


            # x chat proxy=localhost:7070
            # x chat proxy=socks5://localhost:7070
            *=*)                ___x_cmd_chat_cur "$op" "$@";           return ;;
            --cfg|--cur|--init|init|--minion)
                                ___x_cmd_chat_"${op#--}" "$@";          return ;;
            --wrap_|--wrap|--wctoken_|--wctoken)
                                ___x_cmd_chat___"${op#--}" "$@";        return ;;


            *)                  ___x_cmd_chat_main___other "$op" "$@";  return ;;
        esac
    done
}

___x_cmd_chat___sendalias(){
    local ___X_CMD_CHAT_NORMAL_ALIAS="$1";   shift
    ___x_cmd_chat_send "$@"
}

___x_cmd_chat___setalias(){
    local modname="$1"
    local aliasname="$2"
    local category="${3:-"$modname"}"
    ___x_cmd shortcut enable --by category "$category" \
        --set --status enable --platform all --x-cmd "chat --sendalias $aliasname" --category "$category" --advise "x-advise://chat/data/exec.jso" "a:$aliasname"
}

___x_cmd_chat_main___other(){
    local op="$1";  shift
    case "$op" in
        --send|--request)
                    ___x_cmd_chat_send "$@" ;;

        --sendalias|--setalias)
                    ___x_cmd_chat___"${op#--}" "$@"  ;;

        --exec)     ___x_cmd_chat___exec "$@" ;;
        --exec-raw) ___x_cmd_chat___exec_raw "$@" ;;
        --repl-history)
                    ___x_cmd_chat___exec_repl_history "$@" ;;
        --repl-fzdata)
                    ___x_cmd_chat___exec_repl_fzdata "$@" ;;
        # TODO: In the future add stdin support.
        --convert)
            ___X_CMD_CHAT_SEND_IN_FILE_LIST="$___X_CMD_CHAT_SEND_IN_FILE_LIST,$2"; shift 2 ;;

        --*)
            ___x_cmd_chat_main___other__ "${op#--}" "$@"
            ;;
        *)
            ___x_cmd_chat_send "$op" "$@"
            # N=chat M="Unknown subcmd ==> $op" log:ret:64
    esac
}

___x_cmd_chat_main___other__(){
    local op="$1";  shift
    case "$op" in
        json|yml|csv|\
        fjs|fjp)
                                "___x_cmd_chat_${op}"      "$@" ;;
        *)                      N=chat M="Unknown subcmd ==> $op" log:ret:64 ;;
    esac
}

___x_cmd_chat___default(){
    local cur_provider=;
    local cur_model=;
    ___x_cmd_chat_cur \
        cur_provider:=provider cur_model:=model 2>/dev/null

    ___x_cmd "${cur_provider:-gemini}" chat --model "${cur_model}" "$@"
    # x "${cur_provider:-gemini}" chat "$@"
}

___x_cmd_chat___setdefault(){
    local mod=""
    local model=""
    # using config to set default mod and model
}

___x_cmd_chat___continue(){
    :
}

# alias @gpt='x openai chat'
# alias @gpt3='x openai chat --model gpt3'
# alias @gpt4='x openai chat --model gpt4'

# set alias
# alias @='x chat --default'
# alias @@='x chat --continue'
