"""Smoke test de las funciones de api_obras.py"""
import json
import sys
from pathlib import Path

if sys.stdout.encoding and sys.stdout.encoding.lower() != "utf-8":
    sys.stdout.reconfigure(encoding="utf-8")

sys.path.insert(0, str(Path(__file__).parent))
import api_obras as api

conn = api.get_conn()

def show(label, obj, preview=True):
    print(f"\n-- {label} --")
    if preview and isinstance(obj, (list, dict)):
        s = json.dumps(obj, default=str, ensure_ascii=False, indent=2)
        if len(s) > 800:
            s = s[:800] + "\n... [truncado]"
        print(s)
    else:
        print(obj)

# 1. list_obras
show("GET /api/obras", api.list_obras(conn))

# 2. get_obra TDG1
show("GET /api/obras/TDG1", api.get_obra(conn, "TDG1"))

# 3. get_obra inexistente
show("GET /api/obras/XXXX (no existe)", api.get_obra(conn, "XXXX"))

# 4. rubros
rubros = api.get_rubros(conn, "TDG1")
print(f"\n-- GET /api/obras/TDG1/rubros: {len(rubros)} rubros, suma pesos = {sum(r['peso_pct'] for r in rubros):.4f} --")
for r in rubros[:5]:
    print(f"  {r['orden']:2d} {r['nombre']:25s} peso={r['peso_pct']:.4f}")

# 5. subcontratistas
subs = api.get_subcontratistas(conn, "TDG1")
print(f"\n-- GET /api/obras/TDG1/subcontratistas: {len(subs)} items --")
for s in subs[:3]:
    print(f"  {s['orden']} {s['nombre']} (rubro: {s.get('rubro') or '-'})")

# 6. avance agregado
av = api.get_avance(conn, "TDG1")
corte_agg = [a for a in av["agregado"] if a["mes"] == "2025-01"]
print(f"\n-- GET /api/obras/TDG1/avance (muestra) --")
print(f"  rubros: {len(av['rubros'])}, meses: {len(av['meses'])}")
print(f"  agregado corte 2025-01: {corte_agg}")

# 7. presupuesto agregado
pr = api.get_presupuesto(conn, "TDG1")
last_3 = pr["agregado"][-3:]
print(f"\n-- GET /api/obras/TDG1/presupuesto (ultimos 3 meses agregados) --")
for row in last_3:
    print(f"  {row['mes']}: plan={row['plan_mes']:,.0f}  real={row['real_mes']}")

# 8. EVM
evm = api.get_evm(conn, "TDG1")
show("GET /api/obras/TDG1/evm", evm)

# 9. alertas (F11 R1-R8: shape polimorfica segun regla)
al = api.get_alertas(conn, "TDG1")
print(f"\n-- GET /api/obras/TDG1/alertas: {al['total']} alertas --")
for a in al["alertas"][:5]:
    label = a.get("rubro") or a.get("contrato") or a.get("tipo", "?")
    if "desvio_pp" in a:
        extra = f"desvio {a['desvio_pp']:+.1f} pp"
    else:
        extra = a.get("regla_id", "-")
    print(f"  [{a['estado']:8s}] {label:30s} {extra}")

# 10. asistencia resumen
asist = api.get_asistencia(conn, "TDG1")
print(f"\n-- GET /api/obras/TDG1/asistencia: {len(asist['dias'])} dias --")
print(f"  resumen: {asist['resumen']}")

# 11. contratos
co = api.get_contratos(conn, "TDG1")
print(f"\n-- GET /api/obras/TDG1/contratos: {len(co)} items --")
for c in co:
    print(f"  [{c['estado']:10s}] {c['tipo']:40s} sub: {c['subcontratista'] or '-'}")

# 12. materiales
mat = api.get_materiales(conn, "TDG1")
print(f"\n-- GET /api/obras/TDG1/materiales: {len(mat)} items --")
for m in mat:
    print(f"  {m['item']:25s} {m['recibido']:>8,.0f} {m['unidad']:5s}  consumido {m['consumido']:>8,.0f}  saldo {m['saldo']:>8,.0f}")

# 13. Validacion: serializar todo a JSON valido (lo que el servidor enviara)
print("\n-- TEST SERIALIZACION JSON --")
payloads = {
    "/api/obras": api.list_obras(conn),
    "/api/obras/TDG1": api.get_obra(conn, "TDG1"),
    "/api/obras/TDG1/rubros": api.get_rubros(conn, "TDG1"),
    "/api/obras/TDG1/evm": api.get_evm(conn, "TDG1"),
    "/api/obras/TDG1/alertas": api.get_alertas(conn, "TDG1"),
}
for path, data in payloads.items():
    try:
        size = len(json.dumps(data, default=str, ensure_ascii=False))
        print(f"  [OK] {path:40s} -> {size:>6d} bytes JSON")
    except Exception as e:
        print(f"  [FAIL] {path}: {e}")

conn.close()
print("\nAPI smoke test OK.")
