# shellcheck shell=dash
___x_cmd_hn___app(){
    ___X_CMD_SHBIN_CODE='
        xrc hn ;
        "$@"
    ' ___x_cmd antizshbin ___x_cmd_hn___app_1 "$@"
}

___x_cmd_hn___app_1(){
    local type="${1:-top}"
    local x_=; ___x_cmd tui position get_ "hn_${type}"
    local ___X_CMD_TUI_HN_POSITION="$x_"

    ___x_cmd_tui_app_processer(){ ___x_cmd_hn___app_processer "$@"; }
    local per_page=10       # To ensure quick responsiveness
    ___x_cmd tty update
    # [ "$LINES" -ge 28 ] || per_page=10

    local ___X_CMD_TUI_TABLE_FINAL_COMMAND=; local ___X_CMD_TUI_TABLE_ID=; local ___X_CMD_TUI_CURRENT_HN_POSITION=
    local _exitcode=0
    hn:info "Fetching Hacker News $type posts info [$per_page items/page]"
    ___X_CMD_TUI_HN_POSITION="$___X_CMD_TUI_HN_POSITION" \
    ___x_cmd tui bigapp --clear-on-exit \
        -f "$___X_CMD_ROOT_MOD/tui/lib/eg.comp/table.comp.awk" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/date.awk" \
        -f "$___X_CMD_ROOT_MOD/hn/lib/awk/app.awk"

    case "$___X_CMD_TUI_TABLE_FINAL_COMMAND" in
        "ENTER")
            [ -z "$___X_CMD_TUI_TABLE_ID" ] || {
                x_=; ___x_cmd_hn_item___style_pick_ || return $?
                hn:info "x hn item --$x_ $___X_CMD_TUI_TABLE_ID"
                ___x_cmd_hn_item --"$x_" "$___X_CMD_TUI_TABLE_ID"
            }
            ;;
    esac

    _exitcode="$?"
    unset -f ___x_cmd_tui_app_processer
    ___x_cmd tui position store "hn_${type}" "$___X_CMD_TUI_CURRENT_HN_POSITION"
    return "$_exitcode"
}

___x_cmd_hn___app_processer(){
    case "$1" in
        data:total_count)
            local x_=; ___x_cmd str trim_ "$(___x_cmd_hn_topic "${type}" | ___x_cmd jo list2line | ___x_cmd_cmds wc -l)"
            x_=$((x_ + 0))
            printf "%s\n" "data:total_count:${x_}"
            ;;
        data:request:*)
            ___x_cmd_hn___app_datarequest "$type" "${1#*data:request:}" "$per_page"
            ;;
        x:browse:*)
            ___x_cmd_hn___browse "${1#"x:browse:"}"
            ;;
        x:browselink:*)
            ___x_cmd_hn___browselink "${1#"x:browselink:"}"
            ;;
    esac
}

___x_cmd_hn___app_datarequest(){
    local type="${1:-top}"
    local signal="${2:-1}";
    local per_page="${3:-10}"
    local page; local start; local end
    page=$(( (signal-1)/per_page  + 1 ))
    start=$(( (page-1)*per_page  + 1 ))
    end=$((start + per_page - 1))
    local data=; data="$(___x_cmd_hn_live___data "$type" "${start},${end}")" || {
        printf "%s\n" "errexit:Error exit"
        return 1
    }
    if [ -n "$data" ]; then
        printf "%s\n%s\n" "data:start:${start}" "$data"
    else
        printf "%s\n" "errexit:Data not found"
    fi
}
