# shellcheck shell=sh disable=SC3043,2317,2012
___x_cmd_job_log(){
    local op="$1"
    case "$op" in
        save)       shift; ___x_cmd_job_log_save "$@" ;;
        ls)         shift; ___x_cmd_job_log_ls "$@" ;;
        cat)        shift; ___x_cmd_job_log_cat "$@" ;;
        out)        shift; ___x_cmd_job_log_out "$@" ;;
        err)        shift; ___x_cmd_job_log_err "$@" ;;
        app)        shift; ___x_cmd_job_log_app ;;
        *)          ___x_cmd_job_log_app "$op" "$@" ;;
    esac
}

___x_cmd_job_log_cat(){     CODE=unpack ___x_cmd_job_log___cat "$@";    }
___x_cmd_job_log_err(){     CODE=err    ___x_cmd_job_log___cat "$@";    }
___x_cmd_job_log_out(){     CODE=out    ___x_cmd_job_log___cat "$@";    }

___x_cmd_job_log___cat(){
    local runid="${1:?Prvoide runid}"
    local idx="${2:?Provide job idx}"

    local logfile="${___X_CMD_JOB_OFFER_LOG:-$___X_CMD_LOG_STORE_DEFAULT/job/DEFAULT/$runid/$idx}"
    [ -f "$logfile" ] || {
        job:error "logfile NOT found: $logfile"
        return 1
    }
    x outerr "$CODE" <"$logfile"
}

___x_cmd_job_log_ls(){
    if ___x_cmd_runmode_allow_chatty; then
        ___x_cmd_job_log_ls_ "$@" | less
    else
        ___x_cmd_job_log_ls_ "$@"
    fi
}

___x_cmd_job_log_ls_()(
    local logdir="${___X_CMD_JOB_OFFER_LOG:-$___X_CMD_LOG_STORE_DEFAULT/job/DEFAULT}"

    local runid="${1}"
    if [ -z "$runid" ]; then
        x mcd "$logdir"
        ___x_cmd_cmds_ls . | ___x_cmd_cmds_cat | command sort -r
    else
        x mcd "$logdir/$runid"
        ___x_cmd_cmds_ls . | ___x_cmd_cmds_cat | command sort -n -r
    fi
)

___x_cmd_job_log_save(){
    local fp="${1:?Provide filepath}"
    local logdir="${___X_CMD_JOB_OFFER_LOG:-$___X_CMD_LOG_STORE_DEFAULT/job/DEFAULT}"

    x cp -r "$logdir" "$fp"
}

# Section: job log app
___x_cmd_job_log_app(){
    xrc outerr
    local logfile;
    local ___X_CMD_TUI_NAVI_FINAL_COMMAND=
    local ___X_CMD_TUI_CURRENT_NAVI_POSITION=
    local ___X_CMD_TUI_APP_IS_SMALL_SCREEN=
    while true; do
        ___x_cmd_compat_syncfs /dev/tty
        eval "$(___x_cmd_job_log_app_)" || return
        [ "$___X_CMD_TUI_NAVI_FINAL_COMMAND" = "ENTER" ] || break
        [ -f "$logfile" ] || return
        ___x_cmd_cmds_cat "$logfile" | ___x_cmd_main outerr unpack | command less -rf 2>/dev/null || break
    done
}

___x_cmd_job_log_app_(){
    ___X_CMD_SHBIN_CODE='
        xrc job ;
        "$@"
    ' ___x_cmd antizshbin ___x_cmd_job_log_app___
}

___x_cmd_job_log_app___(){
    ___x_cmd_tui_app_processer(){ ___x_cmd_job_log_app_processer "$@"; }
    x tui bigapp --clear-on-exit \
        -v JOB_LOG_FILE_BASEPATH="$___X_CMD_LOG_STORE_DEFAULT/job/DEFAULT" \
        -v ___X_CMD_OUTERR_MIX_PACK_PREFIX="$___X_CMD_OUTERR_MIX_PACK_PREFIX" \
        -v ___X_CMD_TUI_CURRENT_NAVI_POSITION="${___X_CMD_TUI_CURRENT_NAVI_POSITION}" \
        -f "$___X_CMD_ROOT_MOD/tui/lib/eg.comp/navi.comp.awk" \
        -f "$___X_CMD_ROOT_MOD/job/lib/app/log.awk"
}

___x_cmd_job_log_app_processer(){
    local args; local item
    local content
    case "$1" in
        data:request:*)
            args="${1#*data:request:}"
            item="${args##* }"
            args="${args% *}"
            content="$( eval "___x_cmd_job_log_ls_ $args" 2>/dev/null )" || {
                printf "errexit:job log error exit:%s" "$args"
                return
            }
            printf "data:item:%s\n" "$item"
            printf "%s\n" "$content"
            ;;
    esac
}

# EndSection
