# shellcheck shell=dash

___x_cmd_ps___exec(){
    [ $# -gt 0  ]   ||  set -- aux

    local fmt=app;

    while [ $# -gt 0 ]; do
        case "$1" in
            -j|--json)     fmt=json   ;;
            -c|--csv)      fmt=csv    ;;
            --tsv)         fmt=tsv    ;;
            --app)         fmt=app    ;;
            *)             break      ;;
        esac
        shift
    done

    "___x_cmd_ps___exec___${fmt}" "$@"
}


___x_cmd_ps___exec___json(){
    ___x_cmd_ps___exec___csv "$@" | ___x_cmd csv tojson
}

___x_cmd_ps___exec___csv(){
    ___x_cmd_ps___exec___raw "$@" | ___x_cmd_ps___tocsv
}

___x_cmd_ps___exec___tsv(){
    ___x_cmd_ps___exec___raw "$@" | ___x_cmd_ps___tocsv | ___x_cmd tsv fromcsv
}

___x_cmd_ps___exec___raw(){
    if ___x_cmd_hascmd ps; then
        ___x_cmd_cmds ps "$@"
    else
        if ___x_cmd os is linux; then
            ___x_cmd busybox ps "$@"
        else
            ps:error "ps command not found."
            return 1
        fi
    fi
}

# ___x_cmd_ps___top(){
#     local pid="$1"
#     if (___x_cmd_cmds top -h | grep '\-pid' ) 1>/dev/null 2>/dev/null; then
#         ___x_cmd_cmds top -pid "$pid"
#     elif (___x_cmd_cmds top -h | grep '\-p pid' ) 1>/dev/null 2>/dev/null; then
#         ___x_cmd_cmds top -p "$pid"
#     else
#         ___x_cmd_cmds top
#     fi
# }

___x_cmd_ps___exec___app(){
    if ___x_cmd_is_stdout2tty && ___x_cmd_runmode_allow_manual; then
        ___x_cmd_ps___exec___app0   "$@"
    else
        ___x_cmd_ps___exec___csv    "$@"
    fi
}

___x_cmd_ps___exec___app0(){
    local ___X_CMD_CSV_APP_DATA_USER=
    local ___X_CMD_CSV_APP_DATA_PID=
    local ___X_CMD_CSV_APP_DATA_CPU=
    local ___X_CMD_CSV_APP_DATA_MEM=
    local ___X_CMD_CSV_APP_DATA_VSZ=
    local ___X_CMD_CSV_APP_DATA_RSS=
    local ___X_CMD_CSV_APP_DATA_TTY=
    local ___X_CMD_CSV_APP_DATA_STAT=
    local ___X_CMD_CSV_APP_DATA_TIME=
    local ___X_CMD_CSV_APP_DATA_START=
    local ___X_CMD_CSV_APP_DATA_COMMAND=


    ___X_CMD_CSV_APP_SHBIN_CODE="xrc ps"    \
    ___x_cmd csv app --clear --return var   \
        ___x_cmd_ps___exec___csv "$@"

    [ -n "$___X_CMD_CSV_APP_DATA_PID" ] || return 0
    local pid="$___X_CMD_CSV_APP_DATA_PID"

    local id=
    ___x_cmd ui select id "Next:"       \
        "dump selected result"          \
        "kill -s TERM  \"$pid\""        \
        "kill -s INT   \"$pid\""        \
        "kill -s KILL  \"$pid\""        \
        "Exit"

    case "$id" in
        1)      ___x_cmd_ps___exec___info   "$pid"  ;;
        2)      ___x_cmd_cmds kill -s TERM  "$pid"  ;;
        3)      ___x_cmd_cmds kill -s INT   "$pid"  ;;
        4)      ___x_cmd_cmds kill -s KILL  "$pid"  ;;
        *)      return
    esac
}


# using yml to show the data
___x_cmd_ps___exec___info(){
    local pid="$1"
    ___x_cmd_cmds ps u "$pid" | ___x_cmd_ps___tojson | ___x_cmd j2y
}


___x_cmd_ps___exec___typeofps_(){
    local helpmsg;      helpmsg="$(___x_cmd ps -V 2>&1)"
    case "$helpmsg" in
        *BusyBox*)      x_=busybox  ;;
    esac
}
