#!/usr/bin/env bash
# Setup MD Karaoke Fest en Lenovo (CachyOS/Arch-based)
# Idempotente: ejecutarlo varias veces no rompe nada.
set -euo pipefail
echo "▶ Setup MD Karaoke Fest en Lenovo (CachyOS/Arch)"
cd "$(dirname "$0")"

# Verificar deps de sistema
MISSING=0
for cmd in python3 ffmpeg pacat pactl npx curl; do
  if ! command -v "$cmd" >/dev/null 2>&1; then
    echo "  ⚠️ Falta: $cmd"
    MISSING=1
  fi
done

if [ "$MISSING" -eq 1 ]; then
  echo
  echo "Instala los faltantes con:"
  echo "  sudo pacman -S --needed python ffmpeg pulseaudio-utils nodejs-lts-jod npm curl"
  echo
  read -r -p "¿Continuar de todos modos? [y/N] " resp
  [[ "${resp:-N}" =~ ^[Yy]$ ]] || { echo "Abortado."; exit 1; }
fi

# Crear venv aislado
if [ ! -d venv ]; then
  echo "▶ Creando venv Python aislado..."
  python3 -m venv venv
fi
# shellcheck disable=SC1091
source venv/bin/activate

# Instalar deps Python
echo "▶ Instalando dependencias Python..."
pip install -q --upgrade pip
if [ -f requirements-pinned.txt ] && [ -s requirements-pinned.txt ]; then
  pip install -q -r requirements-pinned.txt
else
  pip install -q fastapi uvicorn websockets pydantic python-dotenv requests
fi

# Crear admin/.env si no existe (no sobrescribe si ya hay uno)
if [ ! -f admin/.env ]; then
  echo "▶ Creando admin/.env por defecto (CAMBIA EL PASSWORD después)..."
  cat > admin/.env << 'EOFENV'
ADMIN_USER=diego
ADMIN_PASSWORD=D13g0$$2026
EOFENV
  chmod 600 admin/.env
else
  echo "  ✓ admin/.env ya existe — no se sobrescribe"
fi

# Verificar PipeWire/Pulse sink HDMI antes de configurar
echo
echo "▶ Sinks de audio detectados:"
pactl list sinks short || echo "  (pactl falló — verifica que PipeWire/Pulse esté corriendo)"
echo
DEFAULT_SINK="$(pactl get-default-sink 2>/dev/null || echo unknown)"
echo "  Default sink actual: $DEFAULT_SINK"
if [[ "$DEFAULT_SINK" == "karaoke_mic" ]]; then
  echo "  ⚠️ ATENCIÓN: el default sink es karaoke_mic (virtual). Cámbialo a HDMI:"
  echo "     pactl set-default-sink <hdmi-sink-name>"
fi

# Setup karaoke_mic null sink + loopback (idempotente: el script lo verifica)
if [ -f scripts/setup-mic-sink.sh ]; then
  echo
  echo "▶ Configurando karaoke_mic null-sink..."
  bash scripts/setup-mic-sink.sh || echo "  ⚠️ setup-mic-sink falló — revisa manualmente"
fi

# === FASE OPCIONAL: Caddy local + Tailscale Funnel para acceso público ===
echo
echo "▶ ¿Configurar Tailscale Funnel propio para acceso público desde móviles externos?"
echo "  Esto montará Caddy local en :8091 con path routing y expondrá HTTPS pública."
echo "  Requiere tailscale ya autenticado (verificación: tailscale status)."
echo "  ⚠️  Vas a necesitar autenticar sudo (tailscale serve/funnel requieren root)."
read -r -p "  [Y/n] " setup_funnel
setup_funnel="${setup_funnel:-Y}"

if [[ "$setup_funnel" =~ ^[Yy]$ ]]; then
  # Verificar tailscale
  if ! command -v tailscale >/dev/null 2>&1; then
    echo "  ❌ tailscale no instalado. Instala con:"
    echo "       sudo pacman -S tailscale && sudo systemctl enable --now tailscaled && sudo tailscale up"
    echo "  ⏭ Saltando setup Funnel."
  else
    # Verificar que tailscale esté autenticado (no exit, solo warn)
    if ! tailscale status >/dev/null 2>&1; then
      echo "  ⚠️ tailscale instalado pero no autenticado. Ejecuta: sudo tailscale up"
      echo "  ⏭ Saltando setup Funnel."
    else
      # Verificar caddy o instalar
      if ! command -v caddy >/dev/null 2>&1; then
        echo "  ▶ Instalando caddy via pacman..."
        if ! sudo pacman -S --noconfirm caddy; then
          echo "  ⚠️ pacman -S caddy falló (puede no estar en repo oficial CachyOS)."
          echo "     Fallback: descarga binario desde https://caddyserver.com/download"
          echo "     Comando sugerido:"
          echo "       curl -fsSL 'https://caddyserver.com/api/download?os=linux&arch=amd64' \\"
          echo "         -o /tmp/caddy && chmod +x /tmp/caddy && sudo mv /tmp/caddy /usr/local/bin/caddy"
          read -r -p "  ¿Reintentar después de instalar manualmente? [y/N] " retry
          if [[ ! "${retry:-N}" =~ ^[Yy]$ ]]; then
            echo "  ⏭ Saltando setup Funnel."
            echo "✅ Setup base completo (sin Funnel)."
            echo
            echo "Para arrancar el evento:"
            echo "  cd $(pwd)"
            echo "  source venv/bin/activate"
            echo "  bash scripts/start-event.sh"
            exit 0
          fi
        fi
      fi

      # Generar Caddyfile local en ~/karaoke/local-Caddyfile
      mkdir -p "$HOME/karaoke"
      cat > "$HOME/karaoke/local-Caddyfile" <<'EOFCADDY'
:8091 {
    handle /api/* {
        reverse_proxy 127.0.0.1:8082
    }
    handle_path /admin/* {
        reverse_proxy 127.0.0.1:8082
    }
    handle /mic-ws* {
        reverse_proxy 127.0.0.1:8081
    }
    redir /karaoke /player/mic.html 302
    redir /k /player/mic.html 302
    reverse_proxy 127.0.0.1:8080

    log {
        output stdout
        format console
    }
}
EOFCADDY

      echo "  ▶ Validando Caddyfile..."
      if ! caddy validate --config "$HOME/karaoke/local-Caddyfile" --adapter caddyfile; then
        echo "  ❌ Caddyfile inválido — revisa $HOME/karaoke/local-Caddyfile"
      else
        # Arrancar caddy local en background (idempotente)
        if pgrep -f "caddy run.*local-Caddyfile" >/dev/null 2>&1; then
          echo "  ✓ caddy local ya corriendo"
        else
          echo "  ▶ Arrancando caddy local en :8091 (background, log /tmp/caddy-local.log)..."
          nohup caddy run --config "$HOME/karaoke/local-Caddyfile" --adapter caddyfile \
            > /tmp/caddy-local.log 2>&1 &
          sleep 2
        fi

        # Configurar Tailscale Serve + Funnel (idempotente: --bg ignora si ya activo)
        echo "  ▶ Configurando tailscale serve (HTTPS:443 -> localhost:8091)..."
        if ! sudo tailscale serve --bg --https=443 http://localhost:8091; then
          echo "  ⚠️ tailscale serve falló — pruébalo manualmente:"
          echo "       sudo tailscale serve --bg --https=443 http://localhost:8091"
        fi

        echo "  ▶ Activando Funnel..."
        if ! sudo tailscale funnel --bg 443 on; then
          echo "  ⚠️ tailscale funnel falló — pruébalo manualmente:"
          echo "       sudo tailscale funnel --bg 443 on"
        fi

        # Mostrar URL final
        TAILSCALE_DOMAIN=""
        if command -v python3 >/dev/null 2>&1; then
          TAILSCALE_DOMAIN=$(sudo tailscale status --json 2>/dev/null | python3 -c "
import json,sys
try:
    d=json.load(sys.stdin)
    me=d.get('Self',{})
    name=me.get('DNSName','').rstrip('.')
    print(name)
except Exception:
    pass
" 2>/dev/null)
        fi

        if [ -n "$TAILSCALE_DOMAIN" ]; then
          echo
          echo "  ✅ Funnel activo. URL pública para cantantes:"
          echo "       https://$TAILSCALE_DOMAIN/karaoke"
          echo "       https://$TAILSCALE_DOMAIN/admin/"
          echo
          echo "     Comparte el primer link por WhatsApp con los cantantes."
        else
          echo "  ⚠️ No pude detectar el dominio Tailscale. Verifica con:"
          echo "       sudo tailscale serve status"
        fi
      fi
    fi
  fi
else
  echo "  ⏭ Saltando setup Funnel (modo LAN local)"
fi

echo
echo "✅ Setup completo."
echo
echo "Para arrancar el evento:"
echo "  cd $(pwd)"
echo "  source venv/bin/activate"
echo "  bash scripts/start-event.sh"
