#!/usr/bin/env python3
"""Genera Agenda DOCX + HTML Dashboard para Bruna Peru Weekly Review — 01 Jun 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 = "01 de junio, 2026"
FECHA_FILE = "2026-06-01"
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 al 01 Jun 2026 ─────────────────────────────────────
# Novedades email esta semana: ninguna relacionada a Bruna Peru.
# Andres en viaje Escandinavia (Noruega/UK). Regresa semana 6 jun.
# Overdue: Daryza cotizacion +1 sem = 11 sem; Org chart Alicorp +1 sem = 6 sem; PO Norway +1 sem = 5 sem

pendientes = {
    "Victor Alfaro": {
        "rol": "Gerente General Lima",
        "items": [
            ("Confirmar reunion Oscar Rosas — status jueves (semana pasada) + nuevo agendamiento", "VERIFICAR"),
            ("Coordinar reunion con referido mineria (reunion pendiente)", "VERIFICAR"),
            ("Qroma — Carlos Baldion: neopreno, caucho clorado, parafina — sin evidencia 3 sem", "NO AVANZADO"),
            ("Prospectos Pintura — cold visits Anipsa, Perupaint, Soprint, Interpaint", "VERIFICAR"),
        ]
    },
    "Jennifer Segura": {
        "rol": "Lider Mercado Peru",
        "items": [
            ("Cotizacion formal Daryza (lista 30+ MPs de Urbina recibida 11 mar) — OVERDUE 11 sem", "NO AVANZADO"),
            ("Aurora Paint — resinas epoxicas VYTA BPA: respuesta pendiente", "NO AVANZADO"),
            ("Universal Colors — status TiO2 588 y oxidos hierro (Erika/Murillo)", "VERIFICAR"),
            ("Global Titanium — revisar paquete/notificacion recibida y reportar", "VERIFICAR"),
        ]
    },
    "Andres Bruna": {
        "rol": "Director Nuevos Mercados",
        "items": [
            ("Pedro Klein (Bruna Brain) — insistir hasta obtener reunion", "VERIFICAR"),
            ("Status Oral Care — tubos, formula, equipos (Ruby)", "VERIFICAR"),
            ("Alimentos — obtener resumen completo reunion 30 abr", "VERIFICAR"),
            ("MIBC, xantatos — ficha tecnica + pricing para Mineria", "VERIFICAR"),
        ]
    },
    "Jorge Bruna": {
        "rol": "Empaques",
        "items": [
            ("Romex/Nico — update tapas y liners; confirmar status produccion", "VERIFICAR"),
            ("Oral Care — update mecanica tubos y empaque", "VERIFICAR"),
        ]
    },
    "Carlos Artavia": {
        "rol": "Logistica / SPU",
        "items": [
            ("Confirmar pago impuestos y liberacion de carga con Ileana — OVERDUE 2 sem", "NO AVANZADO"),
            ("CargoFlex — 1ra entrega 5,400 kg: confirmar estado actual", "VERIFICAR"),
            ("Planificar CargoFlex 6,600 kg restantes", "VERIFICAR"),
            ("PO Norway — inventario status (OVERDUE 5 sem)", "NO AVANZADO"),
        ]
    },
    "Vanessa Garcia": {
        "rol": "BDU",
        "items": [
            ("Subir factura al sistema — receptora pendiente", "VERIFICAR"),
            ("Org chart Alicorp actualizado + costos reales Policloropreno (OVERDUE 6 sem)", "NO AVANZADO"),
        ]
    },
    "Mildred": {
        "rol": "Admin",
        "items": [
            ("Portal Evis — pagos y facturacion pendientes", "VERIFICAR"),
        ]
    },
    "Lourdes Arley": {
        "rol": "Finanzas",
        "items": [
            ("Confirmacion pago impuestos / fondeos VCB — coordinar con Carlos", "VERIFICAR"),
        ]
    },
}

cuentas = [
    ("Alicorp / Grupo Romero", "VERIFICAR", [
        ("Lufarol, CaCO3, 12 productos aprobados — status muestras", "Jennifer Segura", "P1"),
        ("Org chart actualizado + costos reales Policloropreno (OVERDUE 6 sem)", "Vanessa Garcia", "P1"),
    ]),
    ("Cafetal (K2CO3 oral)", "NO AVANZADO", [
        ("CargoFlex: confirmar estado 1ra entrega 5,400 kg", "Carlos Artavia", "P1"),
        ("Pago impuestos + liberacion de carga con Ileana — OVERDUE 2 sem", "Carlos Artavia", "P1"),
        ("Planificar 6,600 kg restantes con CargoFlex", "Carlos Artavia", "P2"),
    ]),
    ("Romex / Nico", "VERIFICAR", [
        ("Status liner y problemas de produccion (chat tecnico)", "Jorge Bruna", "P1"),
        ("Update tapas y liners", "Jorge Bruna", "P2"),
    ]),
    ("Daryza", "NO AVANZADO", [
        ("Cotizacion formal PENDIENTE 11 semanas (lista recibida 11 mar)", "Jennifer Segura", "P1"),
        ("MPs prioritarias: Lauril Eter Sulfato 82t, Ac. Sulfonico 58t, NaOH 50% 46t, PEAD 38t", "", "P1"),
        ("Confirmar meeting de seguimiento con Urbina", "Jennifer Segura", "P2"),
    ]),
    ("Aurora Paint", "NO AVANZADO", [
        ("Resinas epoxicas VYTA BPA — seguimiento sin respuesta 2+ semanas", "Jennifer Segura", "P1"),
        ("Arisa y Licor — seguimiento paralelo", "Jennifer Segura", "P2"),
    ]),
    ("Universal Colors", "VERIFICAR", [
        ("TiO2 588 y oxidos hierro — status con Erika/Murillo", "Jennifer Segura", "P2"),
        ("Google Alerts TiO2 activos — monitorear", "", "P3"),
    ]),
    ("Qroma", "NO AVANZADO", [
        ("Carlos Baldion — neopreno, caucho clorado, parafina: sin contacto 3 sem", "Victor Alfaro", "P2"),
    ]),
    ("Prospectos Pintura", "VERIFICAR", [
        ("Anipsa, Perupaint, Soprint, Interpaint — cold visits pendientes", "Victor Alfaro", "P3"),
    ]),
    ("Plasticos", "VERIFICAR", [
        ("Tigre, Andinaplast, Inproplast, Nicoll — cera PE, TiO2, masterbatch", "Victor Alfaro", "P3"),
    ]),
    ("Mineria", "VERIFICAR", [
        ("Reunion Oscar Rosas — confirmar resultado de reunion semana pasada o reagendar", "Victor Alfaro", "P1"),
        ("Coordinar reunion referido mineria", "Victor Alfaro", "P1"),
        ("MIBC, xantatos, lubricantes — ficha tecnica + pricing", "Andres Bruna", "P2"),
    ]),
    ("Oral Care", "VERIFICAR", [
        ("Status tubos, formula, equipos — Ruby", "Andres Bruna", "P1"),
        ("Update empaque y mecanica tubos", "Jorge Bruna", "P2"),
    ]),
    ("Alimentos", "VERIFICAR", [
        ("Resumen reunion 30 abr — pendiente completar", "Andres Bruna", "P1"),
        ("Pursuit, JAVA, Creafoods — acidos y especialidades: pipeline status", "Victor Alfaro", "P2"),
    ]),
]

# ─── 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)

# Titulo
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("AGENDA REVISION SEMANAL — BRUNA PERU")
run.bold = True
run.font.size = Pt(20)
run.font.color.rgb = NAVY

p2 = doc.add_paragraph()
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
r2 = p2.add_run(f"Semana del {FECHA}  |  VCB S.A.C.")
r2.bold = True
r2.font.size = Pt(13)
r2.font.color.rgb = ACCENT

p3 = doc.add_paragraph()
p3.alignment = WD_ALIGN_PARAGRAPH.CENTER
r3 = p3.add_run("Confidencial — Uso Interno")
r3.italic = True
r3.font.size = Pt(9)
r3.font.color.rgb = GRAY

add_divider(doc)

# NOTA OPERATIVA
add_heading(doc, "NOTA OPERATIVA", level=2, color=ORANGE)
doc.add_paragraph("Emails escaneados (gmail + iCloud, 7 dias): 0 emails de Peru/VCB encontrados. Andres en viaje Escandinavia (Noruega/UK). Overdue counters incrementados.").runs[0].font.size = Pt(9)

add_divider(doc)

# PARTE 1
add_heading(doc, "PARTE 1 — REVISION PENDIENTES (semana anterior)", level=1, color=NAVY)
doc.add_paragraph("Fuente: emails Himalaya (0 nuevos Peru). Overdue incrementado.").runs[0].font.size = Pt(9)

for persona, data in pendientes.items():
    add_heading(doc, f"  {persona}  |  {data['rol']}", level=2, color=ACCENT)
    for tarea, status in data["items"]:
        add_status_item(doc, tarea, status, indent_in=0.5)

add_divider(doc)

# PARTE 2
add_heading(doc, "PARTE 2 — NOVEDADES DE LA SEMANA", level=1, color=NAVY)

add_heading(doc, "Emails Peru (26 may - 01 jun)", level=2, color=ACCENT)
add_bullet(doc, "NINGUNO relevante encontrado. Gmail: 0 matches. iCloud: 0 matches. Andres fuera de Lima.")
add_bullet(doc, "Andres Bruna en viaje Noruega/Escandinavia (vuelo SAS confirmado, regreso ~1 jun, hotel Heathrow 6 jun).")

add_heading(doc, "Market Intel", level=2, color=ACCENT)
add_bullet(doc, "TiO2: Google Alert activo. Sheffield actualiza mineria en Thunderbird; Doral envia primer HMC de Coburn; Kazera entra en produccion Walviskop. Mercado activo — monitorear precios para Universal Colors y pintura.")
add_bullet(doc, "TZMI Congress 2026 — registros abiertos (email recibido 29 may). Andres en lista de distribucion. Relevante para posicionamiento en minerales pesados.")

add_heading(doc, "Alertas Operativas", level=2, color=ACCENT)
add_status_item(doc, "Daryza cotizacion: 11 semanas sin entregar — CRITICO", "NO AVANZADO", "Jennifer Segura")
add_status_item(doc, "Impuestos Cafetal / liberacion carga: 2 sem sin confirmar", "NO AVANZADO", "Carlos Artavia")
add_status_item(doc, "PO Norway inventario: 5 sem sin update", "NO AVANZADO", "Carlos Artavia")
add_status_item(doc, "Org chart Alicorp: 6 sem sin actualizar", "NO AVANZADO", "Vanessa Garcia")
add_status_item(doc, "Aurora Paint: sin respuesta 2+ semanas", "NO AVANZADO", "Jennifer Segura")
add_status_item(doc, "Qroma — Baldion: sin contacto 3 semanas", "NO AVANZADO", "Victor Alfaro")

add_divider(doc)

# PARTE 3
add_heading(doc, "PARTE 3 — AGENDA POR CUENTA (12 cuentas)", level=1, color=NAVY)

for i, (nombre, status, items) in enumerate(cuentas, 1):
    add_heading(doc, f"  {i}. {nombre}", level=2, color=ACCENT)
    sp = doc.add_paragraph()
    sp.paragraph_format.left_indent = Inches(0.4)
    sr = sp.add_run(f"Status: [{status}]")
    sr.bold = True
    sr.font.size = Pt(10)
    sr.font.color.rgb = STATUS_COLORS.get(status, DARK)

    for tarea, responsable, prioridad in items:
        p_color = RED if prioridad == "P1" else ORANGE if prioridad == "P2" else GRAY
        p = doc.add_paragraph()
        p.paragraph_format.left_indent = Inches(0.6)
        p.paragraph_format.space_before = Pt(2)
        p.paragraph_format.space_after = Pt(2)
        pr = p.add_run(f"[{prioridad}] ")
        pr.font.color.rgb = p_color
        pr.bold = True
        pr.font.size = Pt(10)
        tr = p.add_run(tarea)
        tr.font.size = Pt(10)
        if responsable:
            rr = p.add_run(f"  \u2192 {responsable}")
            rr.font.color.rgb = ACCENT
            rr.font.size = Pt(9)

add_divider(doc)

# PARTE 3B
add_heading(doc, "PARTE 3B — PROYECTOS ESTRATEGICOS", level=1, color=NAVY)

proyectos = [
    ("Mineria", PURPLE, ["Oscar Rosas — confirmar resultado reunion o reagendar urgente", "Portfolio: MIBC, xantatos, lubricantes", "Preparar ficha tecnica + pricing (Andres)"]),
    ("Oral Care", PURPLE, ["Status tubos / formula / equipos — Ruby", "Jorge Bruna: mecanica tubos y empaque", "Andres: coordinacion tecnica general"]),
    ("Alimentos", PURPLE, ["Resumen reunion 30 abr — completar (Andres)", "Pursuit, JAVA, Creafoods: acidos y especialidades", "Victor: follow-up presencial Lima"]),
    ("Bruna Brain", PURPLE, ["Pedro Klein: insistir para conseguir reunion", "Andres: actualizar pipeline"]),
]

for nombre, color, items in proyectos:
    add_heading(doc, f"  {nombre}", level=2, color=color)
    for item in items:
        add_bullet(doc, item)

add_divider(doc)

# RESUMEN EJECUTIVO
add_heading(doc, "RESUMEN EJECUTIVO", level=1, color=NAVY)

add_heading(doc, "HOY — Urgente", level=2, color=RED)
for item in [
    ("Carlos Artavia: Confirmar pago impuestos + liberacion carga Cafetal (OVERDUE 2 sem)", "NO AVANZADO", "Carlos Artavia"),
    ("Jennifer Segura: Cotizacion Daryza — debe salir esta semana (11 sem OVERDUE)", "NO AVANZADO", "Jennifer Segura"),
    ("Victor Alfaro: Confirmar status reunion Oscar Rosas + reagendar si no ocurrio", "VERIFICAR", "Victor Alfaro"),
    ("Jennifer Segura: Aurora Paint — contacto directo y reportar", "NO AVANZADO", "Jennifer Segura"),
]:
    add_status_item(doc, item[0], item[1], indent_in=0.4)

add_heading(doc, "ESTA SEMANA", level=2, color=ORANGE)
for item in [
    "Jennifer: TiO2 Universal Colors — status con Erika/Murillo",
    "Carlos: Planificar CargoFlex 6,600 kg restantes",
    "Jorge: Confirmar status liner Romex + Oral Care update",
    "Vanessa: Org chart Alicorp + subir factura al sistema",
    "Andres (regreso viaje): Status Oral Care, Alimentos, Pedro Klein",
    "Victor: Qroma — retomar contacto con Baldion",
]:
    add_status_item(doc, item, "VERIFICAR", indent_in=0.4)

add_heading(doc, "OVERDUE CRONICO", level=2, color=RED)
for tarea, resp, sem in [
    ("Cotizacion Daryza (lista recibida 11 mar)", "Jennifer Segura", 11),
    ("Org chart Alicorp actualizado", "Vanessa Garcia", 6),
    ("Inventario PO Norway", "Carlos Artavia", 5),
    ("Liberacion carga / impuestos Cafetal", "Carlos Artavia", 2),
]:
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Inches(0.4)
    pr = p.add_run(f"[{sem} sem OVERDUE] ")
    pr.bold = True
    pr.font.color.rgb = RED
    pr.font.size = Pt(10)
    tr = p.add_run(f"{tarea}  -> {resp}")
    tr.font.size = Pt(10)

add_divider(doc)

# Footer
fp = doc.add_paragraph()
fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
fr = fp.add_run(f"Generado por Causita (Hermes Agent) | {FECHA} | Confidencial — Bruna Peru / VCB S.A.C.")
fr.font.size = Pt(8)
fr.font.color.rgb = GRAY
fr.italic = True

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

# ─── HTML ──────────────────────────────────────────────────────────────
def badge(status):
    cls = status.replace(" ", "-")
    return f'<span class="badge badge-{cls}">{status}</span>'

def prio_badge(p):
    return f'<span class="badge badge-{p}">{p}</span>'

cards_html = ""
for i, (nombre, status, items) in enumerate(cuentas, 1):
    items_html = ""
    for tarea, responsable, prioridad in items:
        resp_html = f'<br><span class="item-resp">&rarr; {responsable}</span>' if responsable else ""
        items_html += f'<li>{prio_badge(prioridad)} <div><span class="item-text">{tarea}</span>{resp_html}</div></li>\n'
    cards_html += f'''
  <div class="card">
    <div class="card-title">{i}. {nombre} {badge(status)}</div>
    <ul class="item-list">{items_html}</ul>
  </div>
'''

resp_sections_html = ""
for persona, data in pendientes.items():
    items_html = ""
    for tarea, status in data["items"]:
        items_html += f'<li><div class="checkbox"></div><div><span class="item-text">{tarea}</span> {badge(status)}</div></li>\n'
    resp_sections_html += f'''
<div class="resp-section">
  <div class="resp-name">{persona}</div>
  <div class="resp-rol">{data["rol"]}</div>
  <ul class="resp-items">{items_html}</ul>
</div>
'''

html = f"""<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard Bruna Peru - 01 Jun 2026</title>
<style>
  * {{ box-sizing: border-box; margin: 0; padding: 0; }}
  body {{ font-family: 'Segoe UI', Arial, sans-serif; background: #0d1b2a; color: #e8edf2; min-height: 100vh; }}
  .header {{ background: linear-gradient(135deg, #1B4F72 0%, #0d2d44 100%); padding: 24px 32px; border-bottom: 3px solid #2E86C1; }}
  .header h1 {{ font-size: 1.7rem; font-weight: 700; color: #fff; }}
  .header .sub {{ color: #85c1e9; font-size: 0.9rem; margin-top: 4px; }}
  .header .meta {{ color: #7fb3d3; font-size: 0.78rem; margin-top: 8px; }}
  .conf {{ display: inline-block; background: #c0392b; color: #fff; padding: 2px 10px; border-radius: 3px; font-size: 0.72rem; font-weight: 700; margin-top: 8px; }}
  .container {{ max-width: 1400px; margin: 0 auto; padding: 24px 16px; }}
  .section-title {{ font-size: 1.15rem; font-weight: 700; color: #2E86C1; border-left: 4px solid #2E86C1; padding-left: 12px; margin: 28px 0 14px; }}
  .grid {{ display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 14px; }}
  .card {{ background: #1a2a3a; border-radius: 10px; padding: 14px; border: 1px solid #243647; }}
  .card-title {{ font-size: 0.95rem; font-weight: 700; color: #fff; margin-bottom: 8px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }}
  .badge {{ display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 0.7rem; font-weight: 700; }}
  .badge-HECHO {{ background: #1a5c36; color: #27AE60; border: 1px solid #27AE60; }}
  .badge-AVANZADO {{ background: #4a3f00; color: #F1C40F; border: 1px solid #F1C40F; }}
  .badge-VERIFICAR {{ background: #4a2c00; color: #E67E22; border: 1px solid #E67E22; }}
  .badge-NO-AVANZADO {{ background: #4a1515; color: #C0392B; border: 1px solid #C0392B; }}
  .badge-NUEVO {{ background: #2d1a4a; color: #8E44AD; border: 1px solid #8E44AD; }}
  .badge-OVERDUE {{ background: #4a0000; color: #ff4444; border: 1px solid #ff4444; }}
  .badge-P1 {{ background: #4a1515; color: #e74c3c; border: 1px solid #e74c3c; }}
  .badge-P2 {{ background: #4a2c00; color: #E67E22; border: 1px solid #E67E22; }}
  .badge-P3 {{ background: #1a2a3a; color: #7f8c8d; border: 1px solid #7f8c8d; }}
  .item-list {{ list-style: none; margin-top: 6px; }}
  .item-list li {{ display: flex; align-items: flex-start; gap: 6px; padding: 4px 0; border-bottom: 1px solid #1e3347; font-size: 0.82rem; line-height: 1.4; }}
  .item-list li:last-child {{ border-bottom: none; }}
  .item-text {{ flex: 1; color: #c5d5e4; }}
  .item-resp {{ color: #2E86C1; font-size: 0.75rem; font-style: italic; }}
  .news-card {{ background: #162030; border-radius: 8px; padding: 14px; border-left: 4px solid #2E86C1; margin-bottom: 12px; }}
  .news-card h4 {{ color: #2E86C1; font-size: 0.9rem; margin-bottom: 6px; }}
  .news-card p {{ color: #95a5a6; font-size: 0.82rem; line-height: 1.5; }}
  .news-card .tag {{ font-size: 0.7rem; background: #1B4F72; color: #85c1e9; padding: 2px 8px; border-radius: 10px; display: inline-block; margin-top: 6px; }}
  .alert-card {{ border-left-color: #C0392B; }}
  .alert-card h4 {{ color: #e74c3c; }}
  .resp-section {{ background: #1a2a3a; border-radius: 10px; padding: 14px; margin-bottom: 12px; border: 1px solid #243647; }}
  .resp-name {{ font-size: 1rem; font-weight: 700; color: #fff; margin-bottom: 3px; }}
  .resp-rol {{ color: #7fb3d3; font-size: 0.8rem; margin-bottom: 10px; }}
  .resp-items {{ list-style: none; }}
  .resp-items li {{ display: flex; align-items: flex-start; gap: 8px; padding: 5px 0; border-bottom: 1px solid #1e3347; font-size: 0.82rem; }}
  .resp-items li:last-child {{ border-bottom: none; }}
  .checkbox {{ width: 15px; height: 15px; border: 2px solid #2E86C1; border-radius: 3px; flex-shrink: 0; margin-top: 2px; }}
  .overdue-section {{ background: #1a0a0a; border: 1px solid #4a1515; border-radius: 10px; padding: 14px; margin: 24px 0; }}
  .overdue-title {{ color: #e74c3c; font-size: 1rem; font-weight: 700; margin-bottom: 12px; }}
  .nota-viaje {{ background: #1a2d1a; border: 1px solid #27AE60; border-radius: 8px; padding: 12px 16px; margin-bottom: 16px; color: #a8d5a2; font-size: 0.85rem; }}
  .footer {{ text-align: center; padding: 20px; color: #4a6278; font-size: 0.75rem; border-top: 1px solid #1e3347; margin-top: 24px; }}
  @media (max-width: 768px) {{ .grid {{ grid-template-columns: 1fr; }} .header h1 {{ font-size: 1.2rem; }} }}
</style>
</head>
<body>
<div class="header">
  <h1>&#127477;&#127466; BRUNA PERU &mdash; REVISION SEMANAL</h1>
  <div class="sub">VCB S.A.C. | Semana del 01 de junio, 2026</div>
  <div class="meta">Generado: 01 Jun 2026 | Fuentes: Gmail, iCloud (0 emails Peru esta semana) | Andres en viaje Escandinavia/UK</div>
  <span class="conf">CONFIDENCIAL &mdash; Uso Interno Bruna Peru / VCB S.A.C.</span>
</div>

<div class="container">

<div class="nota-viaje">
  &#9992;&#65039; <strong>Andres en viaje:</strong> Noruega/Escandinavia (mayo) &rarr; London Heathrow 6 jun. No hay emails operativos Peru esta semana. Overdue siguen corriendo.
</div>

<div class="section-title">&#128240; SECCION 1 &mdash; NOTICIAS Y RELEVANTES</div>

<div class="news-card alert-card">
  <h4>&#9888; Daryza &mdash; OVERDUE CRITICO: 11 semanas</h4>
  <p>Cotizacion formal pendiente desde lista recibida el 11 mar 2026. Volumen potencial: Lauril Eter Sulfato 82t, Ac. Sulfonico 58t, NaOH 50% 46t, PEAD 38t + 26 MPs adicionales. <strong>Jennifer debe entregar esta semana sin excepcion.</strong></p>
  <span class="tag">Daryza &middot; Jennifer Segura &middot; OVERDUE 11 sem &middot; P1</span>
</div>

<div class="news-card alert-card">
  <h4>&#9888; Cafetal &mdash; Impuestos y liberacion de carga sin confirmar (2 sem)</h4>
  <p>CargoFlex 1ra entrega 5,400 kg pendiente de confirmacion. 6,600 kg restantes sin planificar. Carlos Artavia debe confirmar con Ileana esta semana.</p>
  <span class="tag">Cafetal &middot; Carlos Artavia &middot; P1</span>
</div>

<div class="news-card">
  <h4>&#128202; TiO2 &mdash; Mercado Activo (TZMI 28 may)</h4>
  <p>Sheffield actualiza mineria en Thunderbird; Doral envia primer HMC de Coburn; Kazera entra en produccion acuerdo Walviskop. TZMI Congress 2026 con registros abiertos. Andres en lista de distribucion. Monitorear para Universal Colors y pintura.</p>
  <span class="tag">Universal Colors &middot; Mineria &middot; Mercado</span>
</div>

<div class="news-card alert-card">
  <h4>&#9888; Aurora Paint &mdash; Sin respuesta 2+ semanas</h4>
  <p>Resinas epoxicas VYTA BPA sin respuesta. Jennifer debe contacto directo esta semana.</p>
  <span class="tag">Aurora Paint &middot; Jennifer Segura &middot; P1</span>
</div>

<div class="section-title">&#128196; SECCION 2 &mdash; PENDIENTES POR CUENTA</div>
<div class="grid">
{cards_html}
</div>

<div class="section-title">&#128101; SECCION 3 &mdash; RESPONSABLES</div>
{resp_sections_html}

<div class="overdue-section">
  <div class="overdue-title">&#8987; OVERDUE CRONICO</div>
  <ul class="item-list">
    <li><span class="badge badge-OVERDUE">11 sem</span> <div class="item-text">Cotizacion Daryza (lista recibida 11 mar)<br><span class="item-resp">&rarr; Jennifer Segura</span></div></li>
    <li><span class="badge badge-OVERDUE">6 sem</span> <div class="item-text">Org chart Alicorp actualizado<br><span class="item-resp">&rarr; Vanessa Garcia</span></div></li>
    <li><span class="badge badge-OVERDUE">5 sem</span> <div class="item-text">Inventario PO Norway<br><span class="item-resp">&rarr; Carlos Artavia</span></div></li>
    <li><span class="badge badge-OVERDUE">2 sem</span> <div class="item-text">Pago impuestos / liberacion carga Cafetal<br><span class="item-resp">&rarr; Carlos Artavia</span></div></li>
  </ul>
</div>

</div>

<div class="footer">
  Generado por Causita (Hermes Agent) &middot; 01 Jun 2026 &middot; Confidencial &mdash; Bruna Peru / VCB S.A.C.<br>
  Fuentes: Gmail (andybruna@gmail.com), iCloud &middot; 0 emails Peru esta semana &middot; Andres en viaje
</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 saved: {html_path}")

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