# shellcheck shell=dash

___x_cmd_tping_run(){

    local host=
    local port=80

    local format=auto

    while [ $# -gt 0 ]; do
        case "$1" in
            --auto)             format="${1#--}";   shift ;;
            -r|--raw)           format=raw;         shift ;;
            -b|--bar)           format=bar;         shift ;;
            -m|--heatmap)       format=heatmap ;    shift ;;
            --verbose)          format=verbose;     shift ;;
            --csv|--tsv)        format="${1#--}";   shift ;;
            -*)                 N=tping M="Unsupproted op -> $1" log:ret:64 ;;
            *)                  break ;;
        esac
    done

    local addr="${1}"

    case "$addr" in
        http://*)   port=80;            host="${addr#*://}" ;;
        https://*)  port=443;           host="${addr#*://}" ;;

        *)                              host="$addr" ;;
    esac

    case "$host" in
        *:*)        port="${host#*:}";  host="${host%:*}" ;;
    esac

    [ -n "$host" ] || N=tping M="Fail to parse host -> $addr" log:ret:64

    # tping:info --host "$host" --port "$port" "Using curl to send telnet packet"
    tping:info "Target -> [host=$host] [port=$port]"

    ___x_cmd_tping_run___"$format" "$@"
}

___x_cmd_tping_run___tsv(){        MODE="tsv"      ___x_cmd_tping_run___format "$@"; }
___x_cmd_tping_run___csv(){        MODE="csv"      ___x_cmd_tping_run___format "$@"; }
___x_cmd_tping_run___verbose(){    MODE="verbose"  ___x_cmd_tping_run___format "$@"; }

___x_cmd_tping_run___bar(){        MODE="bar"      ___x_cmd_tping_run___format "$@"; }
___x_cmd_tping_run___heatmap(){    MODE="heatmap"  ___x_cmd_tping_run___format "$@"; }


___x_cmd_tping_run___auto(){
    if ___x_cmd_is_stdout2tty; then     ___x_cmd_tping_run___verbose "$@"
    else                                ___x_cmd_tping_run___tsv     "$@"
    fi
}

___x_cmd_tping_run___format(){
    local x_=""; ___x_cmd term color_ || x_=8

    ___x_cmd_tping_run___raw | {
        ___x_cmd_tping___run___awk      \
            -v mode="$MODE"           \
            -v sytle_color="$x_"        \
            -f "${___X_CMD_ROOT_MOD}/ping/lib/awk/sample.awk"   \
            -f "${___X_CMD_ROOT_MOD}/ping/lib/awk/share.awk"    \
            -f "${___X_CMD_ROOT_MOD}/tping/lib/awk/vis.awk"     \
            -f "${___X_CMD_ROOT_MOD}/tping/lib/awk/parse.awk"
    }
}

___x_cmd_tping_run___raw(){
    local errcode=0
    while true; do
        # TODO: Check the time to ensure 1 seconds interval
        ___x_cmd_tping_run___raw_cmd 2>/dev/null
        errcode=$?
        case "$errcode" in
            130)        # N=tping M="Exit because interrupted [code=$errcode]" log:ret:64
                        return 0
                        ;;
            28)         ;;
            3)
                        N=tping M="Fail to run command for [host=$host] [port=$port] [code=$errcode]" log:ret:64
                        # This log is suppress ...
                        ;;
            *)
                        ;;
        esac
    done
}

___x_cmd_tping___run___awk(){
    if [ "$(___x_cmd awk impl)" = "mawk" ]; then    LC_ALL="$___X_CMD_LOCALE_DEF_C" ___x_cmd_cmds mawk -W interactive "$@"
    else                                            LC_ALL="$___X_CMD_LOCALE_DEF_C" ___x_cmd_cmds_awk "$@"
    fi
}
# Once we have tcping installed.
# Then we will use tcping.

# TODO: using time_appconnect to replace time_connect

___x_cmd_tping_run___raw_curl_isvalid(){
    ! ___x_cmd os is win || return 1
    ___x_cmd_hascmd curl || return 1
    local x_
    ___x_cmd curl version_
    case "$x_" in
        7.*|6.*|5.*)            return 1 ;;
        8.0*|8.1*|8.2*|8.3*)    return 1 ;;
    esac
}

___x_cmd_tping_run___raw_curl(){
    if ___x_cmd_tping_run___raw_curl_isvalid; then
        ___x_cmd_cmds curl "$@"
    else
        ___x_cmd cosmo curl "$@"
    fi
}

___x_cmd_tping_run___raw_cmd(){
    ___x_cmd_tping_run___raw_cmd_run "$host" "$port" | {
        # sleep time ...
        # ensure it will stop during interval ...
        ___x_cmd_cmds sleep 1 || return 130
        cat
    }
}

___x_cmd_tping_run___raw_cmd_run(){
    local host="$1"
    local port="$2"

    # ___x_cmd proxy unset
    # ensure the connect will be
    ___x_cmd_tping_run___raw_curl       \
        --max-time          1           \
        --connect-timeout   1           \
        --output            /dev/null   \
        -w "%{remote_ip} %{remote_port} %{local_ip} %{local_port} %{time_namelookup} %{time_connect} %{time_appconnect}
"  \
        -v "telnet://${host}:${port}" 2>/dev/null
}
