"""Prueba E2E contra producción: flujo completo RA2 CDT1 con anti-trampa."""
import json
import sys
import urllib.request

BASE = sys.argv[1] if len(sys.argv) > 1 else "http://192.168.0.150:8081"


def post(ruta, cuerpo):
    req = urllib.request.Request(f"{BASE}/{ruta}",
                                 data=json.dumps(cuerpo).encode(),
                                 headers={"Content-Type": "application/json"})
    try:
        with urllib.request.urlopen(req, timeout=10) as r:
            return r.status, json.loads(r.read())
    except urllib.error.HTTPError as e:
        return e.code, json.loads(e.read() or b"{}")


PERFECTAS = {
    "0": "Na+", "1": "Cl-", "2": "8", "3": "6",
    "4": "Catión", "5": "Anión", "6": "11", "7": "10", "8": "18",
    "9": "Catión sodio", "10": "Anión cloruro", "11": "20", "12": "18",
    "13": "Anión", "14": "Catión", "15": "13", "16": "10",
    "17": "Pierde", "18": "Gana", "19": "Negativa",
}

fallos = []

# 1. Iniciar sesión
estado, datos = post("iniciar-ra2", {"apellidos": "Prueba E2E", "nombres": "Temporal",
                                     "carrera": "Electrónica", "clave": "99"})
token = datos.get("token", "")
print("iniciar:", estado, "token:", token[:8] + "…")
if not (estado == 200 and datos.get("ok")):
    fallos.append("iniciar")

# 2. Página sirve HTML con anti-trampa
try:
    with urllib.request.urlopen(f"{BASE}/ra2-cdt1", timeout=10) as r:
        html = r.read().decode()
    claves = ("fullscreenchange", "registrarAntiTrampa", "incidente-ra2",
              "guardar-ra2", "btn-iniciar")
    ok_pagina = all(c in html for c in claves)
    print("página con anti-trampa:", "PASS" if ok_pagina else "FAIL",
          "(faltan:", [c for c in claves if c not in html], ")")
    if not ok_pagina:
        fallos.append("pagina")
except Exception as e:
    fallos.append(f"pagina:{e}")

# 3. Incidente válido
estado, datos = post("incidente-ra2", {"token": token, "tipo": "pestana_oculta"})
print("incidente:", estado, datos)
if not (estado == 200 and datos.get("incidentes") == 1):
    fallos.append("incidente")

# 4. Incidente inválido rechazado
estado, _ = post("incidente-ra2", {"token": token, "tipo": "hackeo"})
print("incidente inválido rechazado:", "PASS" if estado == 400 else "FAIL", estado)
if estado != 400:
    fallos.append("incidente_invalido")

# 5. Guardar con respuestas perfectas + 1 incidente → nota 95
estado, datos = post("guardar-ra2", {"token": token, "respuestas": PERFECTAS})
r = datos.get("resultado", {})
print(f"guardar: {estado} → academico={r.get('academico')} "
      f"nota_final={r.get('nota_final')} incidentes={r.get('incidentes_trampa')}")
if not (estado == 200 and r.get("academico") == 100 and r.get("nota_final") == 95):
    fallos.append("guardar")

# 6. Reenvío bloqueado (409)
estado, _ = post("guardar-ra2", {"token": "reusado", "respuestas": {}})
print("reenvío/duplicado bloqueado:", "PASS" if estado in (400, 409) else "FAIL")

print("\n" + ("✅ E2E PASS" if not fallos else f"❌ FALLOS: {fallos}"))
