#!/usr/bin/env python3
"""Genera Agenda DOCX + HTML Dashboard para Bruna Peru Weekly Review — 27 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 = "27 de julio, 2026"
FECHA_FILE = "2026-07-27"
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

# ─── Inteligencia semana 21–27 jul 2026 ──────────────────────────────
# FUENTES:
# • Read.AI 23 jul (Bruna Brain Teams): 29 prospectos activos en CRM; HubSpot como
#   CRM principal en evaluación; scoring activo/nurturing/descartado operativo;
#   VoiceAgent Xpeis investigado (ZipTrunk, 25 idiomas, 24/7) — prototipo con Alan pendiente;
#   QA Analytics API caída (M1) — Edwin revisa con Carlos; correos automáticos HubSpot
#   aún NO automatizados.
# • Google Alerts TiO2/Tronox/Kronos: activos toda la semana (21–26 jul)
# • Alibaba (27 jul): mensaje de proveedor Jinan Yixiang — imagen enviada (posible materia prima)
# • Sin emails directos de: Daryza, Aurora, Romex, Cafetal, Minería, Universal Colors, Qroma
# • Andrés: Lima (19 jul), Santiago/Temuco (21 jul), Buenos Aires (26 jul) → regreso Lima 27 jul
# • Finka Metals (16 jul OVERDUE): Victor Alfaro aún NO ha enviado lista 13 productos a CF

urgentes = [
    "Daryza — cotización OVERDUE 20 SEMANAS. Jenny debe tener call con Urbina HOY. Escalado a Andrés si no hay avance hoy.",
    "Finka Metals — Víctor: lista 13 productos a CF. OVERDUE 1 semana. CF contactará CEO Volcán cuando reciba. No bloquear esta oportunidad.",
    "Oral Care (Lurín) — Diego Gómez req formal a planeamiento OVERDUE 5 semanas. Jorge confirmar si ya está en el plan de planta.",
    "QA Analytics API caída (M1) — Edwin/Carlos: resolver antes del próximo run automatizado del lunes.",
    "CRM HubSpot — Andrés: decidir adopción y exportar datos esta semana. 29 prospectos activos sin seguimiento automatizado.",
]

intel_correos = [
    ("<strong>Read.AI — Bruna Brain (23 jul)</strong>: CRM con 29 prospectos activos. HubSpot en evaluación para migrar. VoiceAgent Xpeis prototipo propuesto (Alan = cliente prueba). API QA Analytics caída M1. Correos HubSpot no automatizados aún.", "Bruna Brain 23 jul"),
    ("<strong>Google Alerts TiO2</strong> (Tronox, Kronos, titanium dioxide) 21–26 jul: mercado activo — contexto de precio relevante para Universal Colors y prospectos pintura.", "Alerts"),
    ("<strong>Alibaba (27 jul)</strong>: Proveedor Jinan Yixiang (Zong Ran) envió imagen. 5 mensajes sin leer. Posible prospecto de materia prima — evaluar si aplica portfolio Perú.", "Alibaba"),
    ("<strong>Sin emails directos</strong> esta semana de: Daryza, Aurora Paint, Romex/Nico, Cafetal, Universal Colors, Qroma, Profinne, Oral Care, Minería. Silencio comercial — requiere acción proactiva del equipo.", "Cuentas activas"),
    ("<strong>Andrés en ruta</strong>: Lima 19 jul → Santiago/Temuco 21 jul → Buenos Aires 26 jul. Regreso Lima sem 28 jul. Cobertura equipo esta semana crítica.", "Agenda"),
]

pendientes = {
    "Victor Alfaro": {
        "rol": "Gerente General Lima",
        "items": [
            ("CRÍTICO OVERDUE: Enviar lista 13 productos Bruna a CF (Finka Metals) — acordado 16 jul, SIN enviar aún", "NO AVANZADO"),
            ("Qroma / Baldion — neopreno, caucho clorado, parafina: cold visit y reportar esta semana", "VERIFICAR"),
            ("Minería — Oscar Rosas: MIBC/xantatos — confirmar status propuesta y reunión", "VERIFICAR"),
            ("Prospectos pintura (Anipsa, Perupaint, Soprint, Interpaint) — cold visits: update semanal", "VERIFICAR"),
            ("Plásticos (Tigre, Andinaplast, Nicoll) — status cotizaciones cera PE y TiO2", "VERIFICAR"),
            ("Cafetal — post-entrega satisfacción cliente (carga liberada o pendiente?)", "VERIFICAR"),
        ]
    },
    "Jennifer Segura": {
        "rol": "Líder Mercado Perú",
        "items": [
            ("Daryza — call/reunión con José Urbina HOY LUNES. Cotización OVERDUE 20 SEMANAS. Escalado crítico.", "NO AVANZADO"),
            ("Enviar cotización formal Daryza (MPs prioritarias: LSE 82t, Ac.Sulf. 58t, NaOH 46t, PEAD 38t) esta semana", "NO AVANZADO"),
            ("Aurora Paint — resinas epóxicas VYTA BPA: confirmar respuesta o re-cotizar. Sin emails esta semana.", "VERIFICAR"),
            ("Universal Colors — TiO2 588 y óxidos hierro (Murillo/Erika): mercado TiO2 activo. Aprovechar contexto.", "VERIFICAR"),
            ("Profinne — seguimiento MPs especiales: status cotización", "VERIFICAR"),
            ("Alimentos (Pursuit, JAVA, Creafoods) — pipeline ácidos y especialidades: update semanal", "VERIFICAR"),
        ]
    },
    "Andres Bruna": {
        "rol": "Director Nuevos Mercados",
        "items": [
            ("NUEVO: Decidir adopción HubSpot como CRM principal + exportar datos esta semana (acordado 23 jul)", "NUEVO"),
            ("NUEVO: Debugging técnico plataforma Finka Metals + compartir resultados (acordado 16 jul, aún pendiente)", "NUEVO"),
            ("NUEVO: Prototipo VoiceAgent — parte técnica + prueba con Alan (cuentas de cobro) — Xpeis/ZipTrunk", "NUEVO"),
            ("CRM — revisar y validar 3 Excel (prospectos, clientes, productos) + agregar faltantes", "VERIFICAR"),
            ("Grupo Romero — Rafa Villa, Pedro Clay, Estefanía Loza: reagendar reunión post-viajes", "VERIFICAR"),
            ("Oral Care — status Ruby, tubos, fórmula, equipos. Coordinar con Jorge.", "VERIFICAR"),
        ]
    },
    "Jorge Bruna": {
        "rol": "Empaques / Oral Care",
        "items": [
            ("Oral Care Lurín — confirmar si Diego Gómez envió req formal a planeamiento. OVERDUE 5 semanas.", "NO AVANZADO"),
            ("Coordinar asistencia equipo a prueba impresión + armado tubos en Lurín (prensa flexo)", "VERIFICAR"),
            ("Confirmar: tratamiento Corona disponible + energía superficial muestras antes de imprimir", "VERIFICAR"),
            ("Romex/Nico — liners y tapas: status producción y control calidad semanal", "VERIFICAR"),
        ]
    },
    "Carlos Artavia": {
        "rol": "Logística / SPU",
        "items": [
            ("Cafetal K2CO3 — pago impuestos + liberación carga con Ileana: confirmar status HITO", "VERIFICAR"),
            ("CargoFlex: 6,600 kg restantes + próxima entrega fechas", "VERIFICAR"),
            ("PO Norway — inventario status (OVERDUE 14 sem) — escalar a Andrés si sin respuesta", "NO AVANZADO"),
        ]
    },
    "Vanessa Garcia": {
        "rol": "BDU / Soporte Comercial",
        "items": [
            ("Org chart actualizado Grupo Romero + costos reales policloropreno — entregar esta semana", "VERIFICAR"),
            ("Revisar mensaje Alibaba (Jinan Yixiang) — evaluar si aplica como proveedor portfolio Perú", "NUEVO"),
        ]
    },
    "Mildred": {
        "rol": "Admin",
        "items": [
            ("Portal Evis — pagos y facturación pendientes", "VERIFICAR"),
        ]
    },
    "Lourdes Arley": {
        "rol": "Finanzas",
        "items": [
            ("Confirmación pagos/fondeos VCB S.A.C. semana en curso", "VERIFICAR"),
            ("Validar cálculo costo financiero con Jennifer — estado capacitación", "VERIFICAR"),
        ]
    },
}

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 post-viajes Andrés", "Andres Bruna", "P2"),
    ]),
    ("Cafetal (K2CO3 grado oral)", "VERIFICAR", [
        ("CargoFlex: 6,600 kg restantes + próxima entrega — confirmar fechas", "Carlos Artavia", "P1"),
        ("Pago impuestos + liberación carga (Ileana) — status hito", "Carlos Artavia", "P1"),
        ("Post-entrega: satisfacción cliente / próxima orden", "Victor Alfaro", "P2"),
    ]),
    ("Romex / Nico", "VERIFICAR", [
        ("Liners y tapas — status producción y control calidad", "Jorge Bruna", "P1"),
        ("Update semanal tapas: confirmar en reunión estado actual", "Jorge Bruna", "P2"),
    ]),
    ("Daryza", "NO AVANZADO", [
        ("Lista 30+ MPs recibida (11 mar) — cotización formal OVERDUE 20 SEMANAS", "Jennifer Segura", "P1"),
        ("MPs prioritarias: Lauril Eter Sulfato 82t, Ac. Sulfónico 58t, NaOH 50% 46t, PEAD 38t", "", "P1"),
        ("Call/reunión con José Urbina — HOY LUNES sin excepción absoluta", "Jennifer Segura", "P1"),
    ]),
    ("Aurora Paint", "VERIFICAR", [
        ("Resinas epóxicas VYTA BPA — sin emails esta semana. Re-cotizar o confirmar interés.", "Jennifer Segura", "P1"),
        ("Seguimiento activo requerido — próximo paso concreto definir hoy", "Jennifer Segura", "P2"),
    ]),
    ("Universal Colors", "VERIFICAR", [
        ("TiO2 588 y óxidos hierro — Google Alerts activos: Tronox, Kronos, titanium dioxide", "Jennifer Segura", "P2"),
        ("Murillo/Erika — status cotización y muestras. Aprovechar señal mercado.", "Jennifer Segura", "P2"),
    ]),
    ("Qroma", "VERIFICAR", [
        ("Baldion — neopreno, caucho clorado, parafina: cold visit esta semana", "Victor Alfaro", "P2"),
        ("Profinne — seguimiento MPs especiales: status cotización", "Jennifer Segura", "P2"),
    ]),
    ("Prospectos Pintura", "VERIFICAR", [
        ("Anipsa, Perupaint, Soprint, Interpaint — cold visits: update semanal", "Victor Alfaro", "P3"),
        ("Contexto TiO2 activo en mercado — aprovechar para abrir conversación", "Victor Alfaro", "P3"),
    ]),
    ("Plásticos", "VERIFICAR", [
        ("Tigre, Andinaplast, Nicoll — cera PE, TiO2: status cotizaciones", "Victor Alfaro", "P3"),
        ("Inproplast — contacto inicial pendiente", "Victor Alfaro", "P3"),
    ]),
    ("Minería", "VERIFICAR", [
        ("Oscar Rosas — MIBC, xantatos: confirmar status reunión y propuesta", "Victor Alfaro", "P1"),
        ("Finka Metals (Volcán) — lista 13 productos PENDIENTE envío a CF. CRÍTICO.", "Victor Alfaro", "P1"),
    ]),
    ("Oral Care", "NO AVANZADO", [
        ("Diego Gómez — req formal a planeamiento Lurín OVERDUE 5 semanas. Jorge confirmar.", "Jorge Bruna", "P1"),
        ("Prueba impresión + armado tubos en Lurín — coordinar fecha y asistencia", "Jorge Bruna", "P1"),
        ("Ruby, fórmula, equipos — status pipeline con Andrés", "Andres Bruna", "P2"),
    ]),
    ("Alimentos", "VERIFICAR", [
        ("Pursuit, JAVA, Creafoods — ácidos y especialidades: update pipeline", "Jennifer Segura", "P3"),
        ("Victor Alfaro — seguimiento contactos alimentos: reportar esta semana", "Victor Alfaro", "P3"),
    ]),
]

overdue_cronicos = [
    ("Daryza — cotización formal (30+ MPs)", "20 SEMANAS", "Jennifer Segura"),
    ("PO Norway — inventario status", "14 SEMANAS", "Carlos Artavia"),
    ("Oral Care — req formal Diego Gómez a planeamiento Lurín", "5 SEMANAS", "Jorge Bruna"),
    ("Finka Metals — envío lista 13 productos a CF", "1 SEMANA", "Victor Alfaro"),
    ("HubSpot — adopción CRM + automatización correos", "PENDIENTE", "Andres Bruna"),
]

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

# Márgenes
for section in doc.sections:
    section.top_margin = Inches(0.8)
    section.bottom_margin = Inches(0.8)
    section.left_margin = Inches(1.0)
    section.right_margin = Inches(1.0)

# Título
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
tr = title.add_run("🇵🇪  BRUNA PERÚ — 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 (21 \u2013 27 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 CRÓNICO ──────────────────────────────────────────────────
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 \u2014 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 (21 – 27 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;">&rarr; {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">&rarr; {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}")
