#!/bin/bash
# ============================================================
#  S.I.N.S.A — Test de la FASE 1 (infraestructura + auth)
#  Uso:
#     bash /var/www/sinsa/scripts/test-fase1.sh
#     bash /var/www/sinsa/scripts/test-fase1.sh https://sinsa.appr3.cloud
#
#  Sin argumento levanta un servidor PHP local en el puerto 8791
#  y prueba contra él (sirve aunque el vhost del dominio no exista).
# ============================================================

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

if [ -z "$BASE" ]; then
  BASE="http://127.0.0.1:8791"
  LOCAL=1
  php -S 127.0.0.1:8791 -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_con_codigo>
  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    %-46s [HTTP %s]\n" "$titulo" "$code"; OK=$((OK+1))
  else
    printf "  FALLA %-46s [HTTP %s esperaba %s]\n" "$titulo" "$code" "$esperado"
    echo "        respuesta: $(echo "$body" | head -c 160)"; 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
}

chk "health.php responde ok" 200 '"ok":true' "$(req GET "$BASE/api/health.php")"
chk "health.php ve las 6 tablas" 200 '"tablas":6' "$(req GET "$BASE/api/health.php")"
chk "login admin correcto" 200 '"rol":"admin"' \
    "$(req POST "$BASE/api/auth.php?action=login" '{"username":"adminapp","password":"Admin2026_"}' "$COOKIES")"
chk "me devuelve la sesión activa" 200 '"username":"adminapp"' \
    "$(req GET "$BASE/api/auth.php?action=me" '' "$COOKIES")"
chk "login con clave incorrecta rechaza" 401 'incorrectos' \
    "$(req POST "$BASE/api/auth.php?action=login" '{"username":"adminapp","password":"xxxxxxxx"}')"
chk "registro sin nombre rechaza" 400 'nombre' \
    "$(req POST "$BASE/api/auth.php?action=registro" '{"username":"testxyz","email":"a@b.com","password":"Prueba2026","nombre":""}')"
chk "registro con clave corta rechaza" 400 '8 caracteres' \
    "$(req POST "$BASE/api/auth.php?action=registro" '{"username":"testxyz","email":"a@b.com","password":"123","nombre":"Test"}')"
chk "logout cierra la sesión" 200 '"ok":true' \
    "$(req POST "$BASE/api/auth.php?action=logout" '' "$COOKIES")"
chk "me sin sesión devuelve user null" 200 '"user":null' \
    "$(req GET "$BASE/api/auth.php?action=me" '' "$COOKIES")"
chk "shell index con OG tags del servidor" 200 'og:title' "$(req GET "$BASE/")"

CODE=$(curl -sS -o /dev/null -w '%{http_code}' "$BASE/assets/logo.png" 2>/dev/null)
if [ "$CODE" = "200" ]; then printf "  OK    %-46s [HTTP 200]\n" "logo.png se sirve"; OK=$((OK+1));
else printf "  FALLA %-46s [HTTP %s]\n" "logo.png se sirve" "$CODE"; FALLA=$((FALLA+1)); fi

echo "------------------------------------------------------------"
echo "  $OK OK · $FALLA fallas"

rm -f "$COOKIES"
rm -f /var/www/sinsa/logs/ratelimit/*.json 2>/dev/null
[ "$LOCAL" = "1" ] && kill "$SRV" 2>/dev/null

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