# shellcheck    shell=sh            disable=SC3043      # xrc

___x_cmd_env_exec(){
    local X_help_cmd='___x_cmd help -m env exec';   help:arg-null:parse

    if ! ___x_cmd_env_exec___execuatable "$@"; then
        env:error "No executable command found. Please use '--' to separate command and arguments."
        env:error "Example 'x env exec node=v18.12.0 -- node helloworld.js'"
        return 1
    fi

    ___x_cmd_env_exec___set_and_run_and_unset "$@"
}

___x_cmd_env_exec___execuatable(){
    local arg
    for arg in "$@"; do
        case "$arg" in
            --)     return 0
        esac
    done
    return 1
}

# WHY？
___x_cmd_env_exec___set(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -*)     ___x_cmd_env untry "${1#*-}" ;;
            *=)     ___x_cmd_env untry "${1%=*}" ;;
            *=-)    ___x_cmd_env try "$1" ;;
            *=*)    ___x_cmd_env try "$1" ;;
        esac
        shift
    done
}

___x_cmd_env_exec___set_and_run_and_unset(){
    local ___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_=
    while [ $# -gt 0 ]; do
        case "$1" in
            --)
                shift; "$@"; break ;;
            -*)
                ___x_cmd_env_exec___set_and_run_and_unset_recover_ "${1#*-}" || return $?
                ___x_cmd_pkg_sphere path rm "${1#*-}"
                ;;
            *=)
                ___x_cmd_env_exec___set_and_run_and_unset_recover_ "${1%=*}" || return $?
                ___x_cmd_pkg_sphere path rm "${1%=*}"
                ;;
            *=*)
                ___x_cmd_env_exec___set_and_run_and_unset_recover_ "${1%=*}" "${1#*=}" || return $?
                ___x_cmd_pkg_sphere add --prebuild --protection try "${1%=*}" "${1#*=}" || return $?
                ___x_cmd_pkg_sphere path add "${1%=*}" "${1#*=}" || return $?
                ;;
        esac
        shift
    done

    [ -z "$___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_" ] || eval "$___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_"
}

___x_cmd_env_exec___set_and_run_and_unset_recover_(){
    local pkg="$1"
    local version="$2"
    ___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_="$___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_
___x_cmd_pkg_sphere path rm $pkg $version
"
    local x_=; ___x_cmd_pkg_sphere_use get_version_ "$pkg" || return $?
    if [ -n "$x_" ]; then
        ___x_cmd_pkg_sphere path rm "$pkg" "$x_" || return $?
        ___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_="$___X_CMD_ENV_EXEC___SET_AND_RUN_AND_UNSET_RECOVER_
___x_cmd_pkg_sphere path add $pkg $x_"
    fi
}
