# shellcheck shell=dash disable=SC2120

xrc tldr

___x_cmd log init tlfz

___X_CMD_TLFZ_FZ_LS_DATA="$___X_CMD_ROOT_DATA/tlfz/data/fff"

___x_cmd_tlfz___main(){
    [ "$#" -gt 0 ]  ||      set -- --show

    local op="$1";          shift
    case "$op" in
        -h|--help)          ___x_cmd help -m tlfz      "$@" ;       return 0 ;;
        --show)             ___x_cmd_tlfz___show       "$@" ;;
        -a|--all)           ___x_cmd_tlfz___show -a    "$@" ;;
        -c|--cleanup)       ___x_cmd_tlfz___cleanup    "$@" ;;
        *)                  N=tlfz M="Unknown subcmd -> $op" log:ret:64 ;;
    esac
}

___x_cmd_tlfz___show(){
    local FILTER_MODE=""

    while [ $# -gt 0 ]; do
        case "$1" in
            -a|--all)       FILTER_MODE=all;    shift ;;
            *)              break ;;
        esac
    done

    ___x_cmd_tldr_version_pages_    || return $?
    ___x_cmd_tldr_pages_prepare en  || return $?

    local tldr_option=
    tldr_option="$( FILTER_MODE="$FILTER_MODE" ___X_CMD_RUNMODE="$___X_CMD_RUNMODE" ___x_cmdexe tldr --fzdata "$@" )"

    [ -n "$tldr_option" ] || {
        tlfz:info "Exit because no tldr is selected."
        return 0
    }
    tlfz:info "x tldr --cat $tldr_option"
    ___x_cmd tldr --cat "$tldr_option"
}

___X_CMD_TLFZ_FZ_LS_ALLIN1="${___X_CMD_TLFZ_FZ_LS_DATA}.allin1.txt"
___X_CMD_TLFZ_FZ_LS_KEYINFO="${___X_CMD_TLFZ_FZ_LS_DATA}.keyinfo.txt"

___x_cmd_tlfz___data(){
    local x_

    local targetfile="$___X_CMD_TLFZ_FZ_LS_ALLDATA"

    local mode="allin1"
    local filtermode="$FILTER_MODE"
    local HEADER_INIT="<TAB> or <ctlr-r> Switch mode or layout
<ctrl-a> Show TLDR of current|all OS
com/ → Common"
    local HEADER=""

    while true; do
        HEADER="$HEADER_INIT"
        [ "$filtermode" = all ] || {
            ___x_cmd os name_
            filtermode="$x_"
            if ___x_cmd_is_termux; then
                filtermode=termux
            fi

            case "$filtermode" in
                darwin)     HEADER="$HEADER  osx/ → macOS"     ;;
                win)        HEADER="$HEADER  win/ → Windows" ;;
                android)    HEADER="$HEADER  and/ → Android" ;;
                linux)      HEADER="$HEADER  lin/ → Linux"   ;;
            esac
        }

        ___x_cmd tty update

        case "$mode" in
            allin1)     ___x_cmd_tlfz___prepare_allin1
                        targetfile="$___X_CMD_TLFZ_FZ_LS_ALLIN1"    ;;
            keyinfo)    ___x_cmd_tlfz___prepare_keyinfo
                        targetfile="$___X_CMD_TLFZ_FZ_LS_KEYINFO"   ;;
            *)          ___x_cmd_tlfz___prepare
                        targetfile="$___X_CMD_TLFZ_FZ_LS_DATA"      ;;
        esac

        ___x_cmd storerat_ ___x_cmd_tlfz___fzf || return $?

        case $x_ in
            *"|next-view|"*)
                    case "$mode" in
                        allin1)     mode=keyinfo    ;;
                        keyinfo)    mode=list       ;;
                        *)          mode=allin1     ;;
                    esac
                ;;

            *"|toggle-filter|"*)
                    case "$filtermode" in
                        all)        filtermode=""   ;;
                        *)          filtermode=all  ;;
                    esac
                ;;

            *)
                    printf "%s\n" "${x_%% *}"
                    return 0
        esac
    done
}

___x_cmd_tlfz___fzf(){
    tlfz:debug "Fitler mode is $filtermode"

    ___x_cmd_cmds awk \
        -v filtermode="$filtermode" \
        -f "$___X_CMD_ROOT_MOD/tldr/lib/awk/tlfz.filter.awk" <"$targetfile" | \
    ___x_cmd_tlfz___fzfworker
}

___x_cmd_tlfz___fzfworker(){
    ___X_CMD_TLFZ_COLUMNS=$((COLUMNS * 65 / 100)) ___X_CMD_TLFZ_NO_BACKGROUND=1 ___X_CMD_TLFZ_ENABLE_COLOR=1 ___x_cmd fzf  \
            --exact \
            --header="$HEADER"            \
            --ansi --reverse --height='80%' --query="$*"                                                    \
            --bind='ctrl-w:toggle-preview-wrap'                                                             \
            --bind='ctrl-r:change-preview-window(down,40%,60%,border-horizontal|hidden|right,70%)'    \
            --bind='tab:print(|next-view|)+accept'                                                          \
            --bind='ctrl-s:print(|next-view|)+accept'                                                       \
            --bind='ctrl-a:print(|toggle-filter|)+accept'                                                   \
            --preview='___x_cmdexe tldr --cat {1}'                                                          \
            --preview-window=right:70%:wrap
}

___x_cmd_tlfz___cleanup(){
    ___x_cmd rmrf "$___X_CMD_TLFZ_FZ_LS_DATA" "$___X_CMD_TLFZ_FZ_LS_ALLIN1" "$___X_CMD_TLFZ_FZ_LS_KEYINFO"
}

___x_cmd_tlfz___prepare(){
    [ ! -f "$___X_CMD_TLFZ_FZ_LS_DATA" ] || return 0

    ___x_cmd ensurefp "$___X_CMD_TLFZ_FZ_LS_DATA"
    ___x_cmd tldr -l >"$___X_CMD_TLFZ_FZ_LS_DATA"
}

___x_cmd_tlfz___prepare_allin1(){
    [ ! -f "$___X_CMD_TLFZ_FZ_LS_ALLIN1" ] || return 0

    local x_=; ___x_cmd_tldr_lang get_ || return $?
    local lang="$x_"

    ___x_cmd_tldr_version_pages_

    ___x_cmd_tlfz___prepare
    ___x_cmd awk0           \
        -v lang="$lang"     \
        -v mode="allin1"    \
        -v root="${___X_CMD_TLDR_DIR_DATA}/${___X_CMD_TLDR_PAGES_VERSION}" \
        -f "$___X_CMD_ROOT_MOD/tldr/lib/awk/tldr.merge.awk" \
        <"$___X_CMD_TLFZ_FZ_LS_DATA"    >"$___X_CMD_TLFZ_FZ_LS_ALLIN1"
}

___x_cmd_tlfz___prepare_keyinfo(){
    [ ! -f "$___X_CMD_TLFZ_FZ_LS_KEYINFO" ] || return 0

    local x_=; ___x_cmd_tldr_lang get_ || return $?
    local lang="$x_"

    ___x_cmd_tldr_version_pages_

    ___x_cmd_tlfz___prepare
    ___x_cmd awk0           \
        -v lang="$lang"     \
        -v mode="keyinfo"   \
        -v root="${___X_CMD_TLDR_DIR_DATA}/${___X_CMD_TLDR_PAGES_VERSION}" \
        -f "$___X_CMD_ROOT_MOD/tldr/lib/awk/tldr.merge.awk" \
        <"$___X_CMD_TLFZ_FZ_LS_DATA"    >"$___X_CMD_TLFZ_FZ_LS_KEYINFO"
}
