# shellcheck        shell=dash

xrc:mod:lib     rand    str

# TODO: rewrite this module using the awk lib.

___x_cmd_rand___main(){
    [ $# -gt 0 ]    ||  set -- int

    local op="$1";      shift
    case "$op" in
        -h|--help)      ___x_cmd help -m rand ;;
        
        int_|int|float_|float|decimal_|decimal|digit_|digit|ip|\
        string|alpha|alphanum|email|lower|upper)
                        ___x_cmd_rand_"$op"     "$@" ;;

        uuid)           ___x_cmd uuid           "$@" ;;
        uuidv7)         ___x_cmd uuid v7        "$@" ;;

        *)              N=rand M="Unsupuported subcmd -> $op" log:ret:64 ;;
    esac
}

if [ -n "$RANDOM" ]; then
    ___x_cmd_rand_int_(){
        local ST="${1:-0} "
        local EN="${2:-32767}"
        x_=$(( ( RANDOM % (EN-ST+1) )  + ST ))
    }
else
    ___x_cmd_rand_int_(){
        # x_="$( ___x_cmd_rand_int "$@" )"
        local ST="${1:-0} "
        local EN="${2:-32767}"

        x_="$(( ( $(___x_cmd_cmds od -An -N2 -i /dev/urandom) % (EN-ST+1) )  + ST ))"
    }
fi

___x_cmd_rand_int(){
    local x_
    ___x_cmd_rand_int_  "$@" || return $?
    printf "%d\n" "$x_"
}

___x_cmd_rand_digit_(){
    local n="${1:-3}"
    x_=""
    case "$n" in
        1)      ___x_cmd_rand_int_ 10    19     ;;
        2)      ___x_cmd_rand_int_ 100   199    ;;
        3)      ___x_cmd_rand_int_ 1000  1999   ;;
        4)      ___x_cmd_rand_int_ 10000 19999  ;;
        *)      
                local i=$((n+4))
                local ret=""
                while [ $((i=i-4)) -ge 4 ]; do
                    ___x_cmd_rand_int_ 10000 19999
                    ret="${ret}${x_#?}"
                done
                case "$i" in
                    3|2|1)
                        ___x_cmd_rand_digit_ "$i"
                        ret="${ret}${x_}"
                esac
                x_="$ret"
                return 0
    esac
    x_="${x_#?}"
}

___x_cmd_rand_digit(){
    local x_
    ___x_cmd_rand_digit_ "$@"   ||  return $?
    printf "%s\n" "$x_"
}

___x_cmd_rand_decimal_(){
    ___x_cmd_rand_digit_ "$1"   || return $?
    x_="0.${x_}"
}

___x_cmd_rand_decimal(){
    local x_
    ___x_cmd_rand_decimal_  "$@"    || return $?
    printf "%s\n" "$x_"
}

___x_cmd_rand_float_(){
    local begin="${1:-0}"
    local end="${2:-32767}"
    local decimal_length="${3:-3}"

    ___x_cmd_rand_int_ "$begin" "$end"      || return $?  ;   local int="$x_"
    ___x_cmd_rand_digit "$decimal_length"   || return $?
    x_="${int}.${x_}"
}

___x_cmd_rand_float(){
    local x_
    ___x_cmd_rand_float_        || return $?
    printf "%s\n" "$x_"
}

