# Author:       Li Junhao   l@x-cmd.com             # xrc
# shellcheck    shell=sh    disable=SC3043,SC1091

___x_cmd log init tmp

___x_cmd_tmp(){
    [ $# -gt 0 ]    ||  set -- path

    local op="$1" ;     shift
    case "$op" in
        -h|--help)      ___x_cmd help -m tmp "$@" ; return 0 ;;

        path|path_|root|root_|mkfile|mkfile_|mkdir|mkdir_)
                        ___x_cmd_tmp_"$op"          "$@" ;;

        *)              ___x_cmd_tmp_path "$op"     "$@" ;;
    esac
}

___x_cmd_tmp_path(){
    [ $# -eq 0 ] || case "$1" in
        -h|--help)  ___x_cmd help -m tmp path "$@" ; return 0 ;;
    esac
    local x_
    ___x_cmd_tmp_path_ "$@" || return $?
    printf "%s\n" "$x_"
}

___x_cmd_tmp_path_(){
    ___x_cmd_tmp_root_ 

    while [ $# -gt 0 ]; do
        x_="${x_}/${1%%/*}"
        shift
    done
}

___x_cmd_tmp_mkdir_(){
    local prefix=""
    local subpath=""

    x_=""

    while [ $# -gt 0 ]; do
        case "$1" in
            --prefix)   prefix="$2"; shift 2 ;;
            --)         shift; subpath="$*"; break ;;
            -*)         N=tmp M="Unknown option -> $1" log:ret:64 ;;
            *)          subpath="${subpath}/$1"; shift ;;
        esac
    done

    if [ -n "$prefix" ]; then
        ___x_cmd rand digit_ 4
        ___x_cmd_tmp_path_ "${prefix}-$$-${x_}"
    else
        ___x_cmd_tmp_path_ "${subpath:+"${subpath#/}"}"
    fi || return $?

    ___x_cmd mkdirp "$x_"
}

___x_cmd_tmp_mkdir(){
    [ $# -eq 0 ] || case "$1" in
        -h|--help)  ___x_cmd help -m tmp mkdir "$@" ; return 0 ;;
    esac
    local x_
    ___x_cmd_tmp_mkdir_ "$@"    || return $?
    printf "%s\n" "$x_"
}

___x_cmd_tmp_mkfile_(){
    x_=""

    ___x_cmd_tmp_path_ "$@"     || return $?
    ___x_cmd touch "$x_"
}

___x_cmd_tmp_mkfile(){
    [ $# -eq 0 ] || case "$1" in
        -h|--help)  ___x_cmd help -m tmp mkfile "$@" ; return 0 ;;
    esac
    local x_
    ___x_cmd_tmp_mkfile_ "$@"   || return $?
    printf "%s\n" "$x_"
}

___x_cmd_tmp_root_(){
    if [ -z "$___X_CMD_TMP_ROOT" ]; then
        case "$TMPDIR" in
            */)     ___X_CMD_TMP_ROOT="${TMPDIR%/*}"   ;;
            *)      ___X_CMD_TMP_ROOT="$TMPDIR"        ;; # git-bash not endwith '/'
        esac
    fi

    x_="$___X_CMD_TMP_ROOT"
}

___x_cmd_tmp_root(){
    [ $# -gt 0 ]    ||  set -- get
    local subcmd="$1";  shift
    case "$subcmd" in
        -h|--help)      ___x_cmd help -m tmp root "$@" ; return 0 ;;
        get|get_|set)   ___x_cmd_tmp_root_"$subcmd" "$@" ;;
        *)              N=tmp M="Unknown root subcmd -> $subcmd" log:ret:64 ;;
    esac
}

___x_cmd_tmp_root_get(){
    [ $# -eq 0 ] || case "$1" in
        -h|--help)  ___x_cmd help -m tmp root get "$@" ; return 0 ;;
    esac
    local x_=""
    ___x_cmd_tmp_root_get_  || return $?
    printf "%s\n" "$x_"
}

___x_cmd_tmp_root_get_(){
    ___x_cmd_tmp_root_
}

___x_cmd_tmp_root_set(){
    [ $# -eq 0 ] || case "$1" in
        -h|--help)  ___x_cmd help -m tmp root set "$@" ; return 0 ;;
    esac
    [ $# -gt 0 ] || { N=tmp M="root set requires a path argument" log:ret:64; }
    ___X_CMD_TMP_ROOT="$1"
}

xrc setmain ___x_cmd_tmp

