#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Crea una copia del navegador de contactos de la Expo con:
  - botón de WhatsApp con el mensaje ya precargado (wa.me)
  - enlace a la carta PDF de cada contacto
  - columna «Asesor» (Luis Carlos / Diego)

Entrada:
  Contactos_Expo_Agro-2026.html
  Contactos_Expo_Agro-2026.xlsx
  Mensajes_WhatsApp.csv
  Cartas_PDF/

Salida:
  Contactos_Expo_Agro-2026_WhatsApp.html
"""

from __future__ import annotations

import csv
import json
import re
from pathlib import Path
from urllib.parse import quote

import openpyxl

ROOT = Path(__file__).resolve().parent
SRC = ROOT / "Contactos_Expo_Agro-2026.html"
XLSX = ROOT / "Contactos_Expo_Agro-2026.xlsx"
CSV = ROOT / "Mensajes_WhatsApp.csv"
OUT = ROOT / "Contactos_Expo_Agro-2026_WhatsApp.html"

OWNER_D = "Diego Quintero"
OWNER_L = "Luis Carlos Gutiérrez Barragán"


def clean(value) -> str:
    if value is None:
        return ""
    return re.sub(r"\s+", " ", str(value)).strip()


def load_sources():
    with CSV.open(encoding="utf-8-sig", newline="") as fh:
        messages = {int(r["#"]): r for r in csv.DictReader(fh)}

    ws = openpyxl.load_workbook(XLSX, data_only=True)["Contactos"]
    rows = list(ws.iter_rows(values_only=True))
    headers = [clean(h) for h in rows[0]]
    records = [dict(zip(headers, r)) for r in rows[1:] if any(v is not None for v in r)]
    return messages, records


def main() -> int:
    html = SRC.read_text(encoding="utf-8")
    messages, records = load_sources()

    send = {}
    for index, row in enumerate(records, 1):
        csv_row = messages.get(index, {})
        e164 = clean(csv_row.get("Telefono_E164"))
        msg = csv_row.get("Mensaje", "")
        pdf_name = clean(csv_row.get("PDF"))
        source = clean(row["Fuente"]).upper()
        owner = OWNER_D if source.startswith("D") else OWNER_L
        wa = ""
        if e164:
            wa = f"https://wa.me/{e164.lstrip('+')}?text={quote(msg, safe='')}"
        send[str(index)] = {
            "wa": wa,
            "pdf": f"Cartas_PDF/{pdf_name}" if pdf_name else "",
            "owner": owner,
            "nombre": clean(csv_row.get("Nombre")),
        }

    send_js = "const SEND = " + json.dumps(send, ensure_ascii=False, separators=(",", ":")) + ";"

    # ---------------------------------------------------------------- CSS
    html = html.replace(
        ".thead{display:grid;grid-template-columns:minmax(230px,2.2fr) 1.3fr 1.6fr 1.4fr 90px 74px;",
        ".thead{display:grid;grid-template-columns:minmax(230px,2.2fr) 1.3fr 1.6fr 1.4fr 90px 74px 152px;",
        1,
    )
    html = html.replace(
        ".ctrow{display:grid;grid-template-columns:minmax(230px,2.2fr) 1.3fr 1.6fr 1.4fr 90px 74px;",
        ".ctrow{display:grid;grid-template-columns:minmax(230px,2.2fr) 1.3fr 1.6fr 1.4fr 90px 74px 152px;",
        1,
    )
    html = html.replace(
        ".cstate{justify-self:start;display:flex;flex-direction:column;gap:4px;align-items:flex-start;font-variant-numeric:tabular-nums}",
        ".cstate{justify-self:start;display:flex;flex-direction:column;gap:4px;align-items:flex-start;font-variant-numeric:tabular-nums}\n"
        ".csend{justify-self:start;display:flex;flex-direction:column;gap:6px}\n"
        ".sendbtn{font-family:\"Lexend\",sans-serif;font-size:11.5px;font-weight:600;border-radius:8px;padding:6px 10px;display:inline-flex;align-items:center;gap:5px;text-decoration:none;white-space:nowrap;border:1px solid transparent;transition:filter .15s,background .15s}\n"
        ".sendbtn:hover{filter:brightness(1.04);text-decoration:none}\n"
        ".sendbtn.wa{background:var(--green);color:var(--ink);border-color:#3E9A2A}\n"
        ".sendbtn.wa:hover{background:var(--green-2)}\n"
        ".sendbtn.pdf{background:var(--soft);color:var(--green-deep);border-color:var(--soft2)}\n"
        ".sendbtn.pdf:hover{background:var(--soft2)}\n"
        ".sendbtn svg{flex:none}\n"
        ".sendnote{font-size:11.5px;color:var(--ink3)}",
        1,
    )
    html = html.replace(
        "  .cstate{grid-column:2;grid-row:1;justify-self:end;align-items:flex-end}",
        "  .cstate{grid-column:2;grid-row:1;justify-self:end;align-items:flex-end}\n"
        "  .csend{grid-column:1/-1;justify-self:start;flex-direction:row;flex-wrap:wrap;margin-top:2px}",
        1,
    )

    html = html.replace(
        '.brandmark .who{font-family:"Lexend",sans-serif;font-size:12.5px;color:var(--ink2);line-height:1.3}',
        '.brandmark{min-width:0}\n'
        '.brandmark .who{font-family:"Lexend",sans-serif;font-size:12.5px;color:var(--ink2);line-height:1.3;min-width:0;overflow-wrap:anywhere}',
        1,
    )

    # --------------------------------------------------------------- ICONS
    html = html.replace(
        "</svg>'\n};",
        "</svg>'\n};\n"
        "ICONS.pdf = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6\"/><path d=\"M8 13h8M8 17h8\"/></svg>';",
        1,
    )

    # ------------------------------------------------------------ SEND data
    html = html.replace(
        '\nconst state = { view:"contactos", q:"", filter:"todos", expanded:new Set() };',
        "\n" + send_js + '\n\nconst state = { view:"contactos", q:"", filter:"todos", expanded:new Set() };',
        1,
    )

    # ------------------------------------------------------------ render rows
    html = html.replace(
        '    const waHtml = wl ? `<a href="https://wa.me/${wl.replace("+","")}" target="_blank" rel="noopener">${ICONS.wa}WhatsApp</a>` : "";',
        "    const send = SEND[id+1] || {};\n"
        '    const waHtml = send.wa ? `<a href="${send.wa}" target="_blank" rel="noopener">${ICONS.wa}WhatsApp</a>` : "";\n'
        "    const sendHtml = `<span class=\"csend\">${send.wa?`<a class=\"sendbtn wa\" href=\"${send.wa}\" target=\"_blank\" rel=\"noopener\">${ICONS.wa}WhatsApp</a>`:''}${send.pdf?`<a class=\"sendbtn pdf\" href=\"${send.pdf}\" target=\"_blank\" rel=\"noopener\">${ICONS.pdf}Carta PDF</a>`:''}</span>`;",
        1,
    )
    html = html.replace(
        '        <span class="cstate">${badges}</span>\n      </div>',
        '        <span class="cstate">${badges}</span>\n        ${sendHtml}\n      </div>',
        1,
    )

    # ------------------------------------------------------------ header/table
    html = html.replace(
        '<span>Fuente</span><span>Estado</span></div>',
        '<span>Fuente</span><span>Estado</span><span>Enviar</span></div>',
        1,
    )
    html = html.replace(
        "Todo lo que el equipo recolectó en la Expo Agrofuturo 2026: la lista de contactos de Diego y Luis Carlos y el trabajo de verificación que queda por cerrar.",
        "Todo lo que el equipo recolectó en la Expo Agrofuturo 2026, ya con su carta PDF y su mensaje de WhatsApp listos para enviar. Filtra, revisa y contacta sin salir de esta página.",
        1,
    )
    html = html.replace(
        "Expo Agrofuturo 2026 · seguimiento de contactos",
        "Expo Agrofuturo 2026 · envío por WhatsApp",
        1,
    )
    html = html.replace(
        '<title>Contactos Expo Agrofuturo 2026 — Agro Revolution</title>',
        '<title>Contactos Expo Agrofuturo 2026 — Envío por WhatsApp</title>',
        1,
    )

    # footer line built in JS
    html = re.sub(
        r'\$\("#foot-src"\)\.innerHTML = `.*?`;',
        '$("#foot-src").innerHTML = `<b>106 cartas PDF</b> · mensajes de WhatsApp precargados · lotes de Diego (34) y Luis Carlos (72)`;',
        html,
        count=1,
        flags=re.S,
    )

    # add a short note under the chips
    html = html.replace(
        '      <div class="chips" id="chips" role="group" aria-label="Filtros"></div>\n    </div>',
        '      <div class="chips" id="chips" role="group" aria-label="Filtros"></div>\n'
        '      <p class="sendnote">Cada fila abre WhatsApp con el mensaje del asesor ya escrito y la carta PDF de ese contacto.</p>\n'
        "    </div>",
        1,
    )

    OUT.write_text(html, encoding="utf-8")

    # Sanity checks
    missing_pdf = [k for k, v in send.items() if not v["pdf"]]
    missing_wa = [k for k, v in send.items() if not v["wa"]]
    print(f"OK — {OUT}")
    print(f"contactos: {len(send)} | con WhatsApp: {len(send) - len(missing_wa)} | con carta: {len(send) - len(missing_pdf)}")
    print(f"sin WhatsApp: {missing_wa}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
