# shellcheck shell=dash disable=2317

___x_cmd_pick___main(){
    # if [ -z "$___X_CMD_PICK_ANTI_ZSH" ] && [ "$___X_CMD_SHELL" = zsh ]; then
    #     ___X_CMD_ROOT_CODE="$___X_CMD_ROOT_CODE" \
    #     ___X_CMD_PICK_ANTI_ZSH=1 \
    #     /bin/zsh --no-rcs "$___X_CMD_ROOT_MOD/pick/lib/main.sh" "$@"
    # #     /bin/sh "$___X_CMD_ROOT_MOD/pick/lib/main.sh" "$@"
    # else
    #     ___x_cmd_pick_app "$@"
    # fi
    ___x_cmd_pick_app "$@"
}

___x_cmd_pick_app(){
    local ___X_CMD_PICK_DATA="$___X_CMD_PICK_DATA"
    local ___X_CMD_PICK_SELECT_TITLE="${___X_CMD_PICK_SELECT_TITLE:-"Select..."}"
    local ___X_CMD_PICK_ROW="${___X_CMD_PICK_ROW:-10}"
    local ___X_CMD_PICK_COL="${___X_CMD_PICK_COL:-1}"
    local ___X_CMD_PICK_WIDTH="${___X_CMD_PICK_WIDTH:-"-"}"
    local ___X_CMD_PICK_LIMIT="${___X_CMD_PICK_LIMIT:-1}"
    local ___X_CMD_PICK_CONTINUE_NAME="${___X_CMD_PICK_CONTINUE_NAME}"
    local ___X_CMD_PICK_DATAFILE=""
    local ___X_CMD_PICK_CTRL_C_CLEAR=
    local ___X_CMD_PICK_HOOK_BEGIN=""
    local ___X_CMD_PICK_HOOK_END=___x_cmd_pick_app___hook_end

    while [ $# -gt 0 ]; do
        case "$1" in
            -b|--begin) ___X_CMD_PICK_HOOK_BEGIN="$2"
                        [ -n "$___X_CMD_PICK_HOOK_BEGIN" ] || N=pick M="Provide pick hook begin function name" log:ret:64
                        shift 2 ;;
            -e|--end)   ___X_CMD_PICK_HOOK_END="$2"
                        [ -n "$___X_CMD_PICK_HOOK_END" ] || N=pick M="Provide pick hook end function name" log:ret:64
                        shift 2 ;;
            --ask)      ___X_CMD_PICK_SELECT_TITLE="$2"
                        [ -n "$___X_CMD_PICK_SELECT_TITLE" ] || N=pick M="Provide select title" log:ret:64
                        shift 2 ;;
            --row)      ___X_CMD_PICK_ROW="$2"
                        [ -n "$___X_CMD_PICK_ROW" ] || N=pick M="Provide row" log:ret:64
                        shift 2 ;;
            --col)      ___X_CMD_PICK_COL="$2"
                        [ -n "$___X_CMD_PICK_COL" ] || N=pick M="Provide col" log:ret:64
                        shift 2 ;;
            --width)    ___X_CMD_PICK_WIDTH="$2"
                        [ -n "$___X_CMD_PICK_WIDTH" ] || N=pick M="Provide item width" log:ret:64
                        shift 2 ;;
            --limit)    ___X_CMD_PICK_LIMIT="$2"
                        [ -n "$___X_CMD_PICK_LIMIT" ] || N=pick M="Provide maximum number of options to pick" log:ret:64
                        shift 2 ;;
            --continue) ___X_CMD_PICK_CONTINUE_NAME="$2"
                        [ -n "$___X_CMD_PICK_CONTINUE_NAME" ] || N=pick M="Provide the pick app name" log:ret:64
                        shift 2 ;;

            --datafile) ___X_CMD_PICK_DATAFILE="$2"
                        [ -n "$___X_CMD_PICK_DATAFILE" ] || N=pick M="Provide datafile to pick" log:ret:64
                        shift 2 ;;
            --ctrl-c-clear)
                        ___X_CMD_PICK_CTRL_C_CLEAR=1; shift ;;
            --ctrl-c-keep)
                        ___X_CMD_PICK_CTRL_C_CLEAR=; shift ;;
            --)         shift; break ;;
            --*)        N=pick M="Not support [option=$1]" log:ret:64 ;;
            *)          break
        esac
    done

    [ "$___X_CMD_SHELL" = zsh ] || {
        ___x_cmd_pick_app___run_ "$@"
        return
    }

    local x_=; ___x_cmd storerat_ ___x_cmd_pick_app___run_ "$@" || return
    printf "%s\n" "$x_"
}

___x_cmd_pick_app___run_(){
    ___X_CMD_PICK_DATA="$___X_CMD_PICK_DATA" \
    ___X_CMD_PICK_SELECT_TITLE="$___X_CMD_PICK_SELECT_TITLE" \
    ___X_CMD_PICK_ROW="$___X_CMD_PICK_ROW" \
    ___X_CMD_PICK_COL="$___X_CMD_PICK_COL" \
    ___X_CMD_PICK_WIDTH="$___X_CMD_PICK_WIDTH" \
    ___X_CMD_PICK_LIMIT="$___X_CMD_PICK_LIMIT" \
    ___X_CMD_PICK_CONTINUE_NAME="$___X_CMD_PICK_CONTINUE_NAME" \
    ___X_CMD_PICK_DATAFILE="$___X_CMD_PICK_DATAFILE" \
    ___X_CMD_PICK_CTRL_C_CLEAR="$___X_CMD_PICK_CTRL_C_CLEAR" \
    ___X_CMD_PICK_HOOK_BEGIN="$___X_CMD_PICK_HOOK_BEGIN" \
    ___X_CMD_PICK_HOOK_END="$___X_CMD_PICK_HOOK_END" \
    ___X_CMD_SHBIN_CODE='
        xrc pick ;
        '"$___X_CMD_PICK_SHBIN_CODE"'
        "$@"
    ' ___x_cmd antizshbin ___x_cmd_pick_app___run "$@"
}

___x_cmd_pick_app___run(){(
    trap '' EXIT

    local ___X_CMD_PICK_DATA___APP_PROCESSER="$___X_CMD_PICK_DATA"
    if [ -z "${___X_CMD_PICK_DATAFILE}${___X_CMD_PICK_DATA___APP_PROCESSER}" ]; then
        [ "$#" -gt 0 ] || {
            if [ -t 0 ]; then   ___x_cmd help -m pick >&2; return 1
            else                set - ___x_cmd_cmds_cat
            fi
        }
        ___X_CMD_PICK_DATA___APP_PROCESSER="$("$@" | ___x_cmd_cmds tr -d '\0' 2>/dev/null)" || return
        [ -n "$___X_CMD_PICK_DATA___APP_PROCESSER" ] || M="The data is empty" N=pick log:ret:1
    fi

    local ___X_CMD_TUI_PICK_POSITION=
    [ -z "$___X_CMD_PICK_CONTINUE_NAME" ] || {
        x_=; ___x_cmd tui position get_ "pick_${___X_CMD_PICK_CONTINUE_NAME}"
        ___X_CMD_TUI_PICK_POSITION="$x_"
    }

    local ___X_CMD_TUI_CURRENT_PICK_POSITION=
    local ___X_CMD_PICK_SELECTED_ITEM=; local ___X_CMD_PICK_TMP_EXITCODE=0; local ___X_CMD_TUI_APP_IS_SMALL_SCREEN=;

    ___x_cmd_tui_app_processer(){
        if [ -f "$___X_CMD_PICK_DATAFILE" ]; then
            ___x_cmd_cmds cat "$___X_CMD_PICK_DATAFILE"
        else
            printf "%s\n" "$___X_CMD_PICK_DATA___APP_PROCESSER"
        fi
    }

    </dev/tty \
    ___X_CMD_TUI_PICK_POSITION="$___X_CMD_TUI_PICK_POSITION" \
    ___x_cmd tui bigapp --clear-on-exit \
        ${___X_CMD_PICK_CTRL_C_CLEAR:+"--clear-on-ctrl-c"} \
        ${___X_CMD_PICK_HOOK_BEGIN:+"--begin"}   ${___X_CMD_PICK_HOOK_BEGIN:+"$___X_CMD_PICK_HOOK_BEGIN"} \
        ${___X_CMD_PICK_HOOK_END:+"--end"}       ${___X_CMD_PICK_HOOK_END:+"$___X_CMD_PICK_HOOK_END"} \
        -v PICK_SELECT_TITLE="$___X_CMD_PICK_SELECT_TITLE" \
        -v PICK_ROW="$___X_CMD_PICK_ROW" \
        -v PICK_COL="$___X_CMD_PICK_COL" \
        -v PICK_LIMIT="$___X_CMD_PICK_LIMIT" \
        -v PICK_WIDTH="$___X_CMD_PICK_WIDTH" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/re.awk"                \
        -f "$___X_CMD_ROOT_MOD/pick/lib/awk/select.comp.awk"  \
        -f "$___X_CMD_ROOT_MOD/pick/lib/awk/select.awk"
    ___X_CMD_PICK_TMP_EXITCODE="$?"

    unset -f ___x_cmd_tui_app_processer
    [ -z "$___X_CMD_PICK_CONTINUE_NAME" ] || {
        ___x_cmd tui position store "pick_${___X_CMD_PICK_CONTINUE_NAME}" "$___X_CMD_TUI_CURRENT_PICK_POSITION"
    }
    return "$___X_CMD_PICK_TMP_EXITCODE"
)}

___x_cmd_pick_app___hook_end(){
    [ -z "$___X_CMD_PICK_SELECTED_ITEM" ] || printf "%s\n" "$___X_CMD_PICK_SELECTED_ITEM";
}
