#!/usr/bin/env python3
"""Genera Agenda DOCX + HTML Dashboard para Bruna Peru Weekly Review — 9 noviembre 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 = "9 de noviembre, 2026"
FECHA_FILE = "2026-11-09"
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 3 nov – 9 nov 2026 ──────────────────────────
# FUENTES ESCANEADAS (gmail-personal All Mail + icloud, ~165 correos revisados):
# • CERO emails entrantes de clientes o prospectos Perú en las 2 bandejas (3–9 nov).
#   SEMANA 15 CONSECUTIVA DE SILENCIO COMERCIAL TOTAL.
# • Único correo pertinente: Google Alerts (8 nov) con resultados Tronox Q3.
# • TRONOX Q3 2026 (reportado 5-nov): TiO2 $653M (+19% YoY, −7% QoQ). Volúmenes
#   −11% QoQ; precios +4% QoQ. Guía Q4: volúmenes caen high-single a low
#   double-digit por demanda débil en Europa y Asia-Pacífico. Señal MIXTA:
#   el piso de precios está confirmado (precios suben 2 trimestres seguidos),
#   pero el productor líder sigue bajo presión de volumen — proveedores
#   internacionales competirán duro por volumen LatAm. Ventana para cerrar
#   cotizaciones TiO2 (Universal Colors, Qroma/Erica 3 MT, Chemifabrik) ANTES
#   de que los sustitutos suban más precio.
# • Alerta China (SMM, 8 nov): MIIT promueve industrialización de nuevo proceso
#   TiO2 y aprovechamiento integral de recursos — señal de reestructuración de
#   oferta china a mediano plazo; vigilar efecto en precio de Billions 896.

urgentes = [
    "COMPROMISOS VISITA 9-OCT — SEMANA 5 SIN EJECUCIÓN VISIBLE: (1) fórmulas neopreno Arlanxeo con Qroma (hito noviembre VENCE ESTA SEMANA), (2) muestra epóxica 1 kg + cotización al 50% con IGV a Chemifabrik, (3) oferta TiO2 contra Billions 896 por los 3 MT de Erica. Cero emails de seguimiento de ninguna de las partes. Víctor + Jennifer: reportar HOY estado real. Si el hito Arlanxeo vence sin entrega, escalar a Andrés el mismo día.",
    "SILENCIO COMERCIAL SEMANA 15 — Decimoquinta semana consecutiva sin un solo email entrante de cliente o prospecto (escaneo completo: All Mail, INBOX, 40+ keywords). Víctor: mínimo 3 contactos activos esta semana CON evidencia (nombre, fecha, resultado). Sin reporte = escalación formal a Andrés.",
    "Daryza — cotización OVERDUE 34 SEMANAS. Jennifer: reportar HOY si se hizo la visita presencial comprometida. Si NO, Jennifer + Andrés deciden esta semana SIN excepción: visita o cierre formal de la cuenta.",
    "Oral Care Diego Gómez — req formal planeamiento Lurín OVERDUE 19 SEMANAS. Jorge: reportar en los primeros 10 minutos. Si no hay confirmación escrita esta semana, cuenta en pausa hasta nuevo sponsor.",
    "PO Norway — OVERDUE 28 SEMANAS. Carlos: propuesta de cierre o cancelación lista HOY. Fecha límite improrrogable.",
    "Finka Metals (Volcán) — lista 13 productos CF OVERDUE 15 SEMANAS. Víctor: confirmar si se envió. Si NO: enviar los primeros 15 minutos de la reunión.",
    "DocuSign VCB S.A.C. — verificar firma de Contrato + KYC (enviado 20 ago). Apertura cuenta bancaria VCB sigue bloqueada hasta confirmar.",
    "HubSpot CRM — adopción OVERDUE 14 semanas (acuerdo 23 jul). Andrés: decisión final esta semana por call con Víctor — implementar o seleccionar alternativa.",
    "TRONOX Q3 CONFIRMADO (5-nov): precios TiO2 +4% QoQ (2do trimestre consecutivo de subida) y guía de volúmenes a la baja en Q4. El piso de precios está confirmado — argumento de urgencia para cerrar: 'los sustitutos ya subieron y seguirán subiendo'. Ventana de cierre Q4 abierta AHORA en Universal Colors, Qroma (3 MT Erica) y Chemifabrik.",
]

intel_correos = [
    ("Silencio comercial SEMANA 15 (3 nov – 9 nov)", "SEMANA 15 DE SILENCIO COMERCIAL TOTAL. Cero emails entrantes de clientes o prospectos en gmail-personal ni icloud (escaneo de ~160 correos, All Mail + INBOX, 40+ keywords Perú). Más de tres meses y medio sin demanda entrante por email: el pipeline depende 100% de la generación activa del equipo. El funnel no se llena solo."),
    ("TRONOX Q3 2026 — resultados confirmados (5-nov, alerta 8-nov)", "TiO2 revenue $653M: +19% YoY pero −7% QoQ. Volúmenes −11% QoQ; precios promedio +4% QoQ (2do trimestre consecutivo al alza). Zircon +58% a $93M. Guía Q4: volúmenes caen high-single a low double-digit por demanda débil en Europa y Asia-Pacífico. Lectura para Bruna Perú: (1) el piso de precios TiO2 está confirmado — usar como argumento de urgencia en cierre; (2) productores bajo presión de volumen competirán por LatAm — buena posición negociadora; (3) cerrar cotizaciones pendientes ANTES de la próxima ronda de subidas."),
    ("Alerta China TiO2 (SMM / MIIT, 8 nov)", "El MIIT chino promueve la industrialización de un nuevo proceso de TiO2 y el aprovechamiento integral de recursos: señal de reestructuración de la oferta china a mediano plazo (consolidación + procesos más limpios). Vigilar efecto en precio del Billions 896 que compra Erica en Qroma — si China sube estructura de costos, nuestra oferta contra ese precio gana margen."),
]

pendientes = {
    "Víctor Alfaro": {
        "rol": "Gerente General Lima",
        "items": [
            ("QROMA — seguimiento visita 9-oct: fórmulas neopreno Arlanxeo (hito noviembre VENCE ESTA SEMANA) + acompañar oferta TiO2 vs Billions 896 (3 MT Erica)", "NUEVO"),
            ("Reportar mínimo 3 contactos activos con evidencia (nombre, fecha, resultado). Semana 15 de silencio. Sin reporte = escalación a Andrés.", "VERIFICAR"),
            ("Cafetal — status satisfacción post-entrega y próxima orden K2CO3 (6,600 kg restantes)", "VERIFICAR"),
            ("Universal Colors — TiO2 588 + óxidos hierro: cerrar cotización con datos Tronox Q3 confirmados (precios +4% QoQ, piso blindado)", "VERIFICAR"),
            ("Prospectos pintura — Chemifabrik ya abrió puerta multi-línea: replicar modelo de visita en 2 prospectos más (Anipsa, Perupaint, Soprint, Interpaint)", "VERIFICAR"),
            ("Minería — status reunión + propuesta MIBC, xantatos: reportar avance", "VERIFICAR"),
        ]
    },
    "Jennifer Segura": {
        "rol": "Líder Mercado Perú",
        "items": [
            ("CRÍTICO OVERDUE 34 SEM: Daryza — reportar HOY si se hizo visita presencial. Si NO: decisión esta semana con Andrés sobre cierre o visita inminente.", "NO AVANZADO"),
            ("CRÍTICO: Chemifabrik — muestra epóxica 100% sólidos 1 kg + cotización epóxicas al 50% (precio con IGV). Semana 5 sin ejecución. Esta semana.", "NUEVO"),
            ("Aurora Paint — resinas epóxicas VYTA BPA: 15 semanas silencio. Recontactar o suspender oficialmente esta semana.", "NO AVANZADO"),
            ("Alimentos (Pursuit, JAVA, Creafoods) — mínimo 1 contacto + reporte", "VERIFICAR"),
            ("Profinne — status cotización MPs especiales: update en reunión", "VERIFICAR"),
        ]
    },
    "Andrés Bruna": {
        "rol": "Director Nuevos Mercados",
        "items": [
            ("Confirmar si DocuSign VCB fue firmado (enviado 20 ago, 11 semanas). Si NO: firmar esta semana.", "NO AVANZADO"),
            ("HubSpot CRM — decisión FINAL por call con Víctor esta semana. 14 semanas OVERDUE. Prerrequisito de la operación local 2027 (P6).", "NO AVANZADO"),
            ("PDCL Negro de humo: si sigue sin asignar, decidir esta semana quién ejecuta el análisis de importaciones Perú (quién, volumen, origen) para sustentar oferta Pintura/Plásticos", "NUEVO"),
            ("Zeop/CycleAI: definir alcance del pilot (# empleados, áreas) y si incluye la operación VCB S.A.C. en el mapeo — pendiente desde 31-oct", "NUEVO"),
            ("QROMA P1 — fórmulas neopreno Arlanxeo (hito nov 2026): definir equipo, muestras y cronograma — vence esta semana", "NUEVO"),
            ("VCB P6 — plan de operación local 2027: primer borrador de estructura y requerimientos", "NUEVO"),
            ("Grupo Romero (Rafa Villa, Pedro Clay, Estefanía Loza) — briefs R1/R2 listos 23-24 sep: convertir en reunión confirmada esta semana.", "NO AVANZADO"),
        ]
    },
    "Jorge Bruna": {
        "rol": "Empaques / Oral Care",
        "items": [
            ("Oral Care Diego Gómez — OVERDUE 19 SEM: reportar si hay confirmación escrita req formal Lurín. Si NO: llamada hoy.", "NO AVANZADO"),
            ("Coordinar prueba impresión + armado tubos en Lurín (prensa flexo) — fecha concreta esta semana", "VERIFICAR"),
            ("Verificar energía superficial + linaje muestras antes de impresión", "VERIFICAR"),
            ("Romex/Nico — liners y tapas: status producción y calidad semana", "VERIFICAR"),
        ]
    },
    "Carlos Artavia": {
        "rol": "Logística / SPU",
        "items": [
            ("PO Norway OVERDUE 28 SEM: propuesta formal cierre o cancelación a Andrés HOY. Sin más prórrogas.", "NO AVANZADO"),
            ("Cafetal K2CO3 — 6,600 kg restantes: confirmar coordinación CargoFlex + próxima fecha entrega", "VERIFICAR"),
            ("Confirmar pago impuestos + liberación carga (Ileana) — status hito Cafetal", "VERIFICAR"),
        ]
    },
    "Vanessa García": {
        "rol": "BDU / Soporte Comercial",
        "items": [
            ("NUEVO — PDCL Negro de humo: ejecutar análisis de importaciones Perú (importadores, volúmenes, origen) si Andrés lo asigna a BDU", "NUEVO"),
            ("Org chart Grupo Romero actualizado + costos reales policloropreno — OVERDUE. Entregar esta semana.", "VERIFICAR"),
            ("QROMA — actualizar data policloropreno SN242A/SN244X con hallazgos visita 9-oct antes del hito Arlanxeo", "NUEVO"),
        ]
    },
    "Mildred": {
        "rol": "Admin",
        "items": [
            ("Portal Evis — pagos y facturación pendientes: revisar y reportar status", "VERIFICAR"),
        ]
    },
    "Lourdes Arley": {
        "rol": "Finanzas",
        "items": [
            ("Cuenta bancaria VCB — confirmar si Andrés firmó DocuSign. Coordinar siguientes pasos.", "VERIFICAR"),
            ("NUEVO — Zeop/CycleAI: confirmar respuesta con # empleados y áreas para cotización del pilot", "NUEVO"),
            ("Confirmación pagos/fondeos VCB S.A.C. semana en curso", "VERIFICAR"),
        ]
    },
}

cuentas = [
    ("Grupo Romero — Pintura / Polímeros", "AVANZADO", [
        ("Lufarol, CaCO3, 12 productos aprobados — briefs R1 Laundry + R2 HPC listos (23-24 sep): agendar reunión YA", "Andrés / Jennifer", "P1"),
        ("Org chart + costos policloropreno OVERDUE — sin entregar", "Vanessa García", "P2"),
        ("Rafa Villa, Pedro Clay, Estefanía Loza — contacto esta semana", "Andrés Bruna", "P1"),
    ]),
    ("Cafetal (K2CO3 grado oral)", "AVANZADO", [
        ("CargoFlex: 6,600 kg restantes — confirmar próxima entrega + fecha", "Carlos Artavia", "P1"),
        ("Pago impuestos + liberación carga (Ileana) — confirmar status", "Carlos Artavia", "P1"),
        ("Post-entrega 1ra partida: satisfacción + próxima orden", "Víctor Alfaro", "P2"),
    ]),
    ("Romex / Nico", "VERIFICAR", [
        ("Liners y tapas — status producción y control calidad", "Jorge Bruna", "P1"),
        ("Cambios técnicos o de precio pendientes", "Jorge Bruna", "P2"),
    ]),
    ("Daryza", "NO AVANZADO", [
        ("Lista 30+ MPs — cotización formal OVERDUE 34 SEMANAS", "Jennifer Segura", "P1"),
        ("MPs prioritarias: LSE 82t, Ac. Sulfónico 58t, NaOH 46t, PEAD 38t", "", "P1"),
        ("DECISION ESTA SEMANA: visita presencial o cuenta cerrada", "Jennifer / Andrés", "P1"),
    ]),
    ("Aurora Paint", "NO AVANZADO", [
        ("Resinas epóxicas VYTA BPA — 15 semanas silencio total", "Jennifer Segura", "P1"),
        ("Recontactar o suspender oficialmente esta semana", "Jennifer Segura", "P1"),
    ]),
    ("Universal Colors", "VERIFICAR", [
        ("TiO2 588 + óxidos hierro — cerrar cotización con argumento piso de precios", "Jennifer / Víctor", "P1"),
        ("Munición: Tronox Q3 confirmado — precios +4% QoQ, volúmenes −11% QoQ. Piso blindado + productor líder bajo presión de volumen. Cerrar YA", "", "P1"),
    ]),
    ("Qroma", "AVANZADO", [
        ("Visita 9-oct: neopreno Arlanxeo como referencia, hito noviembre 2026 VENCE ESTA SEMANA (sobre 3 SKUs aprobados; pipeline SN242/SN244X $165,600)", "Andrés Bruna", "P1"),
        ("Erica Caballero compra 3 MT Billions 896 (competidor TiO2): preparar oferta contra ese precio", "Víctor Alfaro", "P1"),
        ("Caro revisa Virutex/Longato (sustitución/mezcla): seguimiento", "Víctor Alfaro", "P2"),
        ("Neopreno, caucho clorado, parafina — follow-up reunión Baldión pendiente", "Víctor Alfaro", "P2"),
    ]),
    ("Prospectos Pintura", "NUEVO", [
        ("CHEMIFABRIK abrió puerta multi-línea (visita 9-oct): epóxicas 50% + TiO2 + sílica + PVA; volumen 16+16 MT por confirmar", "Jennifer / Andrés", "P1"),
        ("Anipsa, Perupaint, Soprint, Interpaint — mínimo 2 cold visits esta semana con el modelo Qroma/Chemifabrik", "Víctor Alfaro", "P3"),
    ]),
    ("Plásticos", "VERIFICAR", [
        ("Tigre, Andinaplast, Nicoll — cera PE, TiO2, masterbatch: status cotizaciones", "Víctor Alfaro", "P3"),
        ("Inproplast — contacto inicial pendiente", "Víctor Alfaro", "P3"),
        ("Insumo NUEVO: análisis de imports negro de humo Perú (nota PDCL 28-oct) — asignar esta semana", "Vanessa García", "P2"),
    ]),
    ("Minería", "VERIFICAR", [
        ("Contacto principal (MIBC, xantatos) — confirmar status reunión esta semana", "Víctor Alfaro", "P1"),
        ("Finka Metals lista 13 productos CF OVERDUE 15 SEM — enviar HOY", "Víctor Alfaro", "P1"),
    ]),
    ("Oral Care", "NO AVANZADO", [
        ("Diego Gómez req formal planeamiento Lurín OVERDUE 19 semanas", "Jorge Bruna", "P1"),
        ("Muestras en lab sin usar — confirmar fecha prueba impresión Lurín", "Jorge Bruna", "P1"),
        ("Ruby, fórmula, equipos — status pipeline", "Andrés Bruna", "P2"),
    ]),
    ("Alimentos", "VERIFICAR", [
        ("Pursuit, JAVA, Creafoods — ácidos y especialidades: mínimo 1 contacto + update", "Jennifer / Víctor", "P3"),
    ]),
]

overdue_cronicos = [
    ("Daryza — cotización formal (30+ MPs lista José Urbina)", "34 SEMANAS", "Jennifer Segura"),
    ("PO Norway — inventario status + propuesta cierre/cancelación", "28 SEMANAS", "Carlos Artavia"),
    ("Oral Care — req formal Diego Gómez a planeamiento Lurín", "19 SEMANAS", "Jorge Bruna"),
    ("Finka Metals — envío lista 13 productos CF a Volcán", "15 SEMANAS", "Víctor Alfaro"),
    ("Aurora Paint — recontacto resinas epóxicas VYTA BPA", "15 SEMANAS SILENCIO", "Jennifer Segura"),
    ("HubSpot — adopción CRM definitiva", "14 SEMANAS", "Andrés Bruna"),
    ("DocuSign VCB — firmar Contrato + KYC (enviado 20 ago)", "11 SEMANAS", "Andrés Bruna"),
    ("Silencio comercial total — ningún email entrante cliente/prospecto", "15 SEMANAS", "Todo el equipo"),
]

# ─── 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("\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 (3 nov \u2013 9 nov 2026)", 1, NAVY)
for fuente, txt in intel_correos:
    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)
    label = p.add_run(f"[{fuente}] ")
    label.bold = True
    label.font.color.rgb = ACCENT
    label.font.size = Pt(9)
    body = p.add_run(txt)
    body.font.size = Pt(10)

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, semanas, resp in overdue_cronicos:
    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)
    badge = p.add_run(f"[{semanas}] ")
    badge.bold = True
    badge.font.color.rgb = RED
    badge.font.size = Pt(10)
    main = p.add_run(item)
    main.font.size = Pt(10)
    rr = p.add_run(f"  \u2192 {resp}")
    rr.font.color.rgb = ACCENT
    rr.font.size = Pt(9)

add_divider(doc)

# ─── PENDIENTES POR RESPONSABLE ───────────────────────────────────────
add_heading(doc, "\U0001f465  PENDIENTES POR RESPONSABLE", 1, NAVY)
for persona, data in pendientes.items():
    add_heading(doc, f"  {persona} \u2014 {data['rol']}", 2, DARK)
    for tarea, status in data["items"]:
        add_status_item(doc, tarea, status)

add_divider(doc)

# ─── CIERRE ───────────────────────────────────────────────────────────
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
cr = p.add_run(f"Causita \u00b7 Bruna Per\u00fa / VCB S.A.C. \u00b7 Weekly Review {FECHA} \u00b7 Confidencial")
cr.font.size = Pt(8)
cr.font.color.rgb = GRAY

docx_path = f"{OUTPUT_DIR}/Agenda_BrunaPeru_{FECHA_FILE}.docx"
doc.save(docx_path)
print(f"DOCX generado: {docx_path}")

# ─── HTML DASHBOARD ───────────────────────────────────────────────────
def status_badge(st):
    colors = {
        "NO AVANZADO": ("#C0392B", "#fff"),
        "AVANZADO": ("#d4ac0d", "#000"),
        "HECHO": ("#1e8449", "#fff"),
        "VERIFICAR": ("#E67E22", "#fff"),
        "NUEVO": ("#8E44AD", "#fff"),
    }
    bg, fg = colors.get(st, ("#555", "#fff"))
    return f'<span style="background:{bg};color:{fg};padding:2px 7px;border-radius:4px;font-size:11px;font-weight:bold;">{st}</span>'

html = f"""<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bruna Peru Dashboard — {FECHA}</title>
<style>
  body {{ font-family: 'Segoe UI', Arial, sans-serif; background: #f0f2f5; color: #2c3e50; margin: 0; padding: 0; }}
  .header {{ background: linear-gradient(135deg,#1b4f72,#2e86c1); color: #fff; padding: 28px 40px; }}
  .header h1 {{ margin:0; font-size:26px; letter-spacing:1px; }}
  .header p {{ margin:6px 0 0; opacity:0.85; font-size:13px; }}
  .container {{ max-width: 1100px; margin: 0 auto; padding: 24px 20px; }}
  .section {{ background:#fff; border-radius:10px; margin-bottom:22px; box-shadow:0 2px 8px rgba(0,0,0,0.08); overflow:hidden; }}
  .section-header {{ padding:14px 20px; font-weight:700; font-size:15px; border-bottom:1px solid #eaeaea; }}
  .urgent {{ background:#fdf3f2; border-left:5px solid #c0392b; }}
  .urgent .section-header {{ background:#fdf3f2; color:#c0392b; }}
  .intel {{ border-left:5px solid #2e86c1; }}
  .intel .section-header {{ background:#eaf4fb; color:#1b4f72; }}
  .overdue {{ border-left:5px solid #e67e22; }}
  .overdue .section-header {{ background:#fef9f0; color:#e67e22; }}
  .cuentas {{ border-left:5px solid #1b4f72; }}
  .cuentas .section-header {{ background:#eaf0f6; color:#1b4f72; }}
  .resp-section {{ border-left:5px solid #8e44ad; }}
  .resp-section .section-header {{ background:#f5eef8; color:#8e44ad; }}
  .item {{ padding:9px 20px; border-bottom:1px solid #f0f0f0; font-size:13.5px; }}
  .item:last-child {{ border-bottom:none; }}
  .item .label {{ font-weight:600; color:#2e86c1; font-size:11px; margin-right:6px; }}
  .tag {{ font-size:11px; color:#888; margin-left:8px; }}
  .cuenta-row {{ display:flex; justify-content:space-between; align-items:center; padding:10px 20px; border-bottom:1px solid #eee; }}
  .cuenta-name {{ font-weight:600; font-size:13.5px; }}
  .cuenta-tasks {{ font-size:12px; color:#555; margin-top:3px; }}
  .grid2 {{ display:grid; grid-template-columns:1fr 1fr; gap:16px; }}
  @media(max-width:700px){{ .grid2 {{ grid-template-columns:1fr; }} }}
  .resp-person {{ padding:12px 20px; border-bottom:1px solid #f0f0f0; }}
  .resp-person h4 {{ margin:0 0 6px 0; font-size:13px; color:#1b4f72; }}
  .resp-item {{ font-size:12.5px; padding:2px 0 2px 12px; border-left:3px solid #eee; margin:3px 0; }}
  .travel-banner {{ background:#1b4f72; color:#fff; padding:10px 20px; border-radius:8px; margin-bottom:18px; font-size:13px; font-weight:600; }}
  footer {{ text-align:center; padding:16px; font-size:11px; color:#aaa; }}
</style>
</head>
<body>
<div class="header">
  <h1>🇵🇪 BRUNA PERÚ &nbsp;|&nbsp; WEEKLY REVIEW</h1>
  <p>Dashboard Operativo &nbsp;·&nbsp; {FECHA} &nbsp;·&nbsp; Causita Intelligence &nbsp;·&nbsp; Confidencial</p>
</div>
<div class="container">
<div class="travel-banner">⚡ SEMANA 5 POST-VISITA 9-OCT: los 3 compromisos (epóxicas 50% Chemifabrik, TiO2 vs Billions 896, fórmulas Arlanxeo) siguen sin ejecución visible. El hito de noviembre vence ESTA SEMANA. Catalizador confirmado: Tronox Q3 (5-nov) — precios TiO2 +4% QoQ y volúmenes −11% QoQ: piso de precios blindado y ventana de cierre Q4 abierta.</div>
"""

# URGENTES
html += '<div class="section urgent"><div class="section-header">🔴 URGENTE ESTA SEMANA (Semana 15)</div>'
for u in urgentes:
    html += f'<div class="item">⚡ {u}</div>'
html += '</div>'

# INTEL
html += '<div class="section intel"><div class="section-header">📬 INTEL DE CORREOS — 3 nov – 9 nov 2026</div>'
for fuente, txt in intel_correos:
    html += f'<div class="item"><span class="label">[{fuente}]</span>{txt}</div>'
html += '</div>'

# CUENTAS
html += '<div class="section cuentas"><div class="section-header">📋 ESTADO DE CUENTAS (12 cuentas)</div>'
for nombre, status, subtareas in cuentas:
    html += f'<div class="cuenta-row"><div><div class="cuenta-name">{nombre}</div>'
    html += f'<div class="cuenta-tasks">' + ' &nbsp;|&nbsp; '.join([t[0][:70]+"…" if len(t[0])>70 else t[0] for t in subtareas[:2]]) + '</div></div>'
    html += f'<div>{status_badge(status)}</div></div>'
html += '</div>'

# OVERDUE
html += '<div class="section overdue"><div class="section-header">⏰ OVERDUE CRÓNICO</div>'
for item, semanas, resp in overdue_cronicos:
    html += f'<div class="item">{status_badge("NO AVANZADO")} <strong>[{semanas}]</strong> {item} <span class="tag">→ {resp}</span></div>'
html += '</div>'

# RESPONSABLES
html += '<div class="section resp-section"><div class="section-header">👥 PENDIENTES POR RESPONSABLE</div><div class="grid2">'
for persona, data in pendientes.items():
    html += f'<div class="resp-person"><h4>{persona} &mdash; {data["rol"]}</h4>'
    for tarea, status in data["items"]:
        html += f'<div class="resp-item">{status_badge(status)} {tarea}</div>'
    html += '</div>'
html += '</div></div>'

html += f'<footer>Causita · Bruna Perú / VCB S.A.C. · Weekly Review {FECHA} · Confidencial</footer>'
html += '</div></body></html>'

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

# Validate
from docx import Document as DocxDoc
d = DocxDoc(docx_path)
print(f"DOCX validation OK | paragrafos: {len(d.paragraphs)}")
print(f"DOCX size: {os.path.getsize(docx_path):,} bytes")
print(f"HTML size: {os.path.getsize(html_path):,} bytes")
