# Author:       Li Junhao           l@x-cmd.com
# shellcheck    shell=dash          # xrc

# license:      GPLv3

___x_cmd_is_unset(){
    local e; for e in "$@"; do
        eval '[ -z "${'"$e"'+1}" ]' || return 1
        # eval '[ -z "${'"${1:?Provide name}"'}" ] && [ -z "${'"${1}"'+1}" ] ' || return 1
    done
}

# Deprecated
___x_cmd_isunset(){
    ___x_cmd_is_unset "$@"
}

___x_cmd_is_int(){  ___x_cmd_is_int___noredirect "$@";  } 2>/dev/null
___x_cmd_is_int___noredirect(){
    [ $# -ne 0 ]            || return 1
    local e; for e in "$@"; do
        [ -n "$e" ]         || return 1
        [ "$e" -eq "$e" ]   || return 1         # ___x_cmd_is_str_regex "$1" "^[ \t]*[+-]?[0-9]+[ \t]*$"
    done
}

___x_cmd_is___ip(){
    local a
    local b
    local c
    local d
    a="${1%%\.*}"
    d="${1##*\.}"
    b="${1#"$a."}"; b="${b%%\.*}"
    c="${1%".$d"}"; c="${c##*\.}"

    local IFS=" "
    local i
    for i in $a $b $c $d; do
        [ "$i" -ge 0 ]      || return 1
        [ "$i" -le 255 ]    || return 1
    done
}

___x_cmd_is_ip(){
    [ "$#" -gt 0 ] || return

    while [ "$#" -gt 0 ]; do
        case "$1" in
            *\.*\.*\.*\.*)  return 1 ;;
            *\.*\.*\.*)    ___x_cmd_is___ip "$1" || return ;;
            *)          return 1 ;;
        esac
        shift
    done 2>/dev/null
}

___x_cmd_is_positive(){ ___x_cmd_is_positive___redirect "$@"; } 2>/dev/null
___x_cmd_is_positive___redirect(){
    local int; for int in "$@"; do
        [ "$int" -ge 0 ] || return 1        # ___x_cmd_is_str_regex "$1" "^[ \t]*[+-]?[0-9]+[ \t]*$"
    done
}

___x_cmd_is_float(){
    local e; for e in "$@"; do
        ___x_cmd_is___float_one_noredirect "$e" || return 1
    done
} 2>/dev/null

___x_cmd_is___float_one_noredirect(){   # "^[ \t]*[+-]?[0-9]+(.[0-9]+)?[ \t]*$"
    case "${1:?Provide number}" in
        .*e*)       local float=${1#.}; ___x_cmd_is_int___noredirect "${float%e*}" "${float#*e}" || return    ;;
        .*E*)       local float=${1#.}; ___x_cmd_is_int___noredirect "${float%E*}" "${float#*E}" || return    ;;

        *.*E*)      local a=${1%%.*};       local   c="${1##*E}"
                    ___x_cmd_is_int___noredirect "$a" "$c" || return 1
                    local b="${1#"${a}."}";            b="${b%E"$c"}"
                    [ "$b" -ge 0 ] || return 1 ;;

        *.*e*)      local a=${1%%.*};       local   c="${1##*e}"
                    ___x_cmd_is_int___noredirect "$a" "$c" || return 1
                    local b="${1#"${a}."}";            b="${b%e"$c"}"
                    [ "$b" -ge 0 ] || return 1 ;;

        .*)         ___x_cmd_is_int___noredirect "${1#.}" || return 1 ;;
        *.*)        ___x_cmd_is_int___noredirect "${1%.*}" "${1#*.}" || return 1 ;;
        *)          return 1
    esac
}

___x_cmd_is_eq(){
    local real="$1"; shift
    if [ $# -eq 0 ]; then
        [ "$real" = "$(___x_cmd_cmds_cat)" ] || return 1
        return 0
    fi

    local e; for e in "$@"; do
        [ "$real" = "$e" ] || return 1
    done
    return 0
}

___x_cmd_is_within(){
    local value="$1"; shift
    local e; for e in "$@"; do
        [ "$value" != "$e" ] || return 0
    done
    return 1
}

# x is in a a,b,c
# x is =, "$a" a,b,c
___x_cmd_is___in(){
    [ -n "$1" ] || return 1
    local L="${S}${L}${S}"; [ "${L#*"${S}${1}${S}"}" != "$L" ]
}


___X_CMD_IS_STR_REGEX_SEP="$___X_CMD_UNSEENCHAR_001"
___x_cmd_is_str_regex(){
    # Only dash does not support pattern="${pattern//\\/\\\\}"
    ___x_cmd_cmds_awk -v FS="${___X_CMD_IS_STR_REGEX_SEP}" '{
        if (match($1, $2))  exit 0
        else                exit 1
    }' <<A
${1}${___X_CMD_IS_STR_REGEX_SEP}${2:?___x_cmd_is_str_regex(): Provide pattern}
A
}

___x_cmd_is_within_regex(){
    local value="$1"; shift
    local e; for e in "$@"; do
        ! ___x_cmd_is_str_regex "$value" "^($e)$" || return 0   # if [[ "$value" =~ ^($c)$ ]]; then
    done
    return 1
}

___x_cmd_is_newest(){
    local tgtfp="${1:?Provide filepath}"; shift
    if [ "$#" -eq 0 ]; then
        ___x_cmd_is_newest___main "$tgtfp"
    else
        local IFS="$___X_CMD_UNSEENCHAR_NEWLINE"
        ___x_cmd_is_newest___main "$tgtfp" <<A
$*
A
    fi
}

___x_cmd_is_newest___main(){
    local tgtfp="$1"
    while read -r fp; do
        [ "$tgtfp" -nt "$fp" ] || return 1
    done
    return 0
}


xrc setmain ___x_cmd_is
