# shellcheck shell=dash disable=SC2016

___x_cmd log init ip

xrc:mod:lib     ip  local   query  scan mask util cidr/_index map int iter config/_index addr/_index tps

___x_cmd_ip___main(){
    [ "$#" -gt 0 ]  ||      set -- ls

    local op="$1";  shift
    case "$op" in
        ls|echo|geolite|query|scan|\
        mac|macvendor|\
        mask2no|no2mask|maskaddr|\
        class|class_|type|type_|info|cidr|validate|fill0|fill0_|map|\
        parse|parse_|\
        iter|count|count_|toint|toint_|fromint|fromint_)
                            "___x_cmd_ip_${op}" "$@"    ;;

        tps|tcp-portscan)   ___x_cmd_ip_tps     "$@"    ;;

        a|addr)             ___x_cmd_ip_addr    "$@"    ;;

        c|config)           ___x_cmd_ip_config  "$@"    ;;

        -h|--help)          M='ip' help:ret:0           ;;
        *\.*/*)             ___x_cmd ip cidr "$op"      ;;
        *\.*)               ___x_cmd ip info "$op"      ;;
        *)                  M='ip' help:ret:1           ;;
    esac
}

___x_cmd_ip_echo(){
    if [ "$1" = '--nocache' ]; then                             ___x_cmd_ip_echo___nocache
    else                                ___x_cmd ccmd 60s --    ___x_cmd_ip_echo___nocache
    fi
}

___x_cmd_ip_echo___nocache(){
    ___x_cmd ccmd 5s -- ___x_cmd curl --fail --max-time 10 -s https://ipecho.net/plain 2>/dev/null
}

___x_cmd_ip_geolite(){
    {
        if [ $# -eq 0 ]; then
            ___x_cmd ccmd 5s -- ___x_cmd_ip_geolite___request ""
        else
            ___x_cmd ccmd 30m -- ___x_cmd_ip_geolite___request "$1"
        fi
    } | ___x_cmd jo env . City=.city Region=.region Country=.country -- \
    'printf "%s\n%s\n" "IP LOCATION :" "  $City, $Region (${Country})"'
}

___x_cmd_ip_geolite___request(){
    ___x_cmd curl -s "https://ipinfo.io/$1"
}

___x_cmd_ip_ls(){
    local NO_COLOR="$NO_COLOR"
    ___x_cmd_is_stdout2tty || NO_COLOR=1
    ___x_cmd_ip_local

    if [ "$NO_COLOR" != 1 ]; then
        local UI_KEY="\033[36m"
        local UI_STR_VAR="\033[32m"
        local UI_END="\033[0m"
    fi

    local x_=;
    ___x_cmd os name_
    case "$x_" in
        win)  printf "${UI_KEY}%-45s${UI_END}  :  ${UI_STR_VAR}%s${UI_END}\n" "public" "$(___x_cmd_ip_echo --cache)"; return ;;
    esac
    printf "${UI_KEY}%-10s${UI_END}  :  ${UI_STR_VAR}%s${UI_END}\n" "public" "$(___x_cmd_ip_echo)"
}

___x_cmd_ip_mac(){
    ___x_cmd ma "$@"
}
