#!/usr/bin/env bash
# onx-dns-propagation-check — DNS propagasyon durumunu 8 global resolver ile kontrol et
# Input:  {"domain":"example.com","name":"www.example.com","type":"A"}
# Output: {"results":[{"resolver":"Google","ip":"8.8.8.8","status":"ok","answer":"1.2.3.4","latency_ms":42}, ...]}

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_lib/common.sh"

require_cmd dig
onx_json_input

DOMAIN="$(onx_json_field domain)"
NAME="$(onx_json_field name)"
TYPE="$(onx_json_field type 'A')"

[[ -z "$DOMAIN" ]] && onx_die 1 "domain zorunlu"
[[ -z "$NAME" ]]   && onx_die 1 "name zorunlu"

TYPE="${TYPE^^}"
[[ "$TYPE" =~ ^(A|AAAA|CNAME|MX|TXT|SRV|CAA|NAPTR|NS|PTR)$ ]] || \
    onx_die 1 "Gecersiz sorgu tipi: '${TYPE}'"

onx_log "dns-propagation-check: domain=${DOMAIN} name=${NAME} type=${TYPE}"

# 8 global resolver tanımı
RESOLVER_NAMES=("Google" "Cloudflare" "OpenDNS" "Quad9" "AdGuard" "Yandex" "NextDNS" "Custom")
RESOLVER_IPS=("8.8.8.8" "1.1.1.1" "208.67.222.222" "9.9.9.9" "94.140.14.14" "77.88.8.8" "45.90.28.0" "1.0.0.1")

RESULTS_JSON=""
FIRST=1

for i in "${!RESOLVER_IPS[@]}"; do
    RNAME="${RESOLVER_NAMES[$i]}"
    RIP="${RESOLVER_IPS[$i]}"

    T_START=$(date +%s%3N)
    RAW_ANSWER=$(dig +short +time=3 +tries=1 "@${RIP}" "${NAME}" "${TYPE}" 2>/dev/null)
    DIG_EXIT=$?
    T_END=$(date +%s%3N)
    LATENCY=$(( T_END - T_START ))

    if [[ $DIG_EXIT -ne 0 ]]; then
        STATUS="timeout"
        ANSWER_JSON="null"
    elif [[ -z "$RAW_ANSWER" ]]; then
        STATUS="notfound"
        ANSWER_JSON="null"
    else
        STATUS="ok"
        # İlk satırı al, JSON string için escape et
        FIRST_ANSWER="$(echo "$RAW_ANSWER" | head -1)"
        ANSWER_ESC="${FIRST_ANSWER//\\/\\\\}"
        ANSWER_ESC="${ANSWER_ESC//\"/\\\"}"
        ANSWER_JSON="\"${ANSWER_ESC}\""
    fi

    ENTRY="{\"resolver\":\"${RNAME}\",\"ip\":\"${RIP}\",\"status\":\"${STATUS}\",\"answer\":${ANSWER_JSON},\"latency_ms\":${LATENCY}}"

    if [[ $FIRST -eq 1 ]]; then
        RESULTS_JSON="${ENTRY}"
        FIRST=0
    else
        RESULTS_JSON="${RESULTS_JSON},${ENTRY}"
    fi
done

json_ok "{\"results\":[${RESULTS_JSON}]}"
