# shellcheck shell=dash


# TODO: x-minimax-2.5, x-glm5, x-glm4.7, x-kimi-2.5, x-gpt, x-gemini, x-hub
___x_cmd_agent_init(){
    while [ "$#" -gt 0 ]; do
        case "$1" in
            -h|--help) ___x_cmd help -m agent init; return ;;
            *) ;;
        esac
    done

    agent:info "Initializing agent configuration"
    local cur_zero_harness=""
    if ___x_cmd_agent_harness_; then
        cur_zero_harness="$x_"
        agent:info "Current default harness: $cur_zero_harness"
        case "$cur_zero_harness" in
            claude*) ___x_cmd_agent_init___default_claude_ || return $? ;;
            *)       ___x_cmd_agent_init___default_other_ || return $? ;;
        esac
    else
        ___x_cmd_agent_init___default_claude_ || return $?
    fi

    local default_harness="$x_"
    [ -n "$default_harness" ] || {
        agent:error "No harness was selected"
        return 1
    }

    agent:info "Saving default harness as $default_harness"
    ___x_cmd_agent_cfg --set zero_harness="$default_harness" || return $?
    agent:info "Default harness set to $default_harness"
}

___x_cmd_agent_init___default_claude_(){
    local default_harness=""
    while :; do
        agent:info "Selecting a Claude model provider"

        default_harness="$( ___x_cmd pick --ask "Select a Claude model provider" --datafile "$___X_CMD_ROOT_MOD/agent/lib/data/claude_provider_$___X_CMD_LANG" )"
        [ -n "$default_harness" ] || {
            agent:error "No Claude provider selected"
            return 1
        }
        case "$default_harness" in
            claude*)  ;;
            *)      ___x_cmd_agent_init___default_other_; return $? ;;
        esac

        default_harness="${default_harness%% *}"
        agent:info "Selected Claude provider: $default_harness"
        if ___x_cmd_agent_init___check_harness "$default_harness"; then
            x_="$default_harness"
            break
        else
            local choice=""
            ___x_cmd ui select choice "$default_harness login failed. What would you like to do?" \
                "Go back and select another option" \
                "Cancel initialization" || return $?

            case "$choice" in
                1) continue ;;
                *) return 1 ;;
            esac
        fi
    done
}

___x_cmd_agent_init___default_other_(){
    local default_harness=""
    while :; do

        agent:info "Selecting an agent tool"

        default_harness="$( ___x_cmd pick --ask "Select an agent tool" --datafile "$___X_CMD_ROOT_MOD/agent/lib/data/agent_tool_$___X_CMD_LANG" )"
        [ -n "$default_harness" ] || {
            agent:error "No agent tool selected"
            return 1
        }

        case "$default_harness" in
            claude*) ___x_cmd_agent_init___default_claude_ ; return $? ;;
            *) ;;
        esac

        default_harness="${default_harness%% *}"
        agent:info "Selected agent tool: $default_harness"

        if ___x_cmd_agent_init___check_harness "$default_harness"; then
            x_="$default_harness"
            break
        else
            local choice=""
            ___x_cmd ui select choice "$default_harness login failed. What would you like to do?" \
                "Go back and select another option" \
                "Cancel initialization" || return $?

            case "$choice" in
                1) continue ;;
                *) return 1 ;;
            esac
        fi
    done
}

___x_cmd_agent_init___check_harness(){
    local default_harness="$1"
    agent:info "Checking harness status: $default_harness"

    local style_warn style_error style_end
    style_warn="$(___x_cmd ui style yellow)"
    style_error="$(___x_cmd ui style red)"
    style_end="$(___x_cmd ui style end)"

    case "$default_harness" in
        claude)
            local loggedIn=; loggedIn="$( ___x_cmd claude -- auth status | ___x_cmd jo .loggedIn )"
            if [ "$loggedIn" != "true" ]; then
                agent:warn "Claude is not logged in"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Claude: You are not logged in."
                printf >&2 "%s\n" "  Would you like to log in now?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Log in to Claude now?" || return $?
                agent:info "Logging in to Claude..."
                ___x_cmd claude auth login || {
                    agent:error "Claude login failed"
                    return 1
                }
            fi
            ;;
        claude-*)
            local subcmd="${default_harness#claude-}"
            local loggedIn=; loggedIn="$( ___x_cmd claude "$subcmd" auth status | ___x_cmd jo .loggedIn )"
            if [ "$loggedIn" != "true" ]; then
                agent:warn "Claude-$subcmd is not logged in or API key is not configured"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "${style_error}%s${style_end}\n" "  Failed to configure Claude for '$subcmd'."
                printf >&2 "%s\n" "  Please check your API key setup."
                return 1
            fi
            ;;
        codex)
            ___x_cmd hascmd codex || ___x_cmd env use codex || return $?
            if [ "$( ___x_cmd codex -- login status 2>&1 )" = "Not logged in" ]; then
                agent:warn "Codex is not logged in"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Codex: You are not logged in."
                printf >&2 "%s\n" "  Would you like to log in now?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Log in to Codex now?" || return $?
                agent:info "Logging in to Codex..."
                ___x_cmd codex login || {
                    agent:error "Codex login failed"
                    return 1
                }
            fi
            ;;
        cursor)
            ___x_cmd hascmd cursor || ___x_cmd hascmd agent || {
                agent:warn "Cursor Agent is not installed"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Cursor Agent is not installed."
                printf >&2 "%s\n" "  Would you like me to install it for you?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Install Cursor Agent now?" || return $?
                agent:info "Installing Cursor Agent..."
                ___x_cmd install --cat cursor || return $?
                ___x_cmd install cursor || {
                    agent:error "Failed to install Cursor Agent"
                    return 1
                }
                agent:info "Cursor Agent installed successfully"
            }

            if [ "$( ___x_cmd_agent_request___cursor_runcmd status --format json | ___x_cmd jo .isAuthenticated )" != "true" ]; then
                agent:warn "Cursor is not logged in"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Cursor: You are not logged in."
                printf >&2 "%s\n" "  Would you like to authenticate now?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Log in to Cursor now?" || return $?
                agent:info "Logging in to Cursor..."
                ___x_cmd_agent_request___cursor_runcmd login || {
                    agent:error "Cursor login failed"
                    return 1
                }
            fi
            ;;
        gemini-cli)
            ___x_cmd hascmd gemini || {
                agent:warn "Gemini CLI is not installed"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Gemini CLI is not installed."
                printf >&2 "%s\n" "  Would you like me to install it for you?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Install Gemini CLI now?" || return $?
                agent:info "Installing Gemini CLI..."
                ___x_cmd env use gemini-cli  || {
                    agent:error "Failed to install Gemini CLI"
                    return 1
                }
                agent:info "Gemini CLI installed successfully"
            }
            [ -n "$GEMINI_API_KEY" ] || ___x_cmd gemini --has-apikey || {
                agent:warn "Gemini API key is not configured"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Gemini: API key is not configured."
                printf >&2 "%s\n" "  Let's set it up interactively."
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Configure Gemini API key now?" || return $?
                agent:info "Setting up Gemini..."
                ___x_cmd gemini init || {
                    agent:error "Gemini setup failed"
                    return 1
                }
            }
            ;;
        opencode)
            ___x_cmd hascmd opencode || {
                agent:warn "Opencode is not installed"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Opencode is not installed."
                printf >&2 "%s\n" "  Would you like me to install it for you?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Install Opencode now?" || return $?
                agent:info "Installing Opencode..."
                ___x_cmd env use opencode || {
                    agent:error "Failed to install Opencode"
                    return 1
                }
                agent:info "Opencode installed successfully"
            }

            [ -f "$HOME/.local/share/opencode/auth.json" ] || {
                agent:warn "Opencode is not authenticated"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Opencode: You are not authenticated."
                printf >&2 "%s\n" "  Let's log you in."
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Log in to Opencode now?" || return $?
                agent:info "Logging in to Opencode..."
                ___x_cmd opencode auth login || {
                    agent:error "Opencode login failed"
                    return 1
                }
            }
            ;;
        kimi-cli)
            ___x_cmd hascmd kimi-cli || {
                agent:warn "Kimi CLI is not installed"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Kimi CLI is not installed."
                printf >&2 "%s\n" "  Would you like me to install it for you?"
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Install Kimi CLI now?" || return $?
                agent:info "Installing Kimi CLI..."
                ___x_cmd kimi --install || {
                    agent:error "Failed to install Kimi CLI"
                    return 1
                }
                agent:info "Kimi CLI installed successfully"
            }

            [ -f "$HOME/.kimi/config.toml" ] || {
                agent:warn "Kimi CLI is not logged in"
                ___x_cmd_runmode_allow_manual || return 1
                printf >&2 "%s\n" ""
                printf >&2 "${style_warn}%s${style_end}\n" "  Kimi CLI: You are not logged in."
                printf >&2 "%s\n" "  Let's get you authenticated."
                printf >&2 "%s\n" ""
                ___x_cmd ui yesno "Log in to Kimi CLI now?" || return $?
                agent:info "Logging in to Kimi CLI..."
                ___x_cmd kimi-cli login || {
                    agent:error "Kimi CLI login failed"
                    return 1
                }
            }
            ;;
        *)
            agent:info "Harness '$default_harness' does not require automatic setup"
            ;;
    esac

    agent:info "Harness check completed: $default_harness"
}
