#!/bin/sh
# Сброс сетевого стека macOS после смены хотспота / «интернет не поднимается без перезагрузки».
# Типичная причина в связке с docs/connectivity: системный PAC на localhost:1089 при мёртвом/ещё не
# поднятом PAC-сервере + кэш DNS / Wi‑Fi. См. HOTSPOT_NETWORK_EMERGENCY.md
#
# Использование (из корня репозитория):
#   ./docs/connectivity/scripts/macos-hotspot-network-recover.sh status
#   ./docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
#
# Переменные:
#   MACOS_PAC_SERVICES  — как в macos-system-pac.sh (по умолчанию Wi-Fi|Thunderbolt Bridge 2)
#   WIFI_DEVICE         — например en0; иначе авто: первый Device у Hardware Port: Wi-Fi

set -e
ROOT="$(cd "$(dirname "$0")" && pwd)"
PAC_SCRIPT="$ROOT/macos-system-pac.sh"

wifi_device() {
  if [ -n "${WIFI_DEVICE:-}" ]; then
    printf '%s\n' "$WIFI_DEVICE"
    return
  fi
  # "Device: en0" под блоком "Hardware Port: Wi-Fi"
  networksetup -listallhardwareports 2>/dev/null \
    | awk '/Hardware Port: Wi-Fi$/ {p=1; next} p && /^Device: / {print $2; exit}'
}

usage() {
  printf '%s\n' "Usage: $(basename "$0") status|recover" >&2
  exit 1
}

[ "$#" -eq 1 ] || usage
cmd=$1

case "$cmd" in
  status)
    echo "=== Wi-Fi device (hardware) ==="
    wifi_device || true
    echo "=== networksetup -listallnetworkservices (excerpt) ==="
    networksetup -listallnetworkservices 2>/dev/null | head -15 || true
    echo "=== PAC / autoproxy (Wi-Fi + Thunderbolt Bridge 2 if present) ==="
    if [ -x "$PAC_SCRIPT" ]; then
      MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" status || true
    fi
    echo "=== SOCKS firewall (Wi-Fi) ==="
    networksetup -getsocksfirewallproxy "Wi-Fi" 2>/dev/null || true
    echo "=== Web proxy (Wi-Fi) ==="
    networksetup -getwebproxy "Wi-Fi" 2>/dev/null || true
    echo "=== Listener on 1089 (PAC URL default) ==="
    if lsof -i :1089 -sTCP:LISTEN 2>/dev/null | head -5; then
      :
    else
      echo "(none — при Enabled PAC в Safari/системе возможны сбои)"
    fi
    echo "=== Default route ==="
    route -n get default 2>/dev/null | head -12 || true
    echo "=== Quick reachability (ICMP may be blocked on some hotspots) ==="
    ping -c 1 -W 2000 1.1.1.1 >/dev/null 2>&1 && echo "ping 1.1.1.1: ok" || echo "ping 1.1.1.1: fail"
    ;;
  recover)
    echo "1) Отключаем автоматический PAC на выбранных сервисах..."
    if [ -x "$PAC_SCRIPT" ]; then
      MACOS_PAC_SERVICES="${MACOS_PAC_SERVICES:-Wi-Fi|Thunderbolt Bridge 2}" "$PAC_SCRIPT" off
    else
      echo "WARN: нет $PAC_SCRIPT — вручную: Системные настройки → Сеть → Wi‑Fi → Подробнее → Прокси → снять «Автоматическая настройка прокси»" >&2
    fi
    echo "2) Отключаем системный SOCKS-прокси на Wi-Fi (если был включён Shadowsocks и т.п.)..."
    if networksetup -listallnetworkservices 2>/dev/null | grep -Fqx "Wi-Fi"; then
      networksetup -setsocksfirewallproxystate "Wi-Fi" off 2>/dev/null || true
    fi
    echo "3) Сброс DNS-кэша (нужен sudo)..."
    if sudo -n true 2>/dev/null; then
      sudo dscacheutil -flushcache 2>/dev/null || true
      sudo killall -HUP mDNSResponder 2>/dev/null || true
      echo "   mDNSResponder перезагружен."
    else
      echo "   Пропуск (нет sudo без пароля). Выполните вручную:"
      echo "   sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder"
    fi
    dev="$(wifi_device)"
    if [ -n "$dev" ]; then
      echo "4) Обновление DHCP на $dev (нужен sudo)..."
      if sudo -n true 2>/dev/null; then
        sudo ipconfig set "$dev" DHCP 2>/dev/null || true
      else
        echo "   Пропуск. Вручную: sudo ipconfig set $dev DHCP"
      fi
      echo "5) Краткое выключение/включение Wi‑Fi радиомодуля ($dev)..."
      networksetup -setairportpower "$dev" off 2>/dev/null || true
      sleep 2
      networksetup -setairportpower "$dev" on 2>/dev/null || true
    else
      echo "4–5) Не удалось определить Wi‑Fi device — пропуск DHCP/airport power. Вручную выключите/включите Wi‑Fi в меню."
    fi
    echo "=== Готово. Проверка: ==="
    "$0" status
    echo ""
    echo "Если интернет всё ещё нет: откройте хотспот в браузере (captive portal), затем при необходимости снова включите PAC:"
    echo "  ./docs/connectivity/scripts/macos-pac-on.sh"
    ;;
  *)
    usage
    ;;
esac
