#!/bin/bash
# ============================================================
#  S.I.N.S.A — Test de la FASE 2 (design system + HOME + dashboards)
#  Uso:
#     bash /var/www/sinsa/scripts/test-fase2.sh
#     bash /var/www/sinsa/scripts/test-fase2.sh https://sinsa.appr3.cloud
#
#  Sin argumento levanta un servidor PHP local en el puerto 8793
#  con el mismo DocumentRoot que usará Apache (public/).
# ============================================================

BASE="$1"
LOCAL=0
CK_ADMIN=$(mktemp)
CK_CLI=$(mktemp)
OK=0
FALLA=0

if [ -z "$BASE" ]; then
  BASE="http://127.0.0.1:8793"
  LOCAL=1
  php -S 127.0.0.1:8793 -t /var/www/sinsa/public >/dev/null 2>&1 &
  SRV=$!
  sleep 2
fi

echo "Probando contra: $BASE"
echo "============================================================"

chk() { # chk "titulo" "http_esperado" "texto_esperado" <respuesta>
  local titulo="$1" esperado="$2" contiene="$3" resp="$4"
  local code="${resp##*|}" body="${resp%|*}"
  if [ "$code" = "$esperado" ] && echo "$body" | grep -q -- "$contiene"; then
    printf "  OK    %-52s [HTTP %s]\n" "$titulo" "$code"; OK=$((OK+1))
  else
    printf "  FALLA %-52s [HTTP %s esperaba %s]\n" "$titulo" "$code" "$esperado"
    echo "        respuesta: $(echo "$body" | head -c 170)"; FALLA=$((FALLA+1))
  fi
}

req() { # req METODO url [data] [cookiejar]
  local m="$1" url="$2" data="$3" jar="$4"
  local args=(-sS -X "$m" -H 'Content-Type: application/json' -w '|%{http_code}')
  [ -n "$data" ] && args+=(-d "$data")
  [ -n "$jar" ] && args+=(-c "$jar" -b "$jar")
  curl "${args[@]}" "$url" 2>/dev/null
}

archivo() { # archivo "titulo" ruta "content-type esperado"
  local titulo="$1" ruta="$2" tipo="$3"
  local out code ct
  out=$(curl -sS -o /dev/null -w '%{http_code}|%{content_type}' "$BASE$ruta" 2>/dev/null)
  code="${out%%|*}"; ct="${out##*|}"
  if [ "$code" = "200" ] && echo "$ct" | grep -qi "$tipo"; then
    printf "  OK    %-52s [200 %s]\n" "$titulo" "$tipo"; OK=$((OK+1))
  else
    printf "  FALLA %-52s [HTTP %s ct=%s]\n" "$titulo" "$code" "$ct"; FALLA=$((FALLA+1))
  fi
}

echo "-- Shell de la SPA -----------------------------------------"
SHELL_HTML=$(req GET "$BASE/")
chk "index responde"                     200 '<main id="app">'       "$SHELL_HTML"
chk "splash de 8s presente"              200 'id="splash"'           "$SHELL_HTML"
chk "topbar presente"                    200 'id="topbar"'           "$SHELL_HTML"
chk "footer nav mobile presente"         200 'id="footer-nav"'       "$SHELL_HTML"
chk "contenedor de toasts"               200 'id="toasts"'           "$SHELL_HTML"
chk "botón de WhatsApp"                  200 'id="wa-float"'         "$SHELL_HTML"
chk "tema light por defecto"             200 'data-theme="light"'    "$SHELL_HTML"
chk "viewport sin zoom"                  200 'user-scalable=no'      "$SHELL_HTML"
chk "notranslate"                        200 'content="notranslate"' "$SHELL_HTML"
chk "theme-color de marca"               200 '#00994A'               "$SHELL_HTML"
chk "OG tags server-side"                200 'og:image'              "$SHELL_HTML"
chk "cache busting en assets"            200 'app.css?v='            "$SHELL_HTML"
chk "Lucide con versión fija"            200 'lucide@0.460.0'        "$SHELL_HTML"

echo "-- Assets --------------------------------------------------"
archivo "app.css se sirve"               "/assets/css/app.css"                    "css"
archivo "app.js se sirve"                "/assets/js/app.js"                      "javascript"
archivo "vista home.js"                  "/assets/js/vistas/home.js"              "javascript"
archivo "vista login.js"                 "/assets/js/vistas/login.js"             "javascript"
archivo "vista registro.js"              "/assets/js/vistas/registro.js"          "javascript"
archivo "vista dashboard-cliente.js"     "/assets/js/vistas/dashboard-cliente.js" "javascript"
archivo "vista dashboard-admin.js"       "/assets/js/vistas/dashboard-admin.js"   "javascript"
archivo "logo.png"                       "/assets/logo.png"                       "image/png"

CSS=$(req GET "$BASE/assets/css/app.css")
chk "CSS trae el verde del logo"         200 '#00994A'          "$CSS"
chk "CSS trae el degradé de esferas"     200 '#E5172B'          "$CSS"
chk "CSS define modo oscuro"             200 'data-theme="dark"' "$CSS"
chk "CSS bloquea selección de texto"     200 'user-select: none' "$CSS"
chk "CSS tiene ripple"                   200 'ripple-wave'       "$CSS"
chk "CSS modal con tope 90vh"            200 'max-height: 90vh'  "$CSS"
chk "CSS footer mobile fijo"             200 'footer-nav'        "$CSS"

echo "-- API pública ---------------------------------------------"
MARCA=$(req GET "$BASE/api/config.php?action=marca")
chk "config marca responde"              200 '"ok":true'            "$MARCA"
chk "marca trae el nombre real"          200 'S.I.N.S.A'            "$MARCA"
chk "marca trae el logo"                 200 'assets.*logo\.png'    "$MARCA"
chk "marca trae la filosofía"            200 'restricción'          "$MARCA"

INICIO=$(req GET "$BASE/api/config.php?action=inicio")
chk "config inicio responde"             200 '"ok":true'            "$INICIO"
chk "inicio trae planes reales"          200 'Plan 360'             "$INICIO"
chk "inicio trae el título del home"     200 '"titulo"'             "$INICIO"
chk "inicio trae los pasos del método"   200 '"metodo"'             "$INICIO"
chk "inicio trae la bio de Rosana"       200 'Rosana'               "$INICIO"
chk "inicio NO expone transformación oculta" 200 '"transformaciones":\[\]' "$INICIO"

chk "config: acción inexistente da 404"  404 'no válida'  "$(req GET "$BASE/api/config.php?action=nada")"
chk "config: POST rechazado"             405 'no permitido' "$(req POST "$BASE/api/config.php?action=marca")"
chk "config: guardar aún no existe"      404 'no válida'  "$(req GET "$BASE/api/config.php?action=guardar")"

echo "-- Métricas: control de acceso -----------------------------"
chk "metrics admin sin sesión: 401"      401 'No autenticado' "$(req GET "$BASE/api/metrics.php?action=admin")"
chk "metrics cliente sin sesión: 401"    401 'No autenticado' "$(req GET "$BASE/api/metrics.php?action=cliente")"
chk "metrics acción inválida: 404"       404 'no válida'      "$(req GET "$BASE/api/metrics.php?action=nada")"
chk "metrics POST rechazado"             405 'no permitido'   "$(req POST "$BASE/api/metrics.php?action=admin")"

echo "-- Sesión admin --------------------------------------------"
chk "login admin"                        200 '"rol":"admin"' \
  "$(req POST "$BASE/api/auth.php?action=login" '{"username":"adminapp","password":"Admin2026_"}' "$CK_ADMIN")"
MET_ADMIN=$(req GET "$BASE/api/metrics.php?action=admin" '' "$CK_ADMIN")
chk "metrics admin con sesión"           200 '"metricas"'          "$MET_ADMIN"
chk "metrics admin cuenta clientes"      200 'clientes_total'      "$MET_ADMIN"
chk "metrics admin trae ingresos"        200 'ingresos_mes'        "$MET_ADMIN"
chk "metrics admin lista últimos"        200 'ultimos_clientes'    "$MET_ADMIN"
chk "admin puede ver su propio resumen"  200 '"ok":true'           "$(req GET "$BASE/api/metrics.php?action=cliente" '' "$CK_ADMIN")"

echo "-- Sesión cliente ------------------------------------------"
chk "login cliente"                      200 '"rol":"cliente"' \
  "$(req POST "$BASE/api/auth.php?action=login" '{"username":"clienteprueba","password":"Prueba2026"}' "$CK_CLI")"
MET_CLI=$(req GET "$BASE/api/metrics.php?action=cliente" '' "$CK_CLI")
chk "metrics cliente con sesión"         200 '"ok":true'        "$MET_CLI"
chk "cliente sin plan activo -> null"    200 '"plan_activo":null' "$MET_CLI"
chk "cliente sin compras -> lista vacía" 200 '"compras":\[\]'   "$MET_CLI"
chk "cliente sin progreso -> vacío"      200 '"progreso":\[\]'  "$MET_CLI"
chk "CLIENTE NO accede a metrics admin"  403 'Sin permisos'     "$(req GET "$BASE/api/metrics.php?action=admin" '' "$CK_CLI")"

echo "-- Regresión Fase 1 ----------------------------------------"
chk "health sigue ok"                    200 '"tablas":6'  "$(req GET "$BASE/api/health.php")"
chk "me con sesión admin"                200 'adminapp'    "$(req GET "$BASE/api/auth.php?action=me" '' "$CK_ADMIN")"
chk "logout admin"                       200 '"ok":true'   "$(req POST "$BASE/api/auth.php?action=logout" '' "$CK_ADMIN")"
chk "me tras logout"                     200 '"user":null' "$(req GET "$BASE/api/auth.php?action=me" '' "$CK_ADMIN")"
chk "login con clave mala sigue 401"     401 'incorrectos' \
  "$(req POST "$BASE/api/auth.php?action=login" '{"username":"adminapp","password":"zzzzzzzz"}')"

echo "============================================================"
echo "  $OK OK · $FALLA fallas"

rm -f "$CK_ADMIN" "$CK_CLI"
rm -f /var/www/sinsa/logs/ratelimit/*.json 2>/dev/null
if [ "$LOCAL" = "1" ]; then
  kill "$SRV" 2>/dev/null
  wait "$SRV" 2>/dev/null
fi

exit $([ "$FALLA" -eq 0 ] && echo 0 || echo 1)
