#!/usr/bin/env python3
"""Genera Agenda DOCX + HTML Dashboard para Bruna Peru Weekly Review — 20 julio 2026"""

import sys
sys.path.insert(0, '/home/node/.hermes/venv/lib/python3.13/site-packages')

from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
import datetime, os

FECHA = "20 de julio, 2026"
FECHA_FILE = "2026-07-20"
OUTPUT_DIR = "/home/node/workspace/bruna-peru/outputs"
os.makedirs(OUTPUT_DIR, exist_ok=True)

# ─── Colores ──────────────────────────────────────────────────────────
NAVY   = RGBColor(0x1B, 0x4F, 0x72)
ACCENT = RGBColor(0x2E, 0x86, 0xC1)
RED    = RGBColor(0xC0, 0x39, 0x2B)
ORANGE = RGBColor(0xE6, 0x7E, 0x22)
GREEN  = RGBColor(0x27, 0xAE, 0x60)
PURPLE = RGBColor(0x8E, 0x44, 0xAD)
YELLOW = RGBColor(0xF1, 0xC4, 0x0F)
GRAY   = RGBColor(0x95, 0xA5, 0xA6)
DARK   = RGBColor(0x2C, 0x3E, 0x50)

STATUS_COLORS = {
    "HECHO": GREEN,
    "AVANZADO": YELLOW,
    "NO AVANZADO": RED,
    "VERIFICAR": ORANGE,
    "NUEVO": PURPLE,
}

def add_heading(doc, text, level=1, color=NAVY):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(12 if level == 1 else 8)
    p.paragraph_format.space_after = Pt(4)
    run = p.add_run(text)
    run.bold = True
    run.font.size = Pt(18 if level == 1 else 13 if level == 2 else 11)
    run.font.color.rgb = color
    return p

def add_status_item(doc, text, status, responsible="", indent_in=0.3):
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Inches(indent_in)
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)
    badge = p.add_run(f"[{status}] ")
    badge.bold = True
    badge.font.color.rgb = STATUS_COLORS.get(status, DARK)
    badge.font.size = Pt(10)
    main = p.add_run(text)
    main.font.size = Pt(10)
    if responsible:
        rr = p.add_run(f"  \u2192 {responsible}")
        rr.font.color.rgb = ACCENT
        rr.font.size = Pt(9)
    return p

def add_divider(doc):
    p = doc.add_paragraph("\u2500" * 80)
    p.paragraph_format.space_before = Pt(4)
    p.paragraph_format.space_after = Pt(4)
    p.runs[0].font.color.rgb = ACCENT
    p.runs[0].font.size = Pt(7)

def add_bullet(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Inches(0.4)
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)
    run = p.add_run(f"\u2022 {text}")
    run.font.size = Pt(10)
    return p

# ─── Datos actualizados 20 julio 2026 ─────────────────────────────────
# INTELIGENCIA SEMANA 14 – 20 JUL 2026:
# • Read.AI (16 jul) — Bruna Brain (Teams): M1 corrió con 1,880 partidas arancelarias
#   Solo 56 filas pasaron a revisión manual como prospectos activos
#   M2 scoring operativo (activo/nurturing/descartado). Pipeline M1→M2 automatizado lunes 7am
#   Créditos: 9.6 de 20 restantes — optimizar volumen corridas futuras
#   PENDIENTES: Andrés revisar lista prospectos + dar feedback | Stiff MCP LinkedIn
# • Read.AI (16 jul) — BRUNA - FINKA METALS / PLATAFORMA:
#   Marketplace minería + concentrados, entidad Suiza, lanzamiento Q4 2026
#   Bruna tiene portafolio 13 productos para minería — CF contactará CEO Volcán para pruebas
#   PENDIENTE CRÍTICO: Victor Alfaro — enviar lista 13 productos a CF esta semana
#   Andrés — hacer debugging técnico en plataforma y compartir resultados
# • Google Alerts TiO2 (sem completa): Henan Billions, Kronos, Lomon, TiO2, Tronox, ilmenite activos
# • Andrés viajó a Lima sábado 19 jul — primera visita de campo de esta semana
# • Sin emails directos de: Daryza, Aurora, Romex, Cafetal, Minería, Universal Colors, Qroma

pendientes = {
    "Victor Alfaro": {
        "rol": "Gerente General Lima",
        "items": [
            ("NUEVO CRÍTICO: Enviar lista 13 productos Bruna a CF (Finka Metals) para evaluación — acordado 16 jul", "NUEVO"),
            ("Oscar Rosas (Minería) — confirmar status reunión + propuesta MIBC/xantatos cerrada?", "VERIFICAR"),
            ("Cold visits Qroma (Baldion) — neopreno, caucho clorado, parafina: update semanal", "VERIFICAR"),
            ("Prospectos pintura (Anipsa, Perupaint, Soprint, Interpaint) — cold visits: reportar esta semana", "VERIFICAR"),
            ("Plásticos (Tigre, Andinaplast, Nicoll) — cera PE, TiO2: status cotizaciones", "VERIFICAR"),
            ("Alimentos (Pursuit, JAVA, Creafoods) — pipeline ácidos y especialidades: update", "VERIFICAR"),
        ]
    },
    "Jennifer Segura": {
        "rol": "Líder Mercado Perú",
        "items": [
            ("Cotización formal Daryza (lista 30+ MPs de Urbina recibida 11 mar) — OVERDUE 19 SEMANAS", "NO AVANZADO"),
            ("Reunión con José Urbina (Daryza) — ejecutar esta semana SIN excepción", "NO AVANZADO"),
            ("Aurora Paint — resinas epóxicas VYTA BPA: confirmar respuesta o re-cotizar", "VERIFICAR"),
            ("Universal Colors — TiO2 588 y óxidos hierro (Murillo/Erika): Google Alerts TiO2 activos toda la semana", "VERIFICAR"),
            ("Profinne — seguimiento MPs especiales: status cotización", "VERIFICAR"),
        ]
    },
    "Andres Bruna": {
        "rol": "Director Nuevos Mercados",
        "items": [
            ("NUEVO: Revisar lista prospectos M1/M2 (56 activos) y dar feedback al equipo esta semana", "NUEVO"),
            ("NUEVO: Debugging técnico en plataforma Finka Metals y compartir resultados — acordado 16 jul", "NUEVO"),
            ("Oral Care — confirmar próximos pasos: fórmula Ruby, tubos, equipos", "VERIFICAR"),
            ("Grupo Romero — Rafa Villa, Pedro Clay, Estefanía Loza: reagendar reunión (de viaje 19-26 jul)", "VERIFICAR"),
            ("Alimentos — Pursuit, JAVA, Creafoods: ácidos y especialidades pipeline", "VERIFICAR"),
            ("Lima 19 jul (EJECUTADO). Santiago/Temuco 21 jul, Buenos Aires 26 jul — coordinar cobertura equipo.", "AVANZADO"),
        ]
    },
    "Jorge Bruna": {
        "rol": "Empaques / Oral Care",
        "items": [
            ("Oral Care — verificar si Diego Gómez envió req formal a planeamiento de Lurín (4 semanas sin confirmar)", "NO AVANZADO"),
            ("Coordinar asistencia presencial prueba impresión + armado tubos en Lurín", "VERIFICAR"),
            ("Confirmar: tratamiento Corona disponible + energía superficial muestras antes de imprimir", "VERIFICAR"),
            ("Romex/Nico — update tapas y liners: status producción semanal", "VERIFICAR"),
        ]
    },
    "Carlos Artavia": {
        "rol": "Logística / SPU",
        "items": [
            ("Cafetal K2CO3 — pago impuestos + liberación carga con Ileana: RESOLVER HOY", "NO AVANZADO"),
            ("CargoFlex: coordinar 6,600 kg restantes + próxima entrega", "VERIFICAR"),
            ("PO Norway — inventario status (OVERDUE 13 sem) — escalar a Andrés si no hay respuesta", "NO AVANZADO"),
        ]
    },
    "Vanessa Garcia": {
        "rol": "BDU / Soporte Comercial",
        "items": [
            ("Org chart actualizado cliente principal pintura + costos reales policloropreno", "VERIFICAR"),
            ("Subida factura al sistema — confirmar con receptora", "VERIFICAR"),
        ]
    },
    "Mildred": {
        "rol": "Admin",
        "items": [
            ("Portal Evis — pagos y facturación pendientes", "VERIFICAR"),
        ]
    },
    "Lourdes Arley": {
        "rol": "Finanzas",
        "items": [
            ("Confirmación pago impuestos / fondeos VCB S.A.C.", "VERIFICAR"),
            ("Capacitación cálculo costo financiero con Jennifer — verificar completado", "AVANZADO"),
        ]
    },
}

cuentas = [
    ("Grupo Romero — Pintura / Polímeros", "VERIFICAR", [
        ("Lufarol, CaCO3, 12 productos aprobados — status muestras y pipeline activo", "Jennifer Segura", "P1"),
        ("Org chart actualizado + costos reales policloropreno", "Vanessa Garcia", "P2"),
        ("Rafa Villa, Pedro Clay, Estefanía Loza — reagendar reunión (Andrés en Lima 19 jul, viajes 21-26 jul)", "Andres Bruna", "P2"),
    ]),
    ("Cafetal (K2CO3 grado oral)", "NO AVANZADO", [
        ("CargoFlex: coordinar 6,600 kg restantes + próxima entrega", "Carlos Artavia", "P1"),
        ("Confirmar pago impuestos + liberación carga (Ileana) — BLOQUEADO semana 3", "Carlos Artavia", "P1"),
        ("Post-entrega — satisfacción cliente", "Victor Alfaro", "P2"),
    ]),
    ("Romex / Nico", "VERIFICAR", [
        ("Liners y tapas — status producción y control calidad", "Jorge Bruna", "P1"),
        ("Chat liners: confirmar en reunión estado actual", "Jorge Bruna", "P2"),
    ]),
    ("Daryza", "NO AVANZADO", [
        ("Lista 30+ MPs recibida (11 mar) — cotización formal OVERDUE 19 SEMANAS", "Jennifer Segura", "P1"),
        ("MPs prioritarias: Lauril Eter Sulfato 82t, Ac. Sulfónico 58t, NaOH 50% 46t, PEAD 38t", "", "P1"),
        ("Reunión con José Urbina — ejecutar esta semana sin excepción absolute", "Jennifer Segura", "P1"),
    ]),
    ("Aurora Paint", "VERIFICAR", [
        ("Resinas epóxicas VYTA BPA — status cotización: confirmar interés o re-iniciar", "Jennifer Segura", "P1"),
        ("Seguimiento activo requerido — sin emails directos esta semana", "Jennifer Segura", "P2"),
    ]),
    ("Universal Colors", "VERIFICAR", [
        ("TiO2 588 y óxidos de hierro — Google Alerts activos: Henan Billions, Kronos, Lomon, Tronox, ilmenite", "Jennifer Segura", "P2"),
        ("Murillo/Erika — status cotización y muestras pendientes", "Jennifer Segura", "P2"),
    ]),
    ("Qroma", "VERIFICAR", [
        ("Carlos Baldion — neopreno, caucho clorado, parafina: visita cold pendiente", "Victor Alfaro", "P2"),
        ("Profinne — seguimiento MPs especiales", "Jennifer Segura", "P2"),
    ]),
    ("Prospectos Pintura", "VERIFICAR", [
        ("Anipsa, Perupaint, Soprint, Interpaint — cold visits: reportar esta semana", "Victor Alfaro", "P3"),
        ("Preparar lista contactos y materiales de presentación", "Victor Alfaro", "P3"),
    ]),
    ("Plásticos", "VERIFICAR", [
        ("Tigre, Andinaplast, Inproplast, Nicoll — cera PE, TiO2, masterbatch", "Victor Alfaro", "P3"),
        ("Lufarol / CaCO3 para plásticos — oferta lista?", "Jennifer Segura", "P3"),
    ]),
    ("Minería", "VERIFICAR", [
        ("Oscar Rosas — confirmar reunión realizada + propuesta MIBC y xantatos cerrada", "Victor Alfaro", "P1"),
        ("Finka Metals: Victor debe enviar lista 13 productos a CF para evaluación + pruebas Volcán", "Victor Alfaro", "P1"),
        ("Ficha técnica + pricing MIBC, xantatos, lubricantes — lista?", "Andres Bruna", "P2"),
    ]),
    ("Oral Care", "NO AVANZADO", [
        ("Planta Lurín operativa CONFIRMADO (23 jun) — muestras en lab SIN USAR 4+ semanas", "Andres Bruna", "P1"),
        ("Diego Gómez NO confirmó envío req a planeamiento — 4 semanas sin confirmar → ESCALAR", "Jorge Bruna", "P1"),
        ("Prueba impresión + armado tubos en Lurín — coordinar presencia equipo Bruna", "Jorge Bruna", "P1"),
        ("Fórmula Ruby, tubos, equipos — cerrar status completo esta semana", "Andres Bruna", "P2"),
    ]),
    ("Alimentos", "VERIFICAR", [
        ("Pursuit, JAVA, Creafoods — ácidos y especialidades: pipeline status semanal", "Victor Alfaro", "P2"),
        ("Coordinar reunión seguimiento con Andrés (ventana Lima 19 jul ejecutada)", "Andres Bruna", "P2"),
    ]),
]

urgentes = [
    "Daryza: Cotización OVERDUE 19 semanas — Jenny DEBE reunirse con Urbina ESTA SEMANA (límite absoluto)",
    "Oral Care Lurín: Diego Gómez NO confirmó req a planeamiento — 4 semanas sin confirmar — ESCALAR HOY",
    "Cafetal: Liberación carga bloqueada por impuestos semana 3 — Carlos RESOLVER HOY con Ileana",
    "Cafetal PO Norway: OVERDUE 13 semanas — Carlos escalar a Andrés si no hay respuesta al cierre del día",
    "Finka Metals (Minería): Victor — enviar lista 13 productos a CF ESTA SEMANA para pruebas Volcán",
    "Bruna Brain M1: Andrés revisar 56 prospectos activos y dar feedback al equipo — acción acordada 16 jul",
    "Andrés viajes: Lima (19 jul — EJECUTADO), Santiago/Temuco (21 jul), Buenos Aires (26 jul) — cobertura coordinada",
]

overdue_cronicos = [
    ("Daryza — Cotización lista 30+ MPs", "19 semanas", "Jennifer Segura"),
    ("PO Norway — Inventario pendiente", "13 semanas", "Carlos Artavia"),
    ("Oral Care Lurín — req formal a planeamiento sin confirmar", "4 semanas", "Jorge Bruna"),
    ("Plásticos cold visits — Tigre, Andinaplast, Nicoll", "10+ semanas", "Victor Alfaro"),
    ("Bruna Brain M1 — revisión prospectos y feedback Andrés", "1 semana", "Andres Bruna"),
]

intel_correos = [
    ("<strong>Read.AI (16 jul) — Bruna Brain:</strong> M1 corrió 1,880 partidas arancelarias → 56 prospectos activos a revisión manual. M2 scoring (activo/nurturing/descartado) operativo. Pipeline automático lunes 7am. Créditos: 9.6/20. ACCIÓN Andrés: revisar lista prospectos y dar feedback.",
     "Read.AI (16 jul) — Bruna Brain: M1 corrió 1,880 partidas → 56 prospectos activos. M2 scoring operativo. Pipeline automático lunes 7am. Créditos: 9.6/20. ACCIÓN Andrés: revisar prospectos y dar feedback."),
    ("<strong>Read.AI (16 jul) — Finka Metals / Plataforma:</strong> Marketplace minería+concentrados basado en Suiza. Lanzamiento Q4 2026. Bruna tiene 13 productos para minería. CF contactará CEO Volcán. PENDIENTES: Víctor enviar lista 13 productos a CF. Andrés: debugging técnico en plataforma.",
     "Read.AI (16 jul) — Finka Metals: marketplace minería Suiza, lanzamiento Q4 2026. 13 productos Bruna evaluados. PENDIENTES: Víctor enviar lista a CF. Andrés: debugging técnico."),
    ("<strong>Google Alerts TiO2 (semana 14-20 jul):</strong> Henan Billions, Kronos, Lomon, TiO2, Tronox, ilmenite activos toda la semana. Mercado en movimiento. Compartir con Jennifer para Universal Colors y prospectos pintura.",
     "Google Alerts TiO2 (14-20 jul): Henan Billions, Kronos, Lomon, Tronox, ilmenite activos. Compartir con Jennifer para Universal Colors y prospectos pintura."),
    ("<strong>Andrés — Lima 19 jul (EJECUTADO):</strong> Primera visita de campo de la semana. Próximos: Santiago/Temuco 21 jul (ZCO vía JetSMART+LAN), Buenos Aires 26 jul. Cobertura equipo coordinada.",
     "Andrés Lima 19 jul (EJECUTADO). Próximos: Santiago/Temuco 21 jul, Buenos Aires 26 jul. Cobertura equipo coordinada."),
    ("<strong>Sin emails directos de:</strong> Daryza, Aurora, Romex, Cafetal, Minería, Universal Colors, Qroma en inbox esta semana. Equipo debe salir a buscar — no esperar.",
     "Sin emails de: Daryza, Aurora, Romex, Cafetal, Minería, Universal Colors, Qroma. Equipo no puede esperar — salir a buscar."),
]

# ─── GENERAR DOCX ─────────────────────────────────────────────────────────────
doc = Document()

# Titulo
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
tr = title.add_run(f"\U0001f1f5\U0001f1ea  BRUNA PERU \u2014 WEEKLY REVIEW")
tr.bold = True
tr.font.size = Pt(22)
tr.font.color.rgb = NAVY

sub = doc.add_paragraph()
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
sr = sub.add_run(f"Agenda Ejecutiva | {FECHA} | Causita Intelligence")
sr.font.size = Pt(11)
sr.font.color.rgb = GRAY

add_divider(doc)

# ─── URGENTES ───────────────────────────────────────────────────────────────
add_heading(doc, "\U0001f534  URGENTE ESTA SEMANA", 1, RED)
for u in urgentes:
    add_bullet(doc, u)

add_divider(doc)

# ─── INTEL EMAIL ────────────────────────────────────────────────────────────
add_heading(doc, "\U0001f4ec  INTEL DE CORREOS (14 \u2013 20 jul 2026)", 1, NAVY)
for _, txt in intel_correos:
    add_bullet(doc, txt)

add_divider(doc)

# ─── CUENTAS ────────────────────────────────────────────────────────────────
add_heading(doc, "\U0001f4cb  ESTADO DE CUENTAS (12 cuentas activas)", 1, NAVY)
for nombre, status, subtareas in cuentas:
    add_heading(doc, f"  {nombre}", 2,
        RED if status == "NO AVANZADO" else
        GREEN if status == "HECHO" else
        YELLOW if status == "AVANZADO" else
        PURPLE if status == "NUEVO" else ORANGE)
    for tarea, resp, prioridad in subtareas:
        add_status_item(doc, f"[{prioridad}] {tarea}", status,
            responsible=resp if resp else "")

add_divider(doc)

# ─── OVERDUE CRONICO ─────────────────────────────────────────────────────────
add_heading(doc, "\u23f0  OVERDUE CR\u00d3NICO", 1, RED)
for item, tiempo, responsable in overdue_cronicos:
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Inches(0.3)
    r1 = p.add_run(f"\u2022 {item} \u2014 ")
    r1.font.size = Pt(10)
    r2 = p.add_run(tiempo)
    r2.bold = True
    r2.font.color.rgb = RED
    r2.font.size = Pt(10)
    r3 = p.add_run(f"  \u2192 {responsable}")
    r3.font.color.rgb = ACCENT
    r3.font.size = Pt(9)

add_divider(doc)

# ─── RESPONSABLES ────────────────────────────────────────────────────────────
add_heading(doc, "\U0001f465  RESPONSABLES — ACCIONES ESTA SEMANA", 1, NAVY)
for responsable, info in pendientes.items():
    add_heading(doc, f"  {responsable} ({info['rol']})", 2, ACCENT)
    for item_text, status in info["items"]:
        add_status_item(doc, item_text, status)

add_divider(doc)

# ─── FOOTER ──────────────────────────────────────────────────────────────────
footer_p = doc.add_paragraph()
footer_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
fr = footer_p.add_run(f"Causita · Bruna Per\u00fa / VCB S.A.C. · Weekly Review · {FECHA}")
fr.font.size = Pt(9)
fr.font.color.rgb = GRAY

docx_path = os.path.join(OUTPUT_DIR, f"Agenda_BrunaPeru_{FECHA_FILE}.docx")
doc.save(docx_path)
print(f"DOCX generado: {docx_path}")

# ─── GENERAR HTML DASHBOARD ───────────────────────────────────────────────────
def status_badge(status):
    colors = {
        "HECHO": ("#27AE60", "#fff"),
        "AVANZADO": ("#F1C40F", "#333"),
        "NO AVANZADO": ("#C0392B", "#fff"),
        "VERIFICAR": ("#E67E22", "#fff"),
        "NUEVO": ("#8E44AD", "#fff"),
    }
    bg, fg = colors.get(status, ("#95A5A6", "#fff"))
    return f'<span style="background:{bg};color:{fg};padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;">{status}</span>'

html = f"""<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Dashboard Bruna Perú — {FECHA}</title>
<style>
  body {{ font-family: 'Segoe UI', Arial, sans-serif; background: #F4F6F9; color: #2C3E50; margin: 0; padding: 0; }}
  .header {{ background: linear-gradient(135deg, #1B4F72 0%, #2E86C1 100%); color: #fff; padding: 28px 32px 20px; }}
  .header h1 {{ margin: 0 0 4px; font-size: 26px; letter-spacing: 1px; }}
  .header .sub {{ opacity: 0.85; font-size: 14px; }}
  .container {{ max-width: 960px; margin: 24px auto; padding: 0 16px; }}
  .section {{ background: #fff; border-radius: 10px; box-shadow: 0 2px 8px rgba(0,0,0,0.07); margin-bottom: 22px; overflow: hidden; }}
  .section-header {{ padding: 14px 20px 10px; border-bottom: 2px solid #F0F3F7; display: flex; align-items: center; gap: 10px; }}
  .section-header h2 {{ margin: 0; font-size: 17px; color: #1B4F72; }}
  .section-body {{ padding: 14px 20px 16px; }}
  .urgente-list {{ list-style: none; padding: 0; margin: 0; }}
  .urgente-list li {{ padding: 8px 12px; margin-bottom: 6px; background: #FDF2F2; border-left: 4px solid #C0392B; border-radius: 4px; font-size: 13px; color: #2C3E50; }}
  .cuenta-row {{ display: flex; align-items: flex-start; padding: 9px 0; border-bottom: 1px solid #F0F3F7; gap: 10px; }}
  .cuenta-row:last-child {{ border-bottom: none; }}
  .cuenta-name {{ font-weight: 600; font-size: 13px; min-width: 200px; }}
  .cuenta-items {{ font-size: 12px; color: #555; flex: 1; }}
  .cuenta-items p {{ margin: 2px 0; }}
  .overdue-row {{ padding: 7px 10px; background: #FDF2F2; border-radius: 5px; margin-bottom: 6px; font-size: 13px; display: flex; justify-content: space-between; align-items: center; }}
  .overdue-time {{ color: #C0392B; font-weight: bold; font-size: 13px; }}
  .overdue-resp {{ color: #2E86C1; font-size: 12px; }}
  .intel-item {{ padding: 9px 12px; background: #F0F5FB; border-left: 3px solid #2E86C1; border-radius: 4px; margin-bottom: 8px; font-size: 13px; }}
  .resp-block {{ margin-bottom: 14px; }}
  .resp-name {{ font-weight: 700; color: #1B4F72; font-size: 14px; margin-bottom: 6px; border-bottom: 1px dashed #D5E8F5; padding-bottom: 4px; }}
  .resp-item {{ font-size: 12px; padding: 3px 0 3px 14px; display: flex; align-items: flex-start; gap: 7px; }}
  .footer {{ text-align: center; color: #95A5A6; font-size: 12px; padding: 16px 0 24px; }}
</style>
</head>
<body>
<div class="header">
  <h1>🇵🇪 BRUNA PERÚ — Weekly Review</h1>
  <div class="sub">Dashboard Ejecutivo &nbsp;|&nbsp; {FECHA} &nbsp;|&nbsp; Causita Intelligence</div>
</div>
<div class="container">

<!-- URGENTES -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">🔴</span><h2>URGENTE ESTA SEMANA</h2></div>
  <div class="section-body">
    <ul class="urgente-list">
"""
for u in urgentes:
    html += f"      <li>{u}</li>\n"

html += """    </ul>
  </div>
</div>

<!-- INTEL EMAIL -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">📬</span><h2>INTEL DE CORREOS (14 – 20 jul 2026)</h2></div>
  <div class="section-body">
"""
for html_txt, _ in intel_correos:
    html += f'    <div class="intel-item">{html_txt}</div>\n'

html += """  </div>
</div>

<!-- CUENTAS -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">📋</span><h2>ESTADO DE CUENTAS (12 activas)</h2></div>
  <div class="section-body">
"""
for nombre, status, subtareas in cuentas:
    html += f'    <div class="cuenta-row">\n'
    html += f'      <div class="cuenta-name">{status_badge(status)}<br><span style="font-size:13px;">{nombre}</span></div>\n'
    html += f'      <div class="cuenta-items">\n'
    for tarea, resp, prioridad in subtareas:
        resp_html = f' <span style="color:#2E86C1;font-size:11px;">→ {resp}</span>' if resp else ''
        html += f'        <p><strong>[{prioridad}]</strong> {tarea}{resp_html}</p>\n'
    html += '      </div>\n    </div>\n'

html += """  </div>
</div>

<!-- OVERDUE -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">⏰</span><h2>OVERDUE CRÓNICO</h2></div>
  <div class="section-body">
"""
for item, tiempo, responsable in overdue_cronicos:
    html += f'    <div class="overdue-row"><span>{item}</span><span><span class="overdue-time">{tiempo}</span> <span class="overdue-resp">→ {responsable}</span></span></div>\n'

html += """  </div>
</div>

<!-- RESPONSABLES -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">👥</span><h2>RESPONSABLES — ACCIONES ESTA SEMANA</h2></div>
  <div class="section-body">
"""
for responsable, info in pendientes.items():
    html += f'    <div class="resp-block">\n'
    html += f'      <div class="resp-name">{responsable} <span style="font-weight:400;font-size:12px;color:#7F8C8D;">({info["rol"]})</span></div>\n'
    for item_text, status in info["items"]:
        html += f'      <div class="resp-item">{status_badge(status)} <span>{item_text}</span></div>\n'
    html += '    </div>\n'

html += f"""  </div>
</div>

</div>
<div class="footer">Causita · Bruna Perú / VCB S.A.C. · Weekly Review · {FECHA}</div>
</body>
</html>"""

html_path = os.path.join(OUTPUT_DIR, f"Dashboard_BrunaPeru_{FECHA_FILE}.html")
with open(html_path, "w", encoding="utf-8") as f:
    f.write(html)
print(f"HTML generado: {html_path}")
