# shellcheck shell=sh disable=SC3043
# TODO: Different Operation
___x_cmd_job_active(){
    # jobs -pr | wc -l | tr -d ' '
    jobs | ___x_cmd_cmds_awk '($3=="Running")||($2=="Running"){ wc++; } END{ print (wc=="")? 0 : wc; }'
}

___x_cmd_job___wrapper_startlog(){
    local IFS=" "
    job:debug "Start: $*"
}

___x_cmd_job___wrapper_log(){
    ___x_cmd_job___wrapper_startlog "$@"
    (
        ( "$@"; ) 1>/dev/null 2>/dev/null
        code=$?
        if [ "$code" = 0 ]; then        job:info "Success: $*"
        else                            job:error "Fail: [code=$code] $*"
        fi
    ) &
}

___x_cmd_job___wrapper_report(){
    local IFS=" "; printf "%s\n" "start: $*"
    (
        ( "$@"; ) 1>/dev/null 2>/dev/null
        code=$?
        printf "%s\n" "exit: $code $*"
    ) &
}

___x_cmd_job_offer(){
    local ___X_CMD_JOB_WRAPPER="${___X_CMD_JOB_WRAPPER:-"log"}"

    if [ "$1" = -o ]; then
        ___X_CMD_JOB_WRAPPER="$2";  shift 2
    fi

    case "$___X_CMD_JOB_WRAPPER" in
        report|log)     ;;
        *)              x:error "Argument -o and ___X_CMD_JOB_WRAPPER can only accept 'report' or 'log', but get $___X_CMD_JOB_WRAPPER"
                        return 1
    esac

    local MAX="${1:?Provide the max number of jobs could hold}"; shift
    local ___X_CMD_JOB_OFFER_SIZE
    ___X_CMD_JOB_OFFER_SIZE="$(___x_cmd_job_active)"
    if [ "$___X_CMD_JOB_OFFER_SIZE" -ge "${MAX}" ]; then
        job:debug "ActiveSize=$___X_CMD_JOB_OFFER_SIZE. Waiting: $*"
        return 1
    fi

    job:debug "ActiveSize=$___X_CMD_JOB_OFFER_SIZE. Running: $*"

    case "$___X_CMD_JOB_WRAPPER" in
        log)        ___x_cmd_job___wrapper_log      "$@" ;;
        report)     ___x_cmd_job___wrapper_report   "$@" ;;
    esac
}

# Will block
___x_cmd_job_put(){
    until ___x_cmd_job_offer "$@"; do
        sleep "${interval:-1}"
    done
}

___x_cmd_job_wait_until_finished(){
    while [ "$(___x_cmd_job_active)" -ne "${1:-0}" ]; do
        sleep "${interval:-1}"
    done
}

___x_cmd_job_report(){
    ___x_cmd_cmds_awk \
        -v "LOG_LEVEL=$___X_CMD_LOG__job"          \
        -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk"     \
        -f "$___X_CMD_ROOT_MOD/job/lib/report.awk"
}
