#!/bin/bash
# Verificador de conexion AIRWIZ (macOS)
# Detecta si la conexion a internet es por CABLE o WiFi y lo envia a soporte.
# El cliente lo abre con doble clic (si avisa Gatevkeeper: clic derecho > Abrir).

# >>> Si cambias la carpeta/dominio, actualiza esta URL <<<
API="https://test.airwiz.com.pe/api.php?action=helper"

clear
echo "========================================"
echo "   Verificador de conexion - AIRWIZ"
echo "========================================"
echo ""
echo "Analizando tu conexion..."
echo ""

# 1) Interfaz que sale a internet (ruta por defecto)
IFACE=$(route -n get default 2>/dev/null | awk '/interface:/{print $2}')
[ -z "$IFACE" ] && IFACE=$(netstat -rn 2>/dev/null | awk '/^default/{print $NF; exit}')

# 2) Mapear el device (ej. en0) a su puerto fisico
PORT=$(networksetup -listallhardwareports 2>/dev/null | awk -v dev="$IFACE" '
  /Hardware Port:/{hp=$0; sub(/Hardware Port: /,"",hp)}
  /Device:/{if($2==dev) print hp}')

TIPO="Desconocido"
case "$PORT" in
  *Wi-Fi*|*AirPort*)                    TIPO="WiFi";;
  *Ethernet*|*Thunderbolt*|*LAN*|*USB*) TIPO="Cableada (Ethernet)";;
esac

# 3) Detalles WiFi (si aplica)
SSID=""
SIGNAL=""
if [ "$TIPO" = "WiFi" ]; then
  SSID=$(networksetup -getairportnetwork "$IFACE" 2>/dev/null | sed 's/^.*: //')
  AIRPORT="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport"
  [ -x "$AIRPORT" ] && SIGNAL=$("$AIRPORT" -I 2>/dev/null | awk '/agrCtlRSSI/{print $2" dBm"}')
fi

IPLOCAL=$(ipconfig getifaddr "$IFACE" 2>/dev/null)
MODEL=$(sysctl -n hw.model 2>/dev/null)
OSV="$(sw_vers -productName 2>/dev/null) $(sw_vers -productVersion 2>/dev/null)"
HOST=$(hostname)

echo "Resultado:"
echo "-----------------------------------------"
echo "  Tipo de conexion : $TIPO"
echo "  Interfaz         : $IFACE ($PORT)"
echo "  IP local         : $IPLOCAL"
if [ "$TIPO" = "WiFi" ]; then
  echo "  Red WiFi (SSID)  : $SSID"
  echo "  Senal            : $SIGNAL"
fi
echo "  Equipo           : $HOST ($MODEL)"
echo "  Sistema          : $OSV"
echo "-----------------------------------------"
echo ""

# Escapar para JSON (comillas en una linea; el trace tambien escapa saltos de linea)
esc() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'; }
esc_multi() { printf '%s' "$1" | perl -0pe 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g'; }

# Calidad de internet: ping + ruta a DNS publicos masivos
echo "Probando DNS publicos (Google, Cloudflare, Quad9, OpenDNS)..."
echo "Esto puede tardar un par de minutos (ping + ruta)."
echo ""
DNS_JSON=""
# pares "nombre|ip"
for pair in "Google DNS|8.8.8.8" "Cloudflare|1.1.1.1" "Quad9|9.9.9.9" "OpenDNS|208.67.222.222"; do
  NAME="${pair%%|*}"; IP="${pair##*|}"
  echo "  -> $NAME ($IP)"
  P=$(ping -c 4 -t 8 "$IP" 2>/dev/null)
  STATS=$(printf '%s' "$P" | awk -F'= ' '/min\/avg\/max/{print $2}' | awk '{print $1}')
  LOSS=$(printf '%s' "$P" | awk -F',' '/packet loss/{for(i=1;i<=NF;i++) if($i ~ /loss/){gsub(/[^0-9.]/,"",$i); print $i}}')
  MIN=""; AVG=""; MAX=""; REACH="false"
  if [ -n "$STATS" ]; then
    MIN=$(printf '%s' "$STATS" | cut -d/ -f1)
    AVG=$(printf '%s' "$STATS" | cut -d/ -f2)
    MAX=$(printf '%s' "$STATS" | cut -d/ -f3)
    REACH="true"
    echo "     responde: prom $AVG ms (min $MIN / max $MAX), perdida ${LOSS}%"
  else
    echo "     NO RESPONDE"
  fi
  TR=$(traceroute -n -w 2 -q 1 -m 20 "$IP" 2>&1)
  OBJ=$(printf '{"name":"%s","ip":"%s","reachable":%s,"min":"%s","avg":"%s","max":"%s","loss":"%s","trace":"%s"}' \
     "$(esc "$NAME")" "$(esc "$IP")" "$REACH" "$(esc "$MIN")" "$(esc "$AVG")" "$(esc "$MAX")" "$(esc "$LOSS")" "$(esc_multi "$TR")")
  [ -n "$DNS_JSON" ] && DNS_JSON="$DNS_JSON,"
  DNS_JSON="$DNS_JSON$OBJ"
done
echo ""

JSON=$(printf '{"tipo":"%s","interfaz":"%s","port":"%s","ip_local":"%s","ssid":"%s","signal":"%s","equipo":"%s","modelo":"%s","so":"%s","dns":[%s]}' \
  "$(esc "$TIPO")" "$(esc "$IFACE")" "$(esc "$PORT")" "$(esc "$IPLOCAL")" "$(esc "$SSID")" "$(esc "$SIGNAL")" "$(esc "$HOST")" "$(esc "$MODEL")" "$(esc "$OSV")" "$DNS_JSON")

RESP=$(curl -s -m 15 -X POST -H "Content-Type: application/json" -d "$JSON" "$API" 2>/dev/null)
if echo "$RESP" | grep -q '"ok":true'; then
  CODE=$(echo "$RESP" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p')
  echo "Reporte enviado a soporte. Codigo: $CODE"
else
  echo "No se pudo enviar al servidor (la deteccion de arriba sigue siendo valida)."
fi

echo ""
echo "Listo. Ya puedes cerrar esta ventana."
