/* global React, lucide */
const { useState, useMemo } = React;

/* ----------------------------- Icon (lucide) ----------------------------- */
function Icon({ name, size = 20, strokeWidth = 2, className = "", style }) {
  const set = (window.lucide && window.lucide.icons) || {};
  const node = set[name];
  if (!node) {
    return (
      <svg width={size} height={size} viewBox="0 0 24 24" className={className} style={style}
        fill="none" stroke="currentColor" strokeWidth={strokeWidth}
        strokeLinecap="round" strokeLinejoin="round">
        <circle cx="12" cy="12" r="9" />
      </svg>
    );
  }
  const childNodes = Array.isArray(node[2]) ? node[2] : [];
  const children = childNodes.map((child, i) => {
    const [tag, attrs] = child;
    return React.createElement(tag, { key: i, ...attrs });
  });
  return React.createElement(
    "svg",
    {
      xmlns: "http://www.w3.org/2000/svg",
      width: size, height: size, viewBox: "0 0 24 24",
      fill: "none", stroke: "currentColor", strokeWidth,
      strokeLinecap: "round", strokeLinejoin: "round",
      className, style,
    },
    children
  );
}

/* ------------------------------- Helpers --------------------------------- */
const copFmt = new Intl.NumberFormat("es-CO", {
  style: "currency", currency: "COP", maximumFractionDigits: 0,
});
function formatCOP(n) {
  return copFmt.format(n).replace(/\s/g, " ");
}
function formatCompactCOP(n) {
  const abs = Math.abs(n);
  const sign = n < 0 ? "-" : "";
  if (abs >= 1_000_000_000) return `${sign}$${(abs / 1_000_000_000).toFixed(abs % 1_000_000_000 === 0 ? 0 : 1)} MM`;
  if (abs >= 1_000_000) return `${sign}$${(abs / 1_000_000).toFixed(abs % 1_000_000 === 0 ? 0 : 0)} M`;
  if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(0)} K`;
  return `${sign}$${abs}`;
}

/* Striped placeholder for imagery (per art direction) */
function Placeholder({ label, className = "", tone = "warm" }) {
  const grad = tone === "dark"
    ? "repeating-linear-gradient(135deg,#564b47,#564b47 11px,#4d433f 11px,#4d433f 22px)"
    : "repeating-linear-gradient(135deg,#e7e0db,#e7e0db 11px,#ddd4cd 11px,#ddd4cd 22px)";
  const txt = tone === "dark" ? "text-taupe-200" : "text-taupe-500";
  return (
    <div className={`relative overflow-hidden ${className}`} style={{ background: grad }}>
      <div className="absolute inset-0 flex items-end p-3">
        <span className={`font-mono text-[10px] uppercase tracking-[0.14em] ${txt} bg-white/55 px-1.5 py-0.5 rounded`}>
          {label}
        </span>
      </div>
    </div>
  );
}

/* Legal traffic-light dot */
const LEGAL = {
  verde:    { color: "#3f7d4e", bg: "#e4efe6", label: "Al día" },
  amarillo: { color: "#b08208", bg: "#f7eecf", label: "En revisión" },
  rojo:     { color: "#b04a3a", bg: "#f4ddd7", label: "Acción requerida" },
};
function LegalDot({ level, withLabel = false, className = "" }) {
  const l = LEGAL[level] || LEGAL.verde;
  return (
    <span className={`inline-flex items-center gap-2 ${className}`}>
      <span className="inline-flex h-2.5 w-2.5 rounded-full ring-2 ring-white" style={{ background: l.color }} />
      {withLabel && <span className="text-xs font-medium" style={{ color: l.color }}>{l.label}</span>}
    </span>
  );
}

/* Estado pill (development lifecycle) */
const ESTADO_STYLE = {
  "Operando":      "bg-emerald-50 text-emerald-700 ring-emerald-600/20",
  "En ventas":     "bg-amber-50 text-amber-700 ring-amber-600/30",
  "En desarrollo": "bg-taupe-100 text-taupe-700 ring-taupe-500/25",
  "MVP":           "bg-stone-200/70 text-stone-600 ring-stone-500/20",
};
function EstadoPill({ estado, className = "" }) {
  const s = ESTADO_STYLE[estado] || ESTADO_STYLE["En desarrollo"];
  return (
    <span className={`inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-[11px] font-semibold ring-1 ring-inset ${s} ${className}`}>
      <span className="h-1.5 w-1.5 rounded-full bg-current opacity-70" />
      {estado}
    </span>
  );
}

/* -------------------------------- Data ----------------------------------- */
const WHATSAPP = "+57 313 4724458";
const WHATSAPP_URL = "https://wa.me/573134724458";

const VENTURES = [
  { id: "element-calima", name: "Element Calima", sector: "Inmobiliario", estado: "En ventas",     icon: "Building2", desarrollo: 78,  ventasMes: 420_000_000, utilidad: 96_000_000,  legal: "verde",    url: "", page: "Element Calima.html", img: "assets/element/casa-exterior.png", conexiones: [], blurb: "Lotes urbanizados desde 1.500 m² frente al Lago Calima (Restrepo, Valle), con diseño de casa incluido y hotel dentro del proyecto." },
  { id: "mistica",        name: "Mística Hostels",  sector: "Hostelería · Caribe", estado: "Operando", icon: "Tent",   desarrollo: 100, ventasMes: 88_000_000,  utilidad: 24_500_000,  legal: "verde",    url: "misticahostels.com", img: "assets/covers/mistica.png", conexiones: ["alzio"], blurb: "Hostels boutique en Isla Palma y el Parque Tayrona: habitaciones únicas, experiencias de naturaleza y reserva directa." },
  { id: "caribbean",      name: "Caribbean Treasures", sector: "Transporte · Turismo", estado: "Operando", icon: "Compass", desarrollo: 82, ventasMes: 52_000_000, utilidad: 11_000_000, legal: "amarillo", url: "caribbean-treasures.com", img: "https://visit-sanbernardoislands.com/hero.png", conexiones: ["tiketiki", "mistica"], blurb: "Transporte diario en lancha desde Cartagena a las Islas de San Bernardo y Rincón del Mar; reserva online con pago seguro." },
  { id: "alzio",          name: "Alzio",            sector: "IA · Multiagente", estado: "Operando", icon: "Bot",       desarrollo: 100, ventasMes: 38_000_000,  utilidad: 9_800_000,   legal: "verde",    url: "alzio.co", img: "https://alzio.co/og-default.png", conexiones: ["mistica"], blurb: "Plataforma multiagente de IA —ventas, marketing y servicio al cliente— para HORECA, salud y más industrias. Integra WhatsApp, PMS/CRM y pasarelas de pago." },
  { id: "tiketiki",       name: "Tiketiki",         sector: "SaaS · Transporte", estado: "En desarrollo", icon: "Ticket", desarrollo: 46, ventasMes: 0,      utilidad: -8_200_000,  legal: "amarillo", url: "tiketiki.com", img: "https://tiketiki.com/tiketiki/opengraph-image?1b58bc8a591075f7", conexiones: ["caribbean"], blurb: "Sistema operativo SaaS para operadores de transporte en LATAM: venta de boletos online, embarque con QR y conciliación financiera." },
  { id: "libro-bebe",     name: "My First Story",   sector: "App", estado: "En desarrollo",           icon: "Heart",     desarrollo: 32,  ventasMes: 0,           utilidad: -4_100_000,  legal: "verde",    url: "", img: "assets/covers/myfirststory.png", conexiones: [], blurb: "App para guardar y hacer aún más especiales los mejores momentos de tu bebé." },
  { id: "patrimoniapp",   name: "PatrimoniApp",     sector: "PropTech · Patrimonio", estado: "En desarrollo", icon: "Landmark", desarrollo: 58, ventasMes: 0,    utilidad: -3_300_000,  legal: "amarillo", url: "patrimoniapp.com", img: "assets/covers/patrimoniapp.png", conexiones: [], blurb: "Gestión de patrimonio para inversores colombianos: arriendos, proyectos, inquilinos, documentos y declaración de renta. Cobros por WhatsApp y documentos con IA." },
  { id: "cruise",         name: "Cruise",           sector: "Fintech · Trading", estado: "MVP",       icon: "LineChart", desarrollo: 40,  ventasMes: 0,           utilidad: -1_900_000,  legal: "rojo", url: "cruise.capital", img: "assets/covers/cruise.png", conexiones: [], blurb: "Motor de trading de momentum intradía: convierte señales (tweets, scanners) en órdenes con stop y target, con log audit hash-chained y kill switch. Paper-first sobre IBKR." },
];

/* ---- Datos reales: carga desde /api/ventures (D1) con fallback demo ---- */
window.__dataSource = "demo";
async function __loadVentures() {
  try {
    const res = await fetch("/api/ventures", { credentials: "include" });
    const ct = res.headers.get("content-type") || "";
    if (!res.ok || !ct.includes("application/json")) return false;
    const data = await res.json();
    if (!Array.isArray(data.ventures) || !data.ventures.length) return false;
    data.ventures.forEach((srv) => {
      const cur = VENTURES.find((v) => v.id === srv.id);
      if (cur) Object.assign(cur, srv);
      else VENTURES.push(Object.assign({ ventasMes: 0, utilidad: 0, legal: "verde", conexiones: [] }, srv));
    });
    window.__dataSource = data.full ? "live" : "live-public";
    return true;
  } catch (e) { return false; }
}
window.__loadVentures = __loadVentures;

const UNIDADES = [
  {
    id: "proyectos",
    nuevo: false,
    icon: "Compass",
    titulo: "Desarrollo de Proyectos",
    desc: "Llevamos una idea de negocio desde el diagnóstico hasta la operación: estructuramos, financiamos y ejecutamos proyectos reales.",
    items: [
      { icon: "Lightbulb",   label: "Desarrollo creativo" },
      { icon: "Boxes",       label: "Gestión de recursos" },
      { icon: "Stethoscope", label: "Diagnóstico" },
      { icon: "Target",      label: "Diseño estratégico" },
      { icon: "Hammer",      label: "Gestión y ejecución" },
    ],
  },
  {
    id: "software",
    nuevo: true,
    icon: "Code2",
    titulo: "Desarrollo de Software",
    desc: "Construimos el software que impulsa los proyectos: producto a la medida, automatización e inteligencia artificial aplicada.",
    items: [
      { icon: "Layers",     label: "Plataformas SaaS" },
      { icon: "Smartphone", label: "Aplicaciones móviles" },
      { icon: "Bot",        label: "Agentes de IA" },
      { icon: "Plug",       label: "Integraciones PMS / CRM" },
      { icon: "Megaphone",  label: "Módulos de marketing y ventas" },
    ],
  },
];

/* Per-project demo detail for the Hub panel */
const PROJECT_DETAIL = {
  "element-calima": {
    marketing: { campañas: 3, leads: 142, cpl: 38_000, alcance: "186 K" },
    ventas:    { pipeline: 612_000_000, deals: 9, cierreMes: 4, conversion: 18 },
    legal:     { items: [
      { doc: "Licencia de construcción", estado: "verde" },
      { doc: "Fideicomiso de preventas", estado: "verde" },
      { doc: "Reglamento de propiedad horizontal", estado: "amarillo" },
    ], vence: "RPH — borrador en notaría, 21 jun" },
  },
  "mistica": {
    marketing: { campañas: 2, leads: 64, cpl: 21_000, alcance: "92 K" },
    ventas:    { pipeline: 0, deals: 0, cierreMes: 0, conversion: 0 },
    legal:     { items: [
      { doc: "Registro Nacional de Turismo", estado: "verde" },
      { doc: "Contrato de arrendamiento", estado: "verde" },
      { doc: "Sayco & Acinpro", estado: "verde" },
    ], vence: "RNT — renovación anual, 31 mar 2027" },
  },
  "caribbean": {
    marketing: { campañas: 4, leads: 98, cpl: 29_000, alcance: "121 K" },
    ventas:    { pipeline: 180_000_000, deals: 6, cierreMes: 3, conversion: 14 },
    legal:     { items: [
      { doc: "Registro Nacional de Turismo", estado: "amarillo" },
      { doc: "Pólizas de responsabilidad", estado: "verde" },
      { doc: "Contratos con operadores", estado: "amarillo" },
    ], vence: "RNT — documentos pendientes, 12 jun" },
  },
  "alzio": {
    marketing: { campañas: 2, leads: 47, cpl: 54_000, alcance: "73 K" },
    ventas:    { pipeline: 96_000_000, deals: 5, cierreMes: 2, conversion: 22 },
    legal:     { items: [
      { doc: "Tratamiento de datos (Habeas Data)", estado: "verde" },
      { doc: "Contratos SaaS B2B", estado: "verde" },
      { doc: "Propiedad intelectual del modelo", estado: "verde" },
    ], vence: "Sin vencimientos próximos" },
  },
  "tiketiki": {
    marketing: { campañas: 1, leads: 33, cpl: 18_000, alcance: "41 K" },
    ventas:    { pipeline: 24_000_000, deals: 2, cierreMes: 0, conversion: 6 },
    legal:     { items: [
      { doc: "Pasarela de pagos / PCI", estado: "amarillo" },
      { doc: "Habilitación transporte / convenios", estado: "amarillo" },
      { doc: "Habeas Data", estado: "verde" },
    ], vence: "Convenio pasarela — en firma, 28 jun" },
  },
  "libro-bebe": {
    marketing: { campañas: 1, leads: 21, cpl: 12_000, alcance: "28 K" },
    ventas:    { pipeline: 0, deals: 0, cierreMes: 0, conversion: 0 },
    legal:     { items: [
      { doc: "Políticas para menores (COPPA)", estado: "verde" },
      { doc: "Tratamiento de datos", estado: "verde" },
    ], vence: "Sin vencimientos próximos" },
  },  "patrimoniapp": {
    marketing: { campañas: 0, leads: 8, cpl: 0, alcance: "9 K" },
    ventas:    { pipeline: 0, deals: 0, cierreMes: 0, conversion: 0 },
    legal:     { items: [
      { doc: "Habeas Data (Ley 1581/2012)", estado: "verde" },
      { doc: "Habilitación factura electrónica DIAN", estado: "amarillo" },
      { doc: "Términos y pasarela Wompi", estado: "verde" },
    ], vence: "Factura electrónica DIAN — en trámite" },
  },
  "cruise": {
    marketing: { campañas: 0, leads: 5, cpl: 0, alcance: "6 K" },
    ventas:    { pipeline: 0, deals: 0, cierreMes: 0, conversion: 0 },
    legal:     { items: [
      { doc: "Concepto regulatorio SFC (no asesoría)", estado: "rojo" },
      { doc: "Disclaimer de riesgo y términos", estado: "verde" },
      { doc: "Tratamiento de datos / IBKR", estado: "amarillo" },
    ], vence: "Concepto SFC — acción requerida antes de operar con dinero real" },
  },
};

/* ----------------------- Global Marketing & Sales ------------------------ */
const CHANNELS = ["Meta Ads", "Google Ads", "TikTok", "Email", "Influencers"];
const STAGES = ["Prospecto", "Contactado", "Propuesta", "Negociación", "Cerrado"];
const STAGE_PROB = { "Prospecto": 0.1, "Contactado": 0.25, "Propuesta": 0.5, "Negociación": 0.75, "Cerrado": 1 };

const CAMPAIGNS = [
  { id: "c1",  venture: "element-calima", nombre: "Preventa Lago Calima",     canal: "Meta Ads",    presupuesto: 12_000_000, leads: 64, activa: true },
  { id: "c2",  venture: "element-calima", nombre: "Búsqueda inmobiliaria",    canal: "Google Ads",  presupuesto: 9_000_000,  leads: 53, activa: true },
  { id: "c3",  venture: "element-calima", nombre: "Remarketing inversionistas",canal: "Meta Ads",   presupuesto: 4_000_000,  leads: 25, activa: false },
  { id: "c4",  venture: "mistica",        nombre: "Tayrona experiences",      canal: "Meta Ads",    presupuesto: 5_000_000,  leads: 38, activa: true },
  { id: "c5",  venture: "mistica",        nombre: "Creadores de viaje",       canal: "Influencers", presupuesto: 3_500_000,  leads: 26, activa: true },
  { id: "c6",  venture: "caribbean",      nombre: "Paquetes Caribe",          canal: "Meta Ads",    presupuesto: 7_000_000,  leads: 44, activa: true },
  { id: "c7",  venture: "caribbean",      nombre: "Search turismo",           canal: "Google Ads",  presupuesto: 4_500_000,  leads: 31, activa: true },
  { id: "c8",  venture: "caribbean",      nombre: "Reels destinos",           canal: "TikTok",      presupuesto: 3_000_000,  leads: 23, activa: false },
  { id: "c9",  venture: "alzio",          nombre: "Demo HORECA & salud",       canal: "Google Ads",  presupuesto: 6_000_000,  leads: 28, activa: true },
  { id: "c10", venture: "alzio",          nombre: "Outbound multiagente",     canal: "Email",       presupuesto: 2_500_000,  leads: 19, activa: true },
  { id: "c11", venture: "tiketiki",       nombre: "Lanzamiento rutas",        canal: "TikTok",      presupuesto: 3_000_000,  leads: 33, activa: true },
  { id: "c12", venture: "libro-bebe",     nombre: "Comunidad de familias",    canal: "Meta Ads",    presupuesto: 2_000_000,  leads: 21, activa: true },
  { id: "c13", venture: "patrimoniapp",   nombre: "Awareness patrimonio",     canal: "Email",       presupuesto: 1_000_000,  leads: 8,  activa: false },
  { id: "c14", venture: "cruise",         nombre: "Waitlist traders",         canal: "Influencers", presupuesto: 800_000,    leads: 5,  activa: false },
];

const DEALS = [
  { id: "d1",  venture: "element-calima", cliente: "Inversiones Vélez",   valor: 380_000_000, etapa: "Negociación" },
  { id: "d2",  venture: "element-calima", cliente: "Familia Restrepo",    valor: 240_000_000, etapa: "Propuesta" },
  { id: "d3",  venture: "element-calima", cliente: "Grupo Andino",        valor: 520_000_000, etapa: "Contactado" },
  { id: "d4",  venture: "element-calima", cliente: "Carolina Mejía",      valor: 210_000_000, etapa: "Cerrado" },
  { id: "d5",  venture: "caribbean",      cliente: "Hotel Marsella",      valor: 60_000_000,  etapa: "Propuesta" },
  { id: "d6",  venture: "caribbean",      cliente: "AgroTours S.A.S.",    valor: 32_000_000,  etapa: "Prospecto" },
  { id: "d7",  venture: "caribbean",      cliente: "Partner Decameron",   valor: 88_000_000,  etapa: "Negociación" },
  { id: "d8",  venture: "alzio",          cliente: "Hoteles Estelar",     valor: 36_000_000,  etapa: "Negociación" },
  { id: "d9",  venture: "alzio",          cliente: "Cadena GHL",          valor: 60_000_000,  etapa: "Propuesta" },
  { id: "d10", venture: "alzio",          cliente: "Hostal Quindío",      valor: 14_000_000,  etapa: "Cerrado" },
  { id: "d11", venture: "mistica",        cliente: "Grupo viajeros EU",   valor: 18_000_000,  etapa: "Contactado" },
  { id: "d12", venture: "tiketiki",       cliente: "Flota La Macarena",   valor: 12_000_000,  etapa: "Prospecto" },
  { id: "d13", venture: "tiketiki",       cliente: "Naviera San Andrés",  valor: 9_000_000,   etapa: "Contactado" },
  { id: "d14", venture: "caribbean",      cliente: "Cruceros del Caribe", valor: 45_000_000,  etapa: "Propuesta" },
];

const ventureName = (id) => (VENTURES.find((v) => v.id === id) || {}).name || id;
const ventureIcon = (id) => (VENTURES.find((v) => v.id === id) || {}).icon || "Boxes";

/* --------------------------- Jurídico / Legal --------------------------- */
const ABOGADOS = [
  { id: "a1", nombre: "Dra. Carolina Ríos",   especialidad: "Inmobiliario & Urbanismo",      firma: "Ríos Legal",        disponible: true },
  { id: "a2", nombre: "Dr. Andrés Mejía",      especialidad: "Societario & Contratos",        firma: "Mejía Abogados",    disponible: true },
  { id: "a3", nombre: "Dra. Valentina Soto",   especialidad: "Protección de Datos & Tech",    firma: "Soto Legal Tech",   disponible: true },
  { id: "a4", nombre: "Dr. Felipe Cárdenas",   especialidad: "Turismo, Marítimo & Regulatorio", firma: "Cárdenas & Co.",  disponible: false },
  { id: "a5", nombre: "Dra. Daniela Ospina",   especialidad: "Financiero, SFC & Pagos",       firma: "Ospina Finance Law",disponible: true },
  { id: "a6", nombre: "Dr. Mateo Herrera",     especialidad: "Tributario & Contable",         firma: "Herrera Tributario",disponible: true },
];
const LEGAL_MATTERS = [
  { id: "m1",  venture: "cruise",         asunto: "Concepto regulatorio SFC (no asesoría)", area: "Financiero · SFC",   estado: "rojo",     vence: "Acción requerida", abogado: "a5" },
  { id: "m2",  venture: "patrimoniapp",   asunto: "Habilitación factura electrónica DIAN",  area: "Tributario",         estado: "amarillo", vence: "En trámite",       abogado: "a6" },
  { id: "m3",  venture: "element-calima", asunto: "Reglamento de propiedad horizontal",     area: "Inmobiliario",       estado: "amarillo", vence: "21 jun",           abogado: "a1" },
  { id: "m4",  venture: "caribbean",      asunto: "Registro Nacional de Turismo (RNT)",     area: "Turismo",            estado: "amarillo", vence: "12 jun",           abogado: "a4" },
  { id: "m5",  venture: "caribbean",      asunto: "Contratos con operadores náuticos",      area: "Societario",         estado: "amarillo", vence: "—",                abogado: null },
  { id: "m6",  venture: "tiketiki",       asunto: "Convenio pasarela de pagos / PCI",       area: "Financiero · Pagos", estado: "amarillo", vence: "28 jun",           abogado: "a5" },
  { id: "m7",  venture: "tiketiki",       asunto: "Habilitación de transporte / convenios", area: "Regulatorio",        estado: "amarillo", vence: "—",                abogado: null },
  { id: "m8",  venture: "cruise",         asunto: "Tratamiento de datos / acuerdo IBKR",    area: "Datos & Tech",       estado: "amarillo", vence: "—",                abogado: "a3" },
  { id: "m9",  venture: "element-calima", asunto: "Licencia de construcción",               area: "Inmobiliario",       estado: "verde",    vence: "Vigente",          abogado: "a1" },
  { id: "m10", venture: "alzio",          asunto: "Habeas Data & contratos SaaS B2B",       area: "Datos & Tech",       estado: "verde",    vence: "Vigente",          abogado: "a3" },
  { id: "m11", venture: "mistica",        asunto: "Registro Nacional de Turismo",           area: "Turismo",            estado: "verde",    vence: "Renovación 2027",  abogado: "a4" },
  { id: "m12", venture: "element-calima", asunto: "Fideicomiso de preventas",               area: "Financiero",         estado: "verde",    vence: "Vigente",          abogado: "a5" },
];

/* Enjambre de agentes jurídicos IA — inspirados en las capacidades de las
   prácticas líderes del mercado colombiano (no en personas específicas). */
const LEGAL_AGENTS = [
  { id: "ag_banca",       area: "Banca & Finanzas",            icon: "Landmark",      capacidad: "Estructura financiación, garantías, crédito y medios de pago.", match: "banca|financ|pagos|crédito|fiducia" },
  { id: "ag_capitales",   area: "Mercado de Capitales",        icon: "CandlestickChart", capacidad: "Emisiones, valores, oferta pública y supervisión SFC.",     match: "capital|valores|sfc|bolsa|emisión" },
  { id: "ag_corp",        area: "Corporativo / M&A",           icon: "Building2",     capacidad: "Constitución, fusiones, adquisiciones y contratos societarios.", match: "societ|corporativo|m&a|fusión|contrato" },
  { id: "ag_disputas",    area: "Disputas & Arbitraje",        icon: "Scale",         capacidad: "Litigios, arbitraje y resolución de controversias.",        match: "disput|litig|arbitr|controversia" },
  { id: "ag_tributario",  area: "Tributario",                  icon: "Receipt",       capacidad: "Renta, DIAN, planeación tributaria y factura electrónica.",  match: "tribut|dian|renta|factura|impuesto" },
  { id: "ag_inmob",       area: "Inmobiliario & Urbanismo",    icon: "Building",      capacidad: "Licencias, RPH, fiducia inmobiliaria y propiedad raíz.",     match: "inmobili|urban|rph|predial|construc|propiedad horiz" },
  { id: "ag_pi",          area: "Propiedad Intelectual",       icon: "BadgeCheck",    capacidad: "Marcas, patentes y protección de activos intangibles.",     match: "propiedad intelectual|marca|patente" },
  { id: "ag_comercio",    area: "Comercio Internacional & Aduanas", icon: "Ship",     capacidad: "Importación, exportación y régimen aduanero.",               match: "aduan|comercio internacional|import|export" },
  { id: "ag_laboral",     area: "Laboral & Empleo",            icon: "Users",         capacidad: "Contratación, nómina y relaciones laborales.",               match: "laboral|empleo|nómina" },
  { id: "ag_competencia", area: "Competencia & Antimonopolio", icon: "Gavel",         capacidad: "Prácticas comerciales, SIC y libre competencia.",            match: "competencia|antimonopolio|sic" },
  { id: "ag_cumplimiento",area: "Cumplimiento & SARLAFT",      icon: "ShieldCheck",   capacidad: "SARLAFT, antilavado y prevención de riesgos.",               match: "cumplimiento|sarlaft|lavado" },
  { id: "ag_datos",       area: "Datos, TMT & Tech",           icon: "Lock",          capacidad: "Habeas Data (Ley 1581), TMT y contratos SaaS.",              match: "datos|habeas|tmt|tech|tecnolog|coppa" },
  { id: "ag_energia",     area: "Energía & Recursos Naturales",icon: "Zap",           capacidad: "Minería, energía y licencias ambientales.",                  match: "energ|minería|ambient|recursos" },
  { id: "ag_publico",     area: "Derecho Público & Regulatorio",icon: "Stamp",        capacidad: "Registros sectoriales (RNT, DIMAR), licencias y regulación.", match: "regulatorio|público|turismo|rnt|dimar|transporte|permiso|licencia" },
  { id: "ag_seguros",     area: "Seguros",                     icon: "Umbrella",      capacidad: "Pólizas, responsabilidad civil y reaseguro.",                match: "seguro|póliza|responsabilidad" },
  { id: "ag_proyectos",   area: "Proyectos & Infraestructura", icon: "HardHat",       capacidad: "Estructuración legal de proyectos e infraestructura.",       match: "proyecto|infraestructura|concesión" },
];
function routeAgent(area) {
  const a = (area || "").toLowerCase();
  const hit = LEGAL_AGENTS.find((ag) => new RegExp(ag.match).test(a));
  return (hit || LEGAL_AGENTS.find((x) => x.id === "ag_corp")).id;
}
const agentById = (id) => LEGAL_AGENTS.find((a) => a.id === id);

/* --------------------------- Shared UI atoms ----------------------------- */
function BrandLogo({ id, height = 50, className = "", dark = false }) {
  const src = dark ? "assets/3h-logo-white.png" : "assets/3h-logo.png";
  return (
    <img src={src} alt="3H enterprise — desarrolladores de proyectos"
      style={{ height: `${height}px`, width: "auto", display: "block" }}
      className={className} />
  );
}

function Switch({ checked, onChange }) {
  return (
    <button type="button" onClick={() => onChange(!checked)} role="switch" aria-checked={checked}
      className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition ${checked ? "bg-emerald-500" : "bg-taupe-300"}`}>
      <span className={`inline-block h-4 w-4 transform rounded-full bg-white shadow transition ${checked ? "translate-x-4" : "translate-x-0.5"}`} />
    </button>
  );
}

const CHANNEL_COLOR = {
  "Meta Ads":    "#2A6FDB",
  "Google Ads":  "#1F8A5B",
  "TikTok":      "#3a3431",
  "Email":       "#b08208",
  "Influencers": "#9d5fce",
};

Object.assign(window, {
  Icon, formatCOP, formatCompactCOP, Placeholder,
  LegalDot, LEGAL, EstadoPill, ESTADO_STYLE,
  WHATSAPP, WHATSAPP_URL, VENTURES, UNIDADES, PROJECT_DETAIL,
  CHANNELS, STAGES, STAGE_PROB, CAMPAIGNS, DEALS,
  ventureName, ventureIcon, BrandLogo, Switch, CHANNEL_COLOR,
  ABOGADOS, LEGAL_MATTERS, LEGAL_AGENTS, routeAgent, agentById,
});
