#!/usr/bin/env python3
"""Genera Agenda DOCX + HTML Dashboard para Bruna Peru Weekly Review — 03 agosto 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 = "03 de agosto, 2026"
FECHA_FILE = "2026-08-03"
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 28 jul – 03 ago 2026 ──────────────────────────────
# FUENTES:
# • Read.AI (31 jul): Reunión "Plan de trabajo capa 2 (Primus)" — Bruna Group CR.
#   WMS Alium vs ERP Soflan. Ricardo Estrada construirá reporte de conciliación.
#   7 asistentes. Contexto: Andrés en reunión técnica CR (impacta disponibilidad Lima).
# • Google Alert TiO2 (1 ago): Meghmani Organics TiO2 suspendida por condiciones
#   comerciales desfavorables = SEÑAL POSITIVA para precios TiO2 (menos oferta).
#   MRG Metals avanza JV titanio hacia producción 2027. Tronox nuevo board (Keith Schwarz).
# • Google Alert Kronos (1 ago): KRO outperforming sector básico materiales en 2026.
#   Confirma contexto precio TiO2 favorable para Bruna Perú.
# • Google Alert Tronox (1 ago): activa, empresa estable con nuevo liderazgo.
# • LinkedIn Flexible Packaging Professionals (3 ago): grupo activo con conversaciones.
#   Relevante para Romex/Nico, Plásticos, Oral Care.
# • Sin emails directos de: Daryza, Aurora Paint, Cafetal, Romex, Universal Colors,
#   Qroma, Minería, Oral Care, Profinne. Silencio comercial — semana 2 sin señal.
# • Andrés: Bruna Group reunión técnica 31 jul (online). Lima sem actual.

urgentes = [
    "Daryza — cotización OVERDUE 21 SEMANAS. Jenny: call con Urbina HOY LUNES sin excepción. Esta semana es la última oportunidad antes de perder la cuenta. Escalar a Andrés si no hay call hoy.",
    "Finka Metals — Víctor: lista 13 productos a CF pendiente 2 semanas. CEO Volcán bloqueado hasta recibir lista. Enviar hoy antes de mediodía.",
    "Oral Care (Lurín) — Diego Gómez req formal a planeamiento OVERDUE 6 semanas. Jorge: confirmación escrita urgente antes del miércoles.",
    "TiO2 OPORTUNIDAD MERCADO: Meghmani Organics suspendió su planta TiO2 (condiciones desfavorables) + KRO outperforming = menos oferta global, precios al alza. Jenny/Víctor: usar este argumento con Universal Colors y prospectos pintura ESTA SEMANA.",
    "PO Norway — inventario OVERDUE 15 semanas. Carlos: escalar directamente a Andrés con un email hoy. No puede seguir sin respuesta.",
]

intel_correos = [
    ("<strong>TiO2 Mercado — Google Alerts (1 ago)</strong>: Meghmani Organics suspendió operaciones planta TiO2 por condiciones comerciales desfavorables. MRG Metals avanza JV titanio hacia 2027. Tronox nombra nuevo board (Keith Schwarz). Kronos (KRO) outperforming sector materiales básicos 2026. <strong>Señal clara: contracción oferta = precios subirán.</strong> Aprovechar para Universal Colors, prospectos pintura y Plásticos.", "TiO2 Alerts"),
    ("<strong>Read.AI — Reunión Bruna Group CR (31 jul)</strong>: Sesión técnica 'Plan de trabajo capa 2 (Primus)' — conciliación WMS Alium vs ERP Soflan. Ricardo Estrada construye reporte automatizado. 7 asistentes. Andrés participó. Contexto: disponibilidad Andrés para Lima puede estar dividida esta semana.", "Bruna Group Tech"),
    ("<strong>LinkedIn — Flexible Packaging Professionals (3 ago)</strong>: Grupo activo con nuevas conversaciones. Relevante para mercado empaques: liners, tapas, tubos. Oportunidad de inteligencia competitiva para Romex/Nico y Oral Care.", "LinkedIn Packaging"),
    ("<strong>Sin emails directos semana 28 jul – 3 ago</strong> de: Daryza, Aurora Paint, Cafetal, Romex/Nico, Universal Colors, Qroma, Minería, Oral Care, Profinne, Alimentos. Semana 2 de silencio comercial. El equipo debe tomar la iniciativa — esperar no es opción.", "Cuentas activas"),
]

pendientes = {
    "Victor Alfaro": {
        "rol": "Gerente General Lima",
        "items": [
            ("CRÍTICO OVERDUE 2 SEM: Enviar lista 13 productos Bruna a CF (Finka Metals) — HOY antes del mediodía", "NO AVANZADO"),
            ("TiO2 señal mercado: visitar Universal Colors + prospectos pintura esta semana con argumento Meghmani/KRO", "NUEVO"),
            ("Qroma / Baldion — neopreno, caucho clorado, parafina: cold visit y reportar", "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"),
            ("Cafetal — satisfacción post-entrega y status próxima orden", "VERIFICAR"),
        ]
    },
    "Jennifer Segura": {
        "rol": "Líder Mercado Perú",
        "items": [
            ("CRÍTICO OVERDUE 21 SEM: Daryza — call con José Urbina HOY LUNES. Presentar cotización esta semana.", "NO AVANZADO"),
            ("Cotización formal Daryza (LSE 82t, Ac.Sulf. 58t, NaOH 46t, PEAD 38t) — enviar antes del miércoles", "NO AVANZADO"),
            ("Universal Colors — usar señal TiO2 (Meghmani suspendida, KRO sube) para cerrar cotización TiO2 588 y óxidos hierro", "NUEVO"),
            ("Aurora Paint — resinas epóxicas VYTA BPA: re-contactar. Sin respuesta 2 semanas.", "VERIFICAR"),
            ("Profinne — seguimiento MPs especiales: status cotización", "VERIFICAR"),
            ("Alimentos (Pursuit, JAVA, Creafoods) — pipeline ácidos: update semanal", "VERIFICAR"),
        ]
    },
    "Andres Bruna": {
        "rol": "Director Nuevos Mercados",
        "items": [
            ("HubSpot CRM — decisión final adopción + exportar datos. Acordado 23 jul, aún PENDIENTE.", "NO AVANZADO"),
            ("Debugging técnico plataforma Finka Metals + compartir resultados (acordado 16 jul)", "VERIFICAR"),
            ("Grupo Romero (Rafa Villa, Pedro Clay, Estefanía Loza) — reagendar reunión esta semana", "VERIFICAR"),
            ("Oral Care — status Ruby, tubos, fórmula, equipos. Coordinar con Jorge.", "VERIFICAR"),
            ("Bruna Group Primus (31 jul): seguimiento Ricardo Estrada — reporte WMS/Soflan en construcción", "VERIFICAR"),
        ]
    },
    "Jorge Bruna": {
        "rol": "Empaques / Oral Care",
        "items": [
            ("Oral Care Lurín — confirmación escrita de Diego Gómez que req está en planeamiento. OVERDUE 6 semanas.", "NO AVANZADO"),
            ("Coordinar fecha prueba impresión + armado tubos en Lurín (prensa flexo)", "VERIFICAR"),
            ("Confirmar tratamiento Corona disponible + energía superficial muestras", "VERIFICAR"),
            ("Romex/Nico — liners y tapas: status producción y calidad. Update en reunión.", "VERIFICAR"),
        ]
    },
    "Carlos Artavia": {
        "rol": "Logística / SPU",
        "items": [
            ("PO Norway — OVERDUE 15 SEMANAS: escalar a Andrés con email hoy con historial completo", "NO AVANZADO"),
            ("Cafetal K2CO3 — 6,600 kg restantes + próxima entrega: coordinar con CargoFlex", "VERIFICAR"),
            ("Confirmar pago impuestos + liberación carga (Ileana) — status hito Cafetal", "VERIFICAR"),
        ]
    },
    "Vanessa Garcia": {
        "rol": "BDU / Soporte Comercial",
        "items": [
            ("Org chart actualizado Grupo Romero + costos reales policloropreno — entregar esta semana", "VERIFICAR"),
            ("Alibaba (Jinan Yixiang) — evaluar si aplica como proveedor portfolio Perú", "VERIFICAR"),
        ]
    },
    "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 esta semana", "Andres Bruna", "P2"),
    ]),
    ("Cafetal (K2CO3 grado oral)", "VERIFICAR", [
        ("CargoFlex: 6,600 kg restantes — coordinar próxima entrega", "Carlos Artavia", "P1"),
        ("Pago impuestos + liberación carga (Ileana) — confirmar 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 semanal", "Jorge Bruna", "P1"),
        ("LinkedIn Packaging: monitorear grupo Flexible Packaging para inteligencia competitiva", "Jorge Bruna", "P3"),
    ]),
    ("Daryza", "NO AVANZADO", [
        ("Lista 30+ MPs recibida (11 mar) — cotización formal OVERDUE 21 SEMANAS", "Jennifer Segura", "P1"),
        ("MPs prioritarias: Lauril Eter Sulfato 82t, Ac. Sulfónico 58t, NaOH 50% 46t, PEAD 38t", "", "P1"),
        ("Call con José Urbina — HOY LUNES. Última oportunidad antes de perder cuenta.", "Jennifer Segura", "P1"),
    ]),
    ("Aurora Paint", "VERIFICAR", [
        ("Resinas epóxicas VYTA BPA — sin emails 2 semanas. Re-contactar esta semana.", "Jennifer Segura", "P1"),
        ("Próximo paso concreto definir en reunión hoy", "Jennifer Segura", "P2"),
    ]),
    ("Universal Colors", "NUEVO", [
        ("TiO2 OPORTUNIDAD: Meghmani suspendida + KRO sube = argumento de precio urgente", "Jennifer Segura", "P1"),
        ("TiO2 588 y óxidos hierro — contactar Murillo/Erika con señal de mercado esta semana", "Jennifer Segura", "P1"),
    ]),
    ("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 con argumento TiO2 suministro", "Victor Alfaro", "P3"),
        ("Contexto: Meghmani suspendida = suministro TiO2 global más ajustado", "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 OVERDUE 2 SEM. Enviar HOY.", "Victor Alfaro", "P1"),
    ]),
    ("Oral Care", "NO AVANZADO", [
        ("Diego Gómez — req formal a planeamiento Lurín OVERDUE 6 semanas. Confirmación escrita.", "Jorge Bruna", "P1"),
        ("Prueba impresión + armado tubos Lurín — coordinar fecha y asistencia equipo", "Jorge Bruna", "P1"),
        ("Ruby, fórmula, equipos — status pipeline", "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)", "21 SEMANAS", "Jennifer Segura"),
    ("PO Norway — inventario status", "15 SEMANAS", "Carlos Artavia"),
    ("Oral Care — req formal Diego Gómez a planeamiento Lurín", "6 SEMANAS", "Jorge Bruna"),
    ("Finka Metals — envío lista 13 productos a CF", "2 SEMANAS", "Victor Alfaro"),
    ("HubSpot — adopción CRM + automatización correos", "PENDIENTE", "Andres Bruna"),
]

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

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 (28 jul \u2013 03 ago 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&uacute; &mdash; {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; }}
  .urgente-list li.nuevo {{ background: #F5EEF8; border-left-color: #8E44AD; }}
  .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; }}
  .intel-item.alerta {{ background: #FDF2F2; border-left-color: #C0392B; }}
  .intel-item.oportunidad {{ background: #F0FDF4; border-left-color: #27AE60; }}
  .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; }}
  .tio2-banner {{ background: linear-gradient(90deg, #1a5c36, #27AE60); color: #fff; padding: 12px 18px; border-radius: 8px; margin-bottom: 16px; font-size: 13px; font-weight: 600; }}
  .footer {{ text-align: center; color: #95A5A6; font-size: 12px; padding: 16px 0 24px; }}
</style>
</head>
<body>
<div class="header">
  <h1>&#127477;&#127466; BRUNA PER&Uacute; &mdash; Weekly Review</h1>
  <div class="sub">Dashboard Ejecutivo &nbsp;|&nbsp; {FECHA} &nbsp;|&nbsp; Causita Intelligence</div>
</div>
<div class="container">

<!-- BANNER TIO2 -->
<div class="tio2-banner">
  &#128200; OPORTUNIDAD TiO2: Meghmani suspendida + Kronos (KRO) outperforming + MRG Metals avanza 2027.
  Señal de contracción oferta global = precios al alza. Aprovechar con Universal Colors, prospectos pintura y Plásticos ESTA SEMANA.
</div>

<!-- URGENTES -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">&#128308;</span><h2>URGENTE ESTA SEMANA</h2></div>
  <div class="section-body">
    <ul class="urgente-list">
"""
for i, u in enumerate(urgentes):
    cls = 'nuevo' if 'OPORTUNIDAD' in u else ''
    html += f"      <li class=\"{cls}\">{u}</li>\n"

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

<!-- INTEL EMAIL -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">&#128236;</span><h2>INTEL DE CORREOS (28 jul &ndash; 03 ago 2026)</h2></div>
  <div class="section-body">
"""
intel_classes = ["oportunidad", "", "", "alerta"]
for idx, (html_txt, _) in enumerate(intel_correos):
    cls = intel_classes[idx] if idx < len(intel_classes) else ""
    html += f'    <div class="intel-item {cls}">{html_txt}</div>\n'

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

<!-- CUENTAS -->
<div class="section">
  <div class="section-header"><span style="font-size:20px;">&#128203;</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;">&#9200;</span><h2>OVERDUE CR&Oacute;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;">&#128101;</span><h2>RESPONSABLES &mdash; 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 &middot; Bruna Per&uacute; / VCB S.A.C. &middot; Weekly Review &middot; {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}")
