# shellcheck shell=sh disable=SC3043

# Section: select app
# TODO: Use awk to replace
___x_cmd_ui_select_draw(){
    local select="$1"
    local text="$2"
    local prompt="$3"; shift 3
    {
        local l=0
        local arg
        printf "\0337"
        printf "\033[1m%s\033[0m\n" "$prompt"
        for arg in "$@"; do
            arg="$(printf "%s\n" "$arg" | ___x_cmd_cmds_awk '{
                gsub(/\033\[([0-9]+;)*[0-9]+m/, "", $0)
                print $0
            }')"
            l=$((l+1))
            if [ -n "$select" ] && [ "$l" -eq "$select" ]; then
                printf "  $l. \033[7m%s\033[0m\n" "$arg"
            else
                printf "  $l. \033[${___X_CMD_THEME_COLOR_CODE}m%s\033[0m\n" "$arg"
            fi
        done
        printf "Input number: %s\033[${___X_CMD_THEME_COLOR_CODE};7;5m \033[0m\n" "$text"
        printf "\n\033[2m%s\033[0m" "Use arrow up/down to select. Press ENTER to confirm."
    } | ___x_cmd_ui_region_send
}

___x_cmd_ui_select_mainloop(){
    local default_choice="$1"; shift
    local choice="$((default_choice+0))"
    local choice_text="$default_choice"
    local question="$1"; shift
    trap "___x_cmd_ui_region___run_clear; exit 130" INT
    ___x_cmd_ui_select_draw "$choice" "$choice_text" "$question" "$@" || return
    while ___x_cmd_ui_getchar || return 130; do
        case "${___X_CMD_UI_GETCHAR_CHAR}" in
            UP|k)                   ___x_cmd_ui_varctl_numtext choice choice_text 1 "$#" dec ;;
            DN|j)                   ___x_cmd_ui_varctl_numtext choice choice_text 1 "$#" inc ;;
            ENTER)                  break ;;
            DELETE)                 ___x_cmd_ui_varctl_numtext choice choice_text 1 "$#" del ;;
            0|1|2|3|4|5|6|7|8|9)    ___x_cmd_ui_varctl_numtext choice choice_text 1 "$#" "${___X_CMD_UI_GETCHAR_CHAR}" ;;
        esac
        ___x_cmd_ui_select_draw "$choice" "$choice_text" "$question" "$@" || return
    done < "$___X_CMD_DEVTTY_FP"
    # Notice: Meaningless but important.
    ___x_cmd_ui_select_draw "$choice" "$choice_text" "$question" "$@" || return
    ___x_cmd_ui_region_send_env_kv ___X_CMD_UI_SELECT_RET "$choice"
}

___x_cmd_ui_select(){
    ___x_cmd_runmode_allow_manual || N=ui M="UI select can only be used in manual mode" log:ret:1
    local default_choice=1
    case "$1" in
        --default-choice) default_choice="$2"; shift 2 ;;
    esac
    local VAR="$1";  [ $# -eq 0 ] || shift
    local VAR1
    local VAR2
    case "$VAR" in
        ,*)
            VAR1=
            VAR2="${VAR#,}"
            ;;
        *,*)
            VAR1="${VAR%,*}"
            VAR2="${VAR#*,}"
            ;;
        *)
            VAR1="$VAR"
            VAR2=
            ;;
    esac

    [ -z "$VAR1" ] || eval "$VAR1"=
    [ -z "$VAR2" ] || eval "$VAR2"=

    local ___X_CMD_UI_SELECT_RET=0

    ___X_CMD_SHBIN_CODE='
        xrc ui
        xrc:mod:lib     ui  select
        '"$___X_CMD_UI_SHBIN_CODE"'
        "$@"
    ' ___x_cmd_ui_region_run ___x_cmd_ui_select_mainloop "$((default_choice+0))" "$@"

    shift

    [ "$___X_CMD_UI_SELECT_RET" != 0 ] || return 130

    [ -z "$VAR1" ] || eval "$VAR1"="$___X_CMD_UI_SELECT_RET"
    [ -z "$VAR2" ] || eval "$VAR2"="\${$___X_CMD_UI_SELECT_RET}"
}

# EndSection

# ui choice "text"\
# ui sel "text"\
# ___x_cmd_ui_select idx,text\
#     "Please select the app you want to install:" \
#     "Install docker" \
#     "Install k8s" \
#     "Install minikube" \
#     "Install jvm" \
#     "Install nvm"

# ui select ,text "Please select the app you want to install:"  "Install docker"  "Install k8s"


# Section: select_degrade version
___x_cmd_ui_select_degrade(){
    local question="${1:?Question}"
    local answer="${2:?Answer variable}"
    local op="${3:?Must be}"
    if [ "$op" != "=" ]; then
        printf "%s" "#3 be = but get $op" >&2
        return 1
    fi

    shift 3

    printf "\033[31;1m? %s\n" "$question." >&2

    local number

    local can
    local i=1
    for can in "$@"; do
        printf "  \033[33;1m%s:  \033[32;1m%s\n" "$i" "$can" >&2
        i=$((i+1))
    done
    printf "\n"

    while true; do
        # printf "\033[31;1m? %s >\033[34;1m" "Please input number 1 to $#. Or 0 to quit"
        # printf "\033[31;1m%s\033[30;2m%s\r\033[31;0m>" "> " "Please Input number from 1 to $#. Press 0 to quit"
        printf "\033[31;1m%s\033[30;2m%s\r\033[0m\033[34;1m > " ">" "_    Please input number 1 to $#. Or 0 to quit." >&2
        if ! read -r number >&2; then
            printf "%s\n" "Receive exit signal." >&2
            break
        fi

        if [ "$number" -eq 0 ]; then
            printf "\033[0m"
            return 1
        fi 2>/dev/null

        if [ "$number" -ge 1 ] && [ "$number" -le $# ]; then
            eval "$answer=\"\$$number\""
            printf "\033[0m"
            return 0
        fi 2>/dev/null
    done
}

# EndSection


# Return Exit Code: 0(yes), 1(no), 130(interrupted)
___x_cmd_ui_yesno(){
    ___x_cmd_runmode_allow_manual || N=ui M="UI select can only be used in manual mode" log:ret:1
    local reverse=
    case "$1" in
        -r) reverse=1; shift ;;
    esac

    local msg="${1:?Provide msg}"
    local id;
    ___x_cmd_ui_select ${reverse:+--default-choice} ${reverse:+2} id "$msg" Yes No || return
    return "$((id - 1))"
}
