// Benefits · Módulo de Beneficios Corporativos
// ──────────────────────────────────────────────────────────────────────
// Vista admin (RRHH) con 7 tabs: Catálogo, Marketplace, Solicitudes,
// Matriz, Campañas, Reconocimientos, Analítica.
// Vista colaborador (toggle) con 6 secciones: Inicio, Mi catálogo,
// Marketplace, Mis solicitudes, Reconocimientos, Historial.
// Cliente piloto: Atica · sede Cali.
// Stack: React 18 UMD + Babel standalone. Cuelga en window.Benefits.
// ──────────────────────────────────────────────────────────────────────

const _bn_useState = React.useState;
const _bn_useMemo  = React.useMemo;
const _bn_useEffect = React.useEffect;

// Hoy de referencia · alineado con CLAUDE.md currentDate (2026-05-06).
const _BN_HOY = new Date(2026, 4, 6);

// Formatos
const fmtCOP = (n) => {
  if (n == null || n === '') return '—';
  return '$ ' + n.toLocaleString('es-CO');
};
const fmtPuntos = (n) => (n || 0).toLocaleString('es-CO') + ' pts';

// Colaborador "logueado" para la vista colaborador (mock).
// Lina Tobón · Operaria de Clasificación · Cali · joven con 3.5 años de antigüedad
const _BN_ME_ID = 'E0312';

// ─── Marketplace · productos canjeables por puntos ──────────────────
const MARKETPLACE = [
  { id: 'MKT-001', nombre: 'Voucher Olímpica $30.000',     emoji: '🛒', puntos: 200,  stock: 24, categoria: 'cat-alimento',  descripcion: 'Bono para mercado · vence 60 días después del canje.' },
  { id: 'MKT-002', nombre: 'Vale CinéColombia familiar',   emoji: '🎬', puntos: 350,  stock: 12, categoria: 'cat-tiempo',    descripcion: '4 entradas + crispetas grandes en cualquier sede de Cali.' },
  { id: 'MKT-003', nombre: 'Paquete bienestar Smartfit',   emoji: '💪', puntos: 800,  stock: 8,  categoria: 'cat-bienestar', descripcion: '1 mes de gimnasio en Smartfit Cali o Barranquilla.' },
  { id: 'MKT-004', nombre: 'Mercado adicional $60K',       emoji: '🛍️', puntos: 600,  stock: 18, categoria: 'cat-alimento',  descripcion: 'Bono extra de mercado fuera del beneficio mensual.' },
  { id: 'MKT-005', nombre: 'Día simbólico extra',          emoji: '🌴', puntos: 400,  stock: 30, categoria: 'cat-tiempo',    descripcion: 'Día libre extra al año (además del simbólico anual).' },
  { id: 'MKT-006', nombre: 'Termo Atica edición limitada',emoji: '🥤', puntos: 120,  stock: 60, categoria: 'cat-reconoce',  descripcion: 'Termo grabado con tu nombre · capacidad 750ml.' },
  { id: 'MKT-007', nombre: 'Material procesado fresco · 2 kg',   emoji: '♻️', puntos: 90,   stock: 80, categoria: 'cat-alimento',  descripcion: 'Bolsa de 2kg directo de planta · trituración a tu gusto.' },
  { id: 'MKT-008', nombre: 'Donación · Banco Arquidiocesano',emoji: '💝',puntos: 80,   stock: 999,categoria: 'cat-reconoce',  descripcion: 'Donamos $30.000 a tu nombre al banco de alimentos.' },
  { id: 'MKT-009', nombre: 'Voucher EAFIT ed. continua',   emoji: '🎓', puntos: 1000, stock: 5,  categoria: 'cat-educacion', descripcion: '20% descuento en cualquier diplomado · sumable al beneficio anual.' },
  { id: 'MKT-010', nombre: 'Pase doble cine + cena',       emoji: '🍿', puntos: 550,  stock: 10, categoria: 'cat-tiempo',    descripcion: '2 entradas de cine + cena en restaurante aliado del Centro.' },
  { id: 'MKT-011', nombre: 'Auxilio gimnasio anual',       emoji: '🏋️', puntos: 1200, stock: 6,  categoria: 'cat-bienestar', descripcion: '12 mensualidades pagadas + matrícula gratis en Smartfit.' },
  { id: 'MKT-012', nombre: 'Camiseta Atica bordada',      emoji: '👕', puntos: 250,  stock: 40, categoria: 'cat-reconoce',  descripcion: 'Camiseta con tu nombre y años de antigüedad bordados.' },
];

// ─── Top component ─────────────────────────────────────────────────
const Benefits = () => {
  const [persona, setPersona] = _bn_useState('admin');
  const [tab, setTab]         = _bn_useState('catalogo');
  const [meSection, setMeSection] = _bn_useState('inicio');
  const [openBeneficio, setOpenBeneficio] = _bn_useState(null);
  const [openMkt, setOpenMkt] = _bn_useState(null);
  const [openRecog, setOpenRecog] = _bn_useState(false);
  const [openSolicitud, setOpenSolicitud] = _bn_useState(null);
  const [openEditor, setOpenEditor] = _bn_useState(null);    // null | 'new' | beneficio para editar
  const [openMktEditor, setOpenMktEditor] = _bn_useState(null); // null | 'new' | producto para editar
  const [openCampEditor, setOpenCampEditor] = _bn_useState(null); // null | 'new' | campaña para editar

  // Estado mutable de catálogo de beneficios (creación / edición)
  const [beneficiosState, setBeneficiosState] = _bn_useState(() => [...(window.BENEFICIOS_CATALOG || [])]);
  // Estado mutable de productos del marketplace
  const [marketplaceState, setMarketplaceState] = _bn_useState(() => [...MARKETPLACE]);
  // Estado mutable de campañas de bienestar
  const [campanasState, setCampanasState] = _bn_useState(() => [...(window.CAMPANAS_BIENESTAR || [])]);

  // Estado mutable de solicitudes y wallet (para flujos demo)
  const [solicitudes, setSolicitudes] = _bn_useState(() => [...(window.BENEFICIOS_SOLICITUDES || [])]);
  const [wallet, setWallet] = _bn_useState(() => JSON.parse(JSON.stringify(window.WALLET_PUNTOS || {})));
  const [reconocimientosBN, setReconocimientosBN] = _bn_useState(() => [
    { id: 'RC-001', deId: 'E0023', paraId: 'E0205', valorId: 'val-pasion',   mensaje: 'Su lote 12 marcó un cup score de 87 puntos · récord interno.', cuando: '18/04/2026', puntos: 150 },
    { id: 'RC-002', deId: 'E0023', paraId: 'E0246', valorId: 'val-calidad',  mensaje: 'Reportó un desajuste de aprovechamiento que evitó devolución del cliente.', cuando: '02/05/2026', puntos: 100 },
    { id: 'RC-003', deId: 'E0023', paraId: 'E0128', valorId: 'val-compromiso', mensaje: 'Cubrió el turno de Barranquilla sin previo aviso · entrega a tiempo.', cuando: '02/05/2026', puntos: 190 },
    { id: 'RC-004', deId: 'E0067', paraId: 'E0205', valorId: 'val-pasion',   mensaje: 'Mentor del nuevo Gestor ambiental · paciente y técnico.', cuando: '12/04/2026', puntos: 100 },
    { id: 'RC-005', deId: 'E0023', paraId: 'E0312', valorId: 'val-calidad',  mensaje: 'Detectó un defecto de clasificación por color · evitó 30kg perdidos.', cuando: '20/04/2026', puntos: 60 },
  ]);

  // Datos
  const empleados   = window.BENEFICIOS_EMPLEADOS_DEMO || [];
  const beneficios  = beneficiosState;
  const categorias  = window.BENEFICIOS_CATEGORIAS || [];
  const matriz      = window.MATRIZ_BENEFICIOS_CARGO || [];
  const cargos      = window.CARGOS || [];
  const valores     = window.VALORES_AGUILA || [];
  const convenios   = window.CONVENIOS || [];
  const campanas    = campanasState;
  const marketplace = marketplaceState;
  const me          = empleados.find(e => e.id === _BN_ME_ID);
  const meCargo     = me ? (window.getCargo && window.getCargo(me.cargoId)) : null;
  const meWallet    = wallet[_BN_ME_ID] || { balance: 0, total: 0, transacciones: [] };

  // KPIs admin
  const kpis = _bn_useMemo(() => {
    const beneficiosActivos = beneficios.length;
    const totalEmpleados = empleados.length;
    const conBeneficio = empleados.filter(e => beneficios.some(b => window.esElegibleBeneficio && window.esElegibleBeneficio(e, b))).length;
    const adopcion = totalEmpleados ? Math.round(conBeneficio / totalEmpleados * 100) : 0;
    // Gasto YTD = costoEmpresa de obligatorios y solicitudes aprobadas
    const obligatorios = matriz.filter(m => m.regla === 'obligatorio').length;
    const gasto = obligatorios * 65000 + solicitudes.filter(s => s.estado !== 'rechazada' && s.estado !== 'pendiente').reduce((acc, s) => {
      const b = beneficios.find(x => x.id === s.beneficioId);
      return acc + (b ? b.costoEmpresa : 0);
    }, 0);
    return { beneficiosActivos, adopcion, conBeneficio, totalEmpleados, gasto, nps: 71 };
  }, [solicitudes, beneficios, matriz, empleados]);

  // Eventos del calendario (próximos 60 días)
  const eventos = _bn_useMemo(() => (window.calcularEventosCalendario ? window.calcularEventosCalendario(60, _BN_HOY) : []), []);

  // ─── Handlers comunes ─────────────────────────────────────
  const guardarBeneficio = (datos, idEdicion) => {
    if (idEdicion) {
      // Edición de beneficio existente
      setBeneficiosState(prev => prev.map(b => b.id === idEdicion ? { ...b, ...datos, id: idEdicion } : b));
    } else {
      // Creación · genera ID secuencial sobre el último BEN-NNN
      const maxNum = beneficiosState.reduce((m, b) => {
        const n = parseInt((b.id || '').replace(/^BEN-0*/, ''), 10);
        return isNaN(n) ? m : Math.max(m, n);
      }, 0);
      const nuevoId = 'BEN-' + String(maxNum + 1).padStart(3, '0');
      setBeneficiosState(prev => [...prev, { ...datos, id: nuevoId }]);
    }
  };

  const guardarProducto = (datos, idEdicion) => {
    if (idEdicion) {
      setMarketplaceState(prev => prev.map(p => p.id === idEdicion ? { ...p, ...datos, id: idEdicion } : p));
    } else {
      const maxNum = marketplaceState.reduce((m, p) => {
        const n = parseInt((p.id || '').replace(/^MKT-0*/, ''), 10);
        return isNaN(n) ? m : Math.max(m, n);
      }, 0);
      const nuevoId = 'MKT-' + String(maxNum + 1).padStart(3, '0');
      setMarketplaceState(prev => [...prev, { ...datos, id: nuevoId }]);
    }
  };

  const guardarCampana = (datos, idEdicion) => {
    if (idEdicion) {
      setCampanasState(prev => prev.map(c => c.id === idEdicion ? { ...c, ...datos, id: idEdicion } : c));
    } else {
      const maxNum = campanasState.reduce((m, c) => {
        const n = parseInt((c.id || '').replace(/^CAM-0*/, ''), 10);
        return isNaN(n) ? m : Math.max(m, n);
      }, 0);
      const nuevoId = 'CAM-' + String(maxNum + 1).padStart(3, '0');
      const completo = {
        ...datos, id: nuevoId,
        kpis: datos.kpis || { participacion: 0, meta: datos.meta || 100, satisfaccion: null },
      };
      setCampanasState(prev => [...prev, completo]);
    }
  };

  const aprobarSolicitud = (id, aprobador = 'Carolina Restrepo S.') => {
    setSolicitudes(prev => prev.map(s => s.id === id
      ? { ...s, estado: 'aprobada', fechaResolucion: '06/05/2026 09:00', aprobador }
      : s));
  };
  const rechazarSolicitud = (id, comentario = 'No cumple criterios.', aprobador = 'Carolina Restrepo S.') => {
    setSolicitudes(prev => prev.map(s => s.id === id
      ? { ...s, estado: 'rechazada', fechaResolucion: '06/05/2026 09:00', aprobador, comentario: comentario || s.comentario }
      : s));
  };
  const crearSolicitud = (empleadoId, beneficioId, comentario = '') => {
    const id = 'SOL-' + String(solicitudes.length + 1).padStart(3, '0');
    setSolicitudes(prev => [...prev, {
      id, empleadoId, beneficioId, estado: 'pendiente',
      fechaSolicitud: '06/05/2026 09:00', fechaResolucion: null, aprobador: null,
      comentario, vencimientoSLA: '08/05/2026 09:00',
    }]);
  };
  const canjearMarketplace = (empleadoId, mkt) => {
    const w = wallet[empleadoId] || { balance: 0, total: 0, transacciones: [] };
    if (w.balance < mkt.puntos) return false;
    setWallet(prev => ({
      ...prev,
      [empleadoId]: {
        balance: w.balance - mkt.puntos,
        total: w.total,
        transacciones: [
          { fecha: '06/05/2026', tipo: 'debito', monto: mkt.puntos, motivo: 'Canje · ' + mkt.nombre },
          ...w.transacciones,
        ],
      }
    }));
    return true;
  };
  const enviarReconocimiento = (deId, paraId, valorId, mensaje, puntos = 100) => {
    const id = 'RC-' + String(reconocimientosBN.length + 1).padStart(3, '0');
    setReconocimientosBN(prev => [
      { id, deId, paraId, valorId, mensaje, cuando: '06/05/2026', puntos },
      ...prev,
    ]);
    // Suma puntos al receptor
    setWallet(prev => {
      const w = prev[paraId] || { balance: 0, total: 0, transacciones: [] };
      return {
        ...prev,
        [paraId]: {
          balance: w.balance + puntos,
          total: (w.total || 0) + puntos,
          transacciones: [
            { fecha: '06/05/2026', tipo: 'credito', monto: puntos, motivo: 'Reconocimiento · ' + ((window.getValor && window.getValor(valorId))?.nombre || 'Atica') },
            ...w.transacciones,
          ],
        }
      };
    });
  };

  // ─── Configuración de tabs admin ───────────────────────────
  const TABS = [
    { id: 'catalogo',      label: 'Catálogo',        icon: 'IconGift',      pill: beneficios.length },
    { id: 'marketplace',   label: 'Marketplace',     icon: 'IconStar',      pill: marketplace.length },
    { id: 'solicitudes',   label: 'Solicitudes',     icon: 'IconCheck',     pill: solicitudes.filter(s => s.estado === 'pendiente').length, pillTone: 'rose' },
    { id: 'matriz',        label: 'Matriz',          icon: 'IconShield',    pill: cargos.length },
    { id: 'campanas',      label: 'Campañas',        icon: 'IconMegaphone', pill: campanas.filter(c => c.estado === 'activa').length },
    { id: 'reconocimientos', label: 'Reconocimientos', icon: 'IconStar',    pill: reconocimientosBN.length },
    { id: 'analitica',     label: 'Analítica',       icon: 'IconBarChart' },
  ];

  // ─── Render ─────────────────────────────────────────────────
  return (
    <div className="main" data-screen-label="Beneficios">
      <div className="page-head">
        <div>
          <h1 className="page-title">Beneficios corporativos</h1>
          <div className="page-subtitle">
            <b>{kpis.beneficiosActivos} beneficios activos</b> · {kpis.adopcion}% adopción · {kpis.conBeneficio}/{kpis.totalEmpleados} colaboradores con plan · {fmtCOP(kpis.gasto)} en YTD
          </div>
        </div>
        <div className="to-view-toggle">
          <button className={persona === 'admin' ? 'active' : ''} onClick={() => setPersona('admin')}>
            <IconShield size={13} /> Vista RRHH
          </button>
          <button className={persona === 'colaborador' ? 'active' : ''} onClick={() => setPersona('colaborador')}>
            <IconUsers size={13} /> Vista colaborador
          </button>
        </div>
      </div>

      {persona === 'admin' ? (
        <AdminView
          tab={tab} setTab={setTab} TABS={TABS}
          kpis={kpis} eventos={eventos}
          beneficios={beneficios} categorias={categorias}
          matriz={matriz} cargos={cargos} empleados={empleados}
          solicitudes={solicitudes}
          campanas={campanas} convenios={convenios}
          reconocimientosBN={reconocimientosBN} valores={valores}
          wallet={wallet}
          onOpenBen={setOpenBeneficio} onOpenSolicitud={setOpenSolicitud}
          aprobarSolicitud={aprobarSolicitud} rechazarSolicitud={rechazarSolicitud}
          onOpenRecog={() => setOpenRecog(true)}
          onOpenMkt={setOpenMkt}
          marketplace={marketplace}
          onNewBeneficio={() => setOpenEditor('new')}
          onEditBeneficio={(b) => setOpenEditor(b)}
          onNewProducto={() => setOpenMktEditor('new')}
          onEditProducto={(p) => setOpenMktEditor(p)}
          onNewCampana={() => setOpenCampEditor('new')}
          onEditCampana={(c) => setOpenCampEditor(c)}
        />
      ) : (
        <ColaboradorView
          me={me} meCargo={meCargo} meWallet={meWallet}
          section={meSection} setSection={setMeSection}
          beneficios={beneficios} categorias={categorias}
          eventos={eventos.filter(e => e.empleadoId === _BN_ME_ID)}
          campanas={campanas}
          marketplace={marketplace}
          solicitudes={solicitudes.filter(s => s.empleadoId === _BN_ME_ID)}
          reconocimientosRecibidos={reconocimientosBN.filter(r => r.paraId === _BN_ME_ID)}
          reconocimientosDados={reconocimientosBN.filter(r => r.deId === _BN_ME_ID)}
          valores={valores}
          onOpenBen={setOpenBeneficio} onOpenMkt={setOpenMkt}
          onOpenRecog={() => setOpenRecog(true)}
          onSolicitar={(beneficioId) => { crearSolicitud(_BN_ME_ID, beneficioId); }}
          onCanjear={(mkt) => canjearMarketplace(_BN_ME_ID, mkt)}
        />
      )}

      {openBeneficio && (
        <BeneficioModal
          beneficio={openBeneficio} categorias={categorias}
          empleado={persona === 'colaborador' ? me : null}
          puedeSolicitar={persona === 'colaborador' && me && window.esElegibleBeneficio(me, openBeneficio)}
          onClose={() => setOpenBeneficio(null)}
          onSolicitar={(comentario) => {
            crearSolicitud(_BN_ME_ID, openBeneficio.id, comentario);
            setOpenBeneficio(null);
          }}
        />
      )}
      {openMkt && (
        <CanjeModal
          mkt={openMkt} wallet={meWallet}
          onClose={() => setOpenMkt(null)}
          onConfirm={() => {
            const ok = canjearMarketplace(_BN_ME_ID, openMkt);
            if (ok) setOpenMkt(null);
          }}
        />
      )}
      {openRecog && (
        <ReconocimientoModal
          empleados={empleados} valores={valores} me={me}
          onClose={() => setOpenRecog(false)}
          onSend={(paraId, valorId, mensaje, puntos) => {
            enviarReconocimiento(persona === 'colaborador' ? _BN_ME_ID : 'E0023', paraId, valorId, mensaje, puntos);
            setOpenRecog(false);
          }}
          isAdmin={persona === 'admin'}
        />
      )}
      {openSolicitud && (
        <SolicitudModal
          solicitud={openSolicitud} beneficios={beneficios} empleados={empleados}
          onClose={() => setOpenSolicitud(null)}
          onAprobar={() => { aprobarSolicitud(openSolicitud.id); setOpenSolicitud(null); }}
          onRechazar={(motivo) => { rechazarSolicitud(openSolicitud.id, motivo); setOpenSolicitud(null); }}
        />
      )}
      {openEditor && (
        <BeneficioEditorModal
          beneficio={openEditor === 'new' ? null : openEditor}
          categorias={categorias} cargos={cargos}
          onClose={() => setOpenEditor(null)}
          onSave={(datos) => {
            guardarBeneficio(datos, openEditor === 'new' ? null : openEditor.id);
            setOpenEditor(null);
          }}
        />
      )}
      {openMktEditor && (
        <ProductoEditorModal
          producto={openMktEditor === 'new' ? null : openMktEditor}
          categorias={categorias}
          onClose={() => setOpenMktEditor(null)}
          onSave={(datos) => {
            guardarProducto(datos, openMktEditor === 'new' ? null : openMktEditor.id);
            setOpenMktEditor(null);
          }}
        />
      )}
      {openCampEditor && (
        <CampanaEditorModal
          campana={openCampEditor === 'new' ? null : openCampEditor}
          beneficios={beneficios}
          onClose={() => setOpenCampEditor(null)}
          onSave={(datos) => {
            guardarCampana(datos, openCampEditor === 'new' ? null : openCampEditor.id);
            setOpenCampEditor(null);
          }}
        />
      )}
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── ADMIN VIEW ─────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const AdminView = (props) => {
  const { tab, setTab, TABS, kpis, eventos, beneficios, categorias, matriz, cargos,
          empleados, solicitudes, campanas, convenios, reconocimientosBN, valores, wallet, marketplace,
          onOpenBen, onOpenSolicitud, aprobarSolicitud, rechazarSolicitud, onOpenRecog, onOpenMkt,
          onNewBeneficio, onEditBeneficio,
          onNewProducto, onEditProducto,
          onNewCampana, onEditCampana } = props;

  return (
    <React.Fragment>
      {/* ─── KPIs (todos los tabs) ─── */}
      <div className="bn-kpis">
        <div className="bn-kpi">
          <div className="bn-kpi-icon navy"><IconGift size={18} /></div>
          <div>
            <div className="bn-kpi-num">{kpis.beneficiosActivos}</div>
            <div className="bn-kpi-lbl">Beneficios activos</div>
            <div className="bn-kpi-foot muted">{categorias.length} categorías · {convenios.length} convenios</div>
          </div>
        </div>
        <div className="bn-kpi">
          <div className="bn-kpi-icon green"><IconUsers size={18} /></div>
          <div>
            <div className="bn-kpi-num">{kpis.adopcion}<small>%</small></div>
            <div className="bn-kpi-lbl">Adopción</div>
            <div className="bn-kpi-foot muted">{kpis.conBeneficio} de {kpis.totalEmpleados} colaboradores</div>
          </div>
        </div>
        <div className="bn-kpi">
          <div className="bn-kpi-icon amber"><IconBarChart size={18} /></div>
          <div>
            <div className="bn-kpi-num mono">{fmtCOP(kpis.gasto)}</div>
            <div className="bn-kpi-lbl">Gasto YTD</div>
            <div className="bn-kpi-foot muted">obligatorios + solicitudes aprobadas</div>
          </div>
        </div>
        <div className="bn-kpi">
          <div className="bn-kpi-icon rose"><IconStar size={18} /></div>
          <div>
            <div className="bn-kpi-num">{kpis.nps}<small>NPS</small></div>
            <div className="bn-kpi-lbl">Satisfacción</div>
            <div className="bn-kpi-foot muted">pulso interno · abr/2026</div>
          </div>
        </div>
      </div>

      {/* ─── Tabs ─── */}
      <div className="doc-tabs" style={{ marginBottom: 14 }}>
        {TABS.map(t => {
          const I = window[t.icon];
          return (
            <button key={t.id} className={`doc-tab ${tab === t.id ? 'active' : ''}`} onClick={() => setTab(t.id)}>
              <I size={14} /> {t.label}
              {t.pill != null && <span className={`epp-tab-pill ${t.pillTone || ''}`}>{t.pill}</span>}
            </button>
          );
        })}
      </div>

      {/* ─── Tab content ─── */}
      {tab === 'catalogo'        && <CatalogoTab beneficios={beneficios} categorias={categorias} matriz={matriz} cargos={cargos} onOpen={onOpenBen} onCreate={onNewBeneficio} onEdit={onEditBeneficio} />}
      {tab === 'marketplace'     && <MarketplaceTab marketplace={marketplace} onOpen={onOpenMkt} onCreate={onNewProducto} onEdit={onEditProducto} />}
      {tab === 'solicitudes'     && <SolicitudesTab solicitudes={solicitudes} beneficios={beneficios} empleados={empleados} onOpen={onOpenSolicitud} aprobar={aprobarSolicitud} rechazar={rechazarSolicitud} />}
      {tab === 'matriz'          && <MatrizBeneficiosTab beneficios={beneficios} cargos={cargos} matriz={matriz} categorias={categorias} />}
      {tab === 'campanas'        && <CampanasTab campanas={campanas} eventos={eventos} empleados={empleados} beneficios={beneficios} />}
      {tab === 'reconocimientos' && <ReconocimientosTab reconocimientos={reconocimientosBN} empleados={empleados} valores={valores} onCreate={onOpenRecog} />}
      {tab === 'analitica'       && <AnaliticaTab beneficios={beneficios} categorias={categorias} solicitudes={solicitudes} matriz={matriz} cargos={cargos} empleados={empleados} kpis={kpis} wallet={wallet} />}
    </React.Fragment>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── CATALOGO TAB ───────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const CatalogoTab = ({ beneficios, categorias, matriz, cargos, onOpen, onCreate, onEdit }) => {
  const [q, setQ] = _bn_useState('');
  const [catFilter, setCatFilter] = _bn_useState('todos');
  const [trigFilter, setTrigFilter] = _bn_useState('todos');

  const filtrados = beneficios.filter(b => {
    if (catFilter !== 'todos' && b.categoriaId !== catFilter) return false;
    if (trigFilter === 'auto' && !b.esAutomatico) return false;
    if (trigFilter === 'solicitud' && b.esAutomatico) return false;
    if (q && !(b.nombre + ' ' + b.descripcion + ' ' + b.proveedor).toLowerCase().includes(q.toLowerCase())) return false;
    return true;
  });

  return (
    <div>
      <div className="bn-section-toolbar">
        <div>
          <h3 className="bn-section-title">Catálogo de beneficios</h3>
          <div className="muted" style={{ fontSize: 12, marginTop: 2 }}>
            {beneficios.length} beneficios configurados · click en una tarjeta para ver el detalle, o en <b>Editar</b> para modificar.
          </div>
        </div>
        {onCreate && (
          <button className="btn primary" onClick={onCreate}>
            <IconPlus size={14} /> Nuevo beneficio
          </button>
        )}
      </div>

      <div className="bn-filters">
        <div className="bn-search">
          <IconSearch size={14} />
          <input type="text" placeholder="Buscar beneficio, proveedor, descripción…" value={q} onChange={e => setQ(e.target.value)} />
        </div>
        <button className={`bn-chip ${catFilter === 'todos' ? 'active' : ''}`} onClick={() => setCatFilter('todos')}>
          Todas
        </button>
        {categorias.map(c => (
          <button key={c.id} className={`bn-chip ${catFilter === c.id ? 'active' : ''}`} onClick={() => setCatFilter(c.id)}>
            {c.emoji} {c.nombre}
          </button>
        ))}
        <span className="muted" style={{ marginLeft: 'auto', fontSize: 12 }}>Disparador:</span>
        <button className={`bn-chip ${trigFilter === 'todos' ? 'active' : ''}`} onClick={() => setTrigFilter('todos')}>Todos</button>
        <button className={`bn-chip ${trigFilter === 'auto' ? 'active' : ''}`} onClick={() => setTrigFilter('auto')}><IconZap size={11} /> Auto</button>
        <button className={`bn-chip ${trigFilter === 'solicitud' ? 'active' : ''}`} onClick={() => setTrigFilter('solicitud')}>Por solicitud</button>
      </div>

      <div className="bn-grid">
        {filtrados.map(b => {
          const cat = categorias.find(c => c.id === b.categoriaId) || {};
          const cargosObligatorios = matriz.filter(m => m.beneficioId === b.id && m.regla === 'obligatorio').length;
          return (
            <div key={b.id} className={`bn-card ${b.destacado ? 'destacado' : ''}`} onClick={() => onOpen(b)}>
              <div className="bn-card-flags">
                {b.esAutomatico && <span className="pill amber-soft" title="Automatización"><IconZap size={11} /></span>}
                {b.destacado && <span className="pill amber" title="Destacado"><IconStar size={11} /></span>}
                {onEdit && (
                  <button
                    className="bn-card-edit"
                    title="Editar beneficio"
                    onClick={(ev) => { ev.stopPropagation(); onEdit(b); }}
                  >
                    <IconSettings size={11} /> Editar
                  </button>
                )}
              </div>
              <div className="bn-card-head">
                <div className={`bn-card-emoji ${cat.tone || 'navy'}`}>{b.emoji}</div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div className="bn-card-name">{b.nombre}</div>
                  <div className="bn-card-cat">{cat.emoji} {cat.nombre} · {b.proveedor}</div>
                </div>
              </div>
              <div className="bn-card-desc">{b.descripcion}</div>
              <div className="bn-card-meta">
                <span>
                  {b.costoEmpresa > 0 ? <span className="mono">{fmtCOP(b.costoEmpresa)}</span> : <span className="muted">Sin costo directo</span>}
                  <span className="muted" style={{ marginLeft: 6 }}>· {cargosObligatorios > 0 ? `${cargosObligatorios} cargos` : 'opcional'}</span>
                </span>
                {b.puntos > 0 && <span className="bn-puntos">{b.puntos}<IconStar size={10} /></span>}
              </div>
            </div>
          );
        })}
        {filtrados.length === 0 && (
          <div style={{ gridColumn: '1 / -1', textAlign: 'center', padding: 60, color: 'var(--muted)' }}>
            <IconSearch size={32} style={{ opacity: 0.3 }} />
            <div style={{ marginTop: 12, fontSize: 14 }}>No hay beneficios que coincidan con tu búsqueda.</div>
          </div>
        )}
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── MARKETPLACE TAB (admin · vista catálogo de productos) ──────────
// ══════════════════════════════════════════════════════════════════════
const MarketplaceTab = ({ marketplace, onOpen, onCreate, onEdit }) => {
  const [q, setQ] = _bn_useState('');
  const filtrados = marketplace.filter(m => !q || (m.nombre + ' ' + m.descripcion).toLowerCase().includes(q.toLowerCase()));

  return (
    <div>
      <div className="bn-section-toolbar">
        <div>
          <h3 className="bn-section-title">Marketplace de canjes</h3>
          <div className="muted" style={{ fontSize: 12, marginTop: 2 }}>
            {marketplace.length} productos · stock total: <b>{marketplace.reduce((a, m) => a + m.stock, 0)}</b> unidades.
          </div>
        </div>
        {onCreate && (
          <button className="btn primary" onClick={onCreate}>
            <IconPlus size={14} /> Nuevo producto
          </button>
        )}
      </div>

      <div className="bn-filters">
        <div className="bn-search">
          <IconSearch size={14} />
          <input type="text" placeholder="Buscar producto en marketplace…" value={q} onChange={e => setQ(e.target.value)} />
        </div>
        <span className="muted" style={{ fontSize: 12, marginLeft: 'auto' }}>{filtrados.length} de {marketplace.length}</span>
      </div>
      <div className="bn-grid">
        {filtrados.map(m => (
          <div key={m.id} className="bn-mkt-card" onClick={() => onOpen(m)} style={{ cursor: 'pointer', position: 'relative' }}>
            {onEdit && (
              <button className="bn-card-edit" style={{ position: 'absolute', top: 12, right: 12 }}
                      onClick={(ev) => { ev.stopPropagation(); onEdit(m); }} title="Editar producto">
                <IconSettings size={11} /> Editar
              </button>
            )}
            <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
              <div className="bn-mkt-emoji">{m.emoji}</div>
              <div style={{ flex: 1 }}>
                <div className="bn-mkt-name">{m.nombre}</div>
                <div className="muted" style={{ fontSize: 11.5 }}>Stock: {m.stock}</div>
              </div>
            </div>
            <div className="bn-mkt-desc">{m.descripcion}</div>
            <div className="bn-mkt-foot">
              <span className="bn-mkt-puntos"><IconStar size={12} /> {fmtPuntos(m.puntos)}</span>
              <span className="muted mono" style={{ fontSize: 11 }}>{m.id}</span>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── SOLICITUDES TAB ────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const SolicitudesTab = ({ solicitudes, beneficios, empleados, onOpen, aprobar, rechazar }) => {
  const [filtro, setFiltro] = _bn_useState('pendiente');
  const filtradas = solicitudes.filter(s => filtro === 'todas' || s.estado === filtro);
  const conteos = {
    pendiente: solicitudes.filter(s => s.estado === 'pendiente').length,
    aprobada:  solicitudes.filter(s => s.estado === 'aprobada').length,
    rechazada: solicitudes.filter(s => s.estado === 'rechazada').length,
    entregada: solicitudes.filter(s => s.estado === 'entregada').length,
  };

  const slaInfo = (sol) => {
    // Calcula avance del SLA en porcentaje (mock)
    const horasSLA = sol.beneficioId === 'BEN-008' ? 168 : 48;
    const diff = sol.estado === 'pendiente' ? 36 : 12;
    const pct = Math.min(100, Math.round(diff / horasSLA * 100));
    let tone = 'green';
    if (pct > 60) tone = 'amber';
    if (pct > 90) tone = 'rose';
    return { pct, tone, restante: Math.max(0, horasSLA - diff) };
  };

  return (
    <div>
      <div className="bn-filters">
        <button className={`bn-chip ${filtro === 'pendiente' ? 'active' : ''}`} onClick={() => setFiltro('pendiente')}>
          Pendientes <span className="pill rose" style={{ marginLeft: 4 }}>{conteos.pendiente}</span>
        </button>
        <button className={`bn-chip ${filtro === 'aprobada' ? 'active' : ''}`} onClick={() => setFiltro('aprobada')}>
          Aprobadas <span className="pill green" style={{ marginLeft: 4 }}>{conteos.aprobada}</span>
        </button>
        <button className={`bn-chip ${filtro === 'rechazada' ? 'active' : ''}`} onClick={() => setFiltro('rechazada')}>
          Rechazadas <span className="pill" style={{ marginLeft: 4 }}>{conteos.rechazada}</span>
        </button>
        <button className={`bn-chip ${filtro === 'entregada' ? 'active' : ''}`} onClick={() => setFiltro('entregada')}>
          Entregadas <span className="pill navy" style={{ marginLeft: 4 }}>{conteos.entregada}</span>
        </button>
        <button className={`bn-chip ${filtro === 'todas' ? 'active' : ''}`} onClick={() => setFiltro('todas')}>
          Todas <span className="pill" style={{ marginLeft: 4 }}>{solicitudes.length}</span>
        </button>
      </div>

      <table className="doc-table">
        <thead>
          <tr>
            <th>Colaborador</th>
            <th>Beneficio</th>
            <th>Solicitado</th>
            <th>SLA</th>
            <th>Estado</th>
            <th style={{ width: 1 }}></th>
          </tr>
        </thead>
        <tbody>
          {filtradas.map(s => {
            const e = empleados.find(x => x.id === s.empleadoId);
            const b = beneficios.find(x => x.id === s.beneficioId);
            const cat = window.getCategoria && window.getCategoria(b?.categoriaId);
            const sla = slaInfo(s);
            return (
              <tr key={s.id} onClick={() => onOpen(s)} style={{ cursor: 'pointer' }}>
                <td data-label="Colaborador">
                  <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                    <div className="doc-avatar">{e?.iniciales || '–'}</div>
                    <div>
                      <div style={{ fontWeight: 600 }}>{e?.nombre || s.empleadoId}</div>
                      <div className="muted" style={{ fontSize: 11 }}>{e?.area} · {e?.sede}</div>
                    </div>
                  </div>
                </td>
                <td data-label="Beneficio">
                  <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                    <span style={{ fontSize: 18 }}>{b?.emoji}</span>
                    <div>
                      <div style={{ fontWeight: 500 }}>{b?.nombre || s.beneficioId}</div>
                      <div className="muted" style={{ fontSize: 11 }}>{cat?.nombre}</div>
                    </div>
                  </div>
                </td>
                <td data-label="Solicitado" className="mono" style={{ fontSize: 12 }}>{s.fechaSolicitud}</td>
                <td data-label="SLA">
                  {s.estado === 'pendiente' ? (
                    <div className="bn-sla-bar">
                      <div className="bn-sla-track"><div className={`bn-sla-fill ${sla.tone}`} style={{ width: `${sla.pct}%` }}></div></div>
                      <span className="bn-sla-text" style={{ color: `var(--${sla.tone}-600, currentColor)` }}>{sla.restante}h</span>
                    </div>
                  ) : <span className="muted" style={{ fontSize: 12 }}>—</span>}
                </td>
                <td data-label="Estado">
                  <EstadoPill estado={s.estado} />
                </td>
                <td>
                  {s.estado === 'pendiente' ? (
                    <div style={{ display: 'flex', gap: 6 }}>
                      <button className="btn primary" onClick={(ev) => { ev.stopPropagation(); aprobar(s.id); }} style={{ fontSize: 11, padding: '4px 10px' }}>
                        <IconCheck size={11} /> Aprobar
                      </button>
                      <button className="btn" onClick={(ev) => { ev.stopPropagation(); rechazar(s.id); }} style={{ fontSize: 11, padding: '4px 10px' }}>
                        Rechazar
                      </button>
                    </div>
                  ) : (
                    <button className="btn" style={{ fontSize: 11, padding: '4px 10px' }}>
                      Ver detalle
                    </button>
                  )}
                </td>
              </tr>
            );
          })}
          {filtradas.length === 0 && (
            <tr><td colSpan="6" style={{ textAlign: 'center', padding: 40, color: 'var(--muted)' }}>
              No hay solicitudes en este estado.
            </td></tr>
          )}
        </tbody>
      </table>
    </div>
  );
};

const EstadoPill = ({ estado }) => {
  const map = {
    pendiente: { tone: 'amber-soft', label: 'Pendiente' },
    aprobada:  { tone: 'green',      label: 'Aprobada'  },
    rechazada: { tone: 'rose',       label: 'Rechazada' },
    entregada: { tone: 'navy',       label: 'Entregada' },
    vencida:   { tone: 'rose',       label: 'Vencida'   },
  };
  const m = map[estado] || { tone: '', label: estado };
  return <span className={`pill ${m.tone}`}>{m.label}</span>;
};

// ══════════════════════════════════════════════════════════════════════
// ─── MATRIZ TAB ─────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const MatrizBeneficiosTab = ({ beneficios, cargos, matriz: matrizInicial, categorias }) => {
  const [matriz, setMatriz] = _bn_useState(matrizInicial);
  const [catFilter, setCatFilter] = _bn_useState('todos');

  const beneficiosFiltrados = beneficios.filter(b => catFilter === 'todos' || b.categoriaId === catFilter);
  const REGLAS = ['obligatorio', 'opcional', 'no_aplica'];
  const SHORT  = { obligatorio: 'O', opcional: '·', no_aplica: '—' };

  const cellRegla = (cargoId, beneficioId) => {
    const r = matriz.find(m => m.cargoId === cargoId && m.beneficioId === beneficioId);
    return r ? r.regla : 'no_aplica';
  };
  const toggleCell = (cargoId, beneficioId) => {
    const idx = matriz.findIndex(m => m.cargoId === cargoId && m.beneficioId === beneficioId);
    const actual = idx >= 0 ? matriz[idx].regla : 'no_aplica';
    const next = REGLAS[(REGLAS.indexOf(actual) + 1) % REGLAS.length];
    if (idx >= 0) {
      const copy = [...matriz];
      copy[idx] = { ...copy[idx], regla: next };
      setMatriz(copy);
    } else {
      setMatriz(prev => [...prev, { cargoId, beneficioId, regla: next }]);
    }
  };

  return (
    <div>
      <div className="bn-filters">
        <span className="muted" style={{ fontSize: 12 }}>Categoría:</span>
        <button className={`bn-chip ${catFilter === 'todos' ? 'active' : ''}`} onClick={() => setCatFilter('todos')}>
          Todas
        </button>
        {categorias.map(c => (
          <button key={c.id} className={`bn-chip ${catFilter === c.id ? 'active' : ''}`} onClick={() => setCatFilter(c.id)}>
            {c.emoji} {c.nombre}
          </button>
        ))}
        <span className="muted" style={{ marginLeft: 'auto', fontSize: 12 }}>
          Click en cada celda para alternar entre <b>obligatorio</b>, <b>opcional</b> y <b>no aplica</b>.
        </span>
      </div>

      <div className="bn-matrix-wrap">
        <table className="bn-matrix">
          <thead>
            <tr>
              <th className="bn-matrix-rowhead">Beneficio · Cargo →</th>
              {cargos.map(c => (
                <th key={c.id} title={c.nombre + ' · ' + c.headcount + ' personas'}>
                  <div style={{ writingMode: 'vertical-rl', transform: 'rotate(180deg)', fontSize: 11, lineHeight: 1.2, height: 110, display: 'flex', alignItems: 'flex-end', justifyContent: 'center', whiteSpace: 'nowrap' }}>
                    {c.nombre} <span className="muted" style={{ marginLeft: 4 }}>({c.headcount})</span>
                  </div>
                </th>
              ))}
            </tr>
          </thead>
          <tbody>
            {beneficiosFiltrados.map(b => {
              const cat = categorias.find(c => c.id === b.categoriaId) || {};
              return (
                <tr key={b.id}>
                  <td className="bn-matrix-rowhead">
                    <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                      <span style={{ fontSize: 18 }}>{b.emoji}</span>
                      <div>
                        <div style={{ fontWeight: 600, fontSize: 12.5 }}>{b.nombre}</div>
                        <div className="muted" style={{ fontSize: 10.5 }}>{cat.nombre}</div>
                      </div>
                    </div>
                  </td>
                  {cargos.map(c => {
                    const regla = cellRegla(c.id, b.id);
                    return (
                      <td key={c.id}>
                        <button
                          className={`bn-matrix-cell ${regla}`}
                          onClick={() => toggleCell(c.id, b.id)}
                          title={`${c.nombre} → ${b.nombre}: ${regla.replace('_', ' ')}`}
                        >
                          {SHORT[regla]}
                        </button>
                      </td>
                    );
                  })}
                </tr>
              );
            })}
          </tbody>
        </table>
        <div className="bn-matrix-legend">
          <span className="item"><span className="swatch" style={{ background: 'var(--green-600)' }}></span> Obligatorio · se asigna automáticamente al ingreso</span>
          <span className="item"><span className="swatch" style={{ background: '#FFF1D6' }}></span> Opcional · aparece en catálogo del colaborador</span>
          <span className="item"><span className="swatch" style={{ background: '#F1F1F4' }}></span> No aplica · no se muestra</span>
        </div>
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── CAMPAÑAS TAB ───────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const CampanasTab = ({ campanas, eventos, empleados, beneficios, onCreate, onEdit }) => {
  const activas = campanas.filter(c => c.estado === 'activa');
  const planificadas = campanas.filter(c => c.estado === 'planificada');
  const finalizadas = campanas.filter(c => c.estado === 'finalizada');

  return (
    <div>
      <div className="bn-section-toolbar">
        <div>
          <h3 className="bn-section-title">Campañas de bienestar</h3>
          <div className="muted" style={{ fontSize: 12, marginTop: 2 }}>
            {activas.length} activas · {planificadas.length} planificadas · {finalizadas.length} finalizadas.
          </div>
        </div>
        {onCreate && (
          <button className="btn primary" onClick={onCreate}>
            <IconPlus size={14} /> Nueva campaña
          </button>
        )}
      </div>

      <h3 style={{ margin: '8px 0 12px', fontSize: 13.5, fontWeight: 600, color: 'var(--muted)' }}>Próximos eventos automáticos · 60 días</h3>

      {/* Eventos automáticos · cumpleaños y aniversarios */}
      <div className="bn-camp-grid" style={{ marginBottom: 24 }}>
        {eventos.slice(0, 6).map((ev, i) => {
          const e = empleados.find(x => x.id === ev.empleadoId);
          const b = beneficios.find(x => x.id === ev.beneficioId);
          const tipo = ev.tipo === 'cumple' ? 'Cumpleaños' : `Aniversario ${ev.anios} año${ev.anios > 1 ? 's' : ''}`;
          return (
            <div key={i} className="bn-camp-card activa" style={{ paddingTop: 12 }}>
              <div className="bn-camp-head">
                <div className="bn-camp-emoji">{ev.tipo === 'cumple' ? '🎂' : '🏅'}</div>
                <div style={{ flex: 1 }}>
                  <div className="bn-camp-title" style={{ fontSize: 14 }}>{tipo} · {e?.nombre}</div>
                  <div className="bn-camp-when">
                    {ev.dias === 0 ? 'Hoy' : `En ${ev.dias} día${ev.dias > 1 ? 's' : ''}`} · {b?.nombre}
                  </div>
                </div>
              </div>
              <div className="muted" style={{ fontSize: 11.5, padding: '8px 0', borderTop: '1px solid var(--border)' }}>
                Disparador automático del motor · sin intervención manual.
              </div>
            </div>
          );
        })}
      </div>

      {/* Campañas activas */}
      {activas.length > 0 && <SeccionCampanas titulo="Campañas activas" campanas={activas} beneficios={beneficios} onEdit={onEdit} />}
      {planificadas.length > 0 && <SeccionCampanas titulo="Campañas planificadas" campanas={planificadas} beneficios={beneficios} onEdit={onEdit} />}
      {finalizadas.length > 0 && <SeccionCampanas titulo="Campañas finalizadas" campanas={finalizadas} beneficios={beneficios} onEdit={onEdit} />}
    </div>
  );
};

const SeccionCampanas = ({ titulo, campanas, beneficios, onEdit }) => (
  <div style={{ marginBottom: 20 }}>
    <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 10px' }}>{titulo} <span className="muted" style={{ fontWeight: 400 }}>· {campanas.length}</span></h3>
    <div className="bn-camp-grid">
      {campanas.map(c => (
        <div key={c.id} className={`bn-camp-card ${c.estado}`} style={{ position: 'relative' }}>
          {onEdit && (
            <button className="bn-card-edit" style={{ position: 'absolute', top: 12, right: 12 }}
                    onClick={() => onEdit(c)} title="Editar campaña">
              <IconSettings size={11} /> Editar
            </button>
          )}
          <div className="bn-camp-head">
            <div className="bn-camp-emoji">{c.emoji}</div>
            <div style={{ flex: 1 }}>
              <div className="bn-camp-title">{c.nombre}</div>
              <div className="bn-camp-when">{c.fechaInicio} → {c.fechaFin} · {c.audiencia}</div>
            </div>
          </div>
          <div className="bn-camp-desc">{c.descripcion}</div>
          <div style={{ fontSize: 11.5 }}>
            <span className="muted">Presupuesto: </span><span className="mono">{fmtCOP(c.presupuesto)}</span>
            <span className="muted" style={{ marginLeft: 10 }}>Beneficios: </span>
            {(c.beneficiosAsociados || []).map(bid => {
              const b = beneficios.find(x => x.id === bid);
              return b ? <span key={bid} title={b.nombre} style={{ marginRight: 4 }}>{b.emoji}</span> : null;
            })}
          </div>
          <div className="bn-camp-stats">
            <div className="bn-camp-stat">
              <div className="num">{c.kpis.participacion}</div>
              <div className="lbl">Participación</div>
            </div>
            <div className="bn-camp-stat">
              <div className="num">{c.kpis.meta}</div>
              <div className="lbl">Meta</div>
            </div>
            <div className="bn-camp-stat">
              <div className="num">{c.kpis.satisfaccion != null ? c.kpis.satisfaccion + '%' : '—'}</div>
              <div className="lbl">Satisfacción</div>
            </div>
          </div>
        </div>
      ))}
    </div>
  </div>
);

// ══════════════════════════════════════════════════════════════════════
// ─── RECONOCIMIENTOS TAB ────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const ReconocimientosTab = ({ reconocimientos, empleados, valores, onCreate }) => {
  const ranking = _bn_useMemo(() => {
    const counts = {};
    reconocimientos.forEach(r => {
      counts[r.paraId] = (counts[r.paraId] || 0) + 1;
    });
    return Object.entries(counts)
      .map(([id, n]) => ({ empleado: empleados.find(e => e.id === id), reconocimientos: n }))
      .filter(x => x.empleado)
      .sort((a, b) => b.reconocimientos - a.reconocimientos)
      .slice(0, 5);
  }, [reconocimientos, empleados]);

  return (
    <div>
      <div className="bn-section-toolbar">
        <div>
          <h3 className="bn-section-title">Reconocimientos peer-to-peer</h3>
          <div className="muted" style={{ fontSize: 12, marginTop: 2 }}>
            {reconocimientos.length} reconocimientos · suman <b>{reconocimientos.reduce((a, r) => a + r.puntos, 0)} pts</b> a los wallets de los receptores.
          </div>
        </div>
        <button className="btn primary" onClick={onCreate}><IconPlus size={14} /> Nuevo reconocimiento</button>
      </div>

      {/* Ranking */}
      <div style={{ background: 'white', border: '1px solid var(--border)', borderRadius: 10, padding: 16, marginBottom: 16 }}>
        <div style={{ fontSize: 12.5, fontWeight: 600, marginBottom: 10 }}>Top 5 personas reconocidas este mes</div>
        <div style={{ display: 'flex', gap: 10, flexWrap: 'wrap' }}>
          {ranking.map((r, i) => (
            <div key={r.empleado.id} style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '8px 12px', background: 'var(--surface)', borderRadius: 8 }}>
              <span style={{ fontSize: 16 }}>{['🥇','🥈','🥉','🏅','🏅'][i]}</span>
              <div className="doc-avatar" style={{ width: 28, height: 28, fontSize: 11 }}>{r.empleado.iniciales}</div>
              <div>
                <div style={{ fontWeight: 600, fontSize: 12.5 }}>{r.empleado.nombre}</div>
                <div className="muted" style={{ fontSize: 11 }}>{r.reconocimientos} reconocimiento{r.reconocimientos > 1 ? 's' : ''}</div>
              </div>
            </div>
          ))}
        </div>
      </div>

      {/* Feed */}
      <div className="bn-recog-grid">
        {reconocimientos.map(r => {
          const de = empleados.find(e => e.id === r.deId);
          const para = empleados.find(e => e.id === r.paraId);
          const v = valores.find(x => x.id === r.valorId) || {};
          return (
            <div key={r.id} className="bn-recog-card">
              <div className="bn-recog-line">
                <div className="doc-avatar" style={{ width: 26, height: 26, fontSize: 10 }}>{de?.iniciales}</div>
                <span style={{ fontWeight: 600 }}>{de?.nombre.split(' ')[0]}</span>
                <span className="bn-recog-arrow">→</span>
                <div className="doc-avatar" style={{ width: 26, height: 26, fontSize: 10 }}>{para?.iniciales}</div>
                <span style={{ fontWeight: 600 }}>{para?.nombre.split(' ')[0]}</span>
              </div>
              <div className="bn-recog-msg">"{r.mensaje}"</div>
              <div className="bn-recog-foot">
                <span className={`bn-valor-pill ${v.tone}`}>{v.emoji} {v.nombre}</span>
                <span><b className="mono">+{r.puntos}</b> pts · <span className="muted">{r.cuando}</span></span>
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── ANALITICA TAB ──────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const AnaliticaTab = ({ beneficios, categorias, solicitudes, matriz, cargos, empleados, kpis, wallet }) => {
  // Top 10 beneficios por uso (mock: cuántos cargos lo tienen como obligatorio + suma headcount)
  const topUso = _bn_useMemo(() => {
    return beneficios.map(b => {
      const obligatorios = matriz.filter(m => m.beneficioId === b.id && m.regla === 'obligatorio');
      const headcount = obligatorios.reduce((acc, m) => acc + (cargos.find(c => c.id === m.cargoId)?.headcount || 0), 0);
      return { b, headcount };
    }).sort((a, b) => b.headcount - a.headcount).slice(0, 10);
  }, [beneficios, matriz, cargos]);

  // Adopción por categoría
  const adopcionCat = _bn_useMemo(() => {
    return categorias.map(c => {
      const benefitsC = beneficios.filter(b => b.categoriaId === c.id);
      const total = benefitsC.length;
      const obligatorios = benefitsC.filter(b => matriz.some(m => m.beneficioId === b.id && m.regla === 'obligatorio')).length;
      return { c, total, obligatorios, ratio: total ? Math.round(obligatorios / total * 100) : 0 };
    });
  }, [categorias, beneficios, matriz]);

  // Heatmap: adopción por área x sede (mock con headcount)
  const areas = ['Operaciones', 'Aprovechamiento', 'Mantenimiento', 'Calidad', 'RRHH', 'Compras', 'Logística'];
  const sedes = ['Cali', 'Barranquilla'];
  const heat = _bn_useMemo(() => {
    return areas.map(a => sedes.map(s => {
      const emps = empleados.filter(e => e.area === a && e.sede === s);
      if (!emps.length) return null;
      // mock adopción: 70-95% según área
      const adopcion = 70 + (a.length * 3) % 26;
      return { area: a, sede: s, adopcion, n: emps.length };
    }));
  }, [empleados]);

  const heatColor = (v) => {
    if (v == null) return '#F1F1F4';
    if (v >= 90) return '#0E8A57';
    if (v >= 80) return '#14B871';
    if (v >= 70) return '#F4B400';
    return '#EF435C';
  };

  // Saldos wallet · top 5
  const topWallet = _bn_useMemo(() => {
    return Object.entries(wallet || {})
      .map(([id, w]) => ({ empleado: empleados.find(e => e.id === id), balance: w.balance }))
      .filter(x => x.empleado)
      .sort((a, b) => b.balance - a.balance)
      .slice(0, 5);
  }, [wallet, empleados]);

  return (
    <div>
      {/* Fila 1 · Top 10 + Adopción categoría */}
      <div className="bn-an-row">
        <div className="bn-an-card">
          <h3>Top 10 beneficios por cobertura</h3>
          {topUso.map(({ b, headcount }) => {
            const max = topUso[0]?.headcount || 1;
            return (
              <div key={b.id} className="bn-bar-row">
                <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
                  <span>{b.emoji}</span><span style={{ fontSize: 12.5, fontWeight: 500 }}>{b.nombre}</span>
                </span>
                <div className="bn-bar-track">
                  <div className="bn-bar-fill" style={{ width: `${(headcount / max * 100)}%` }}></div>
                </div>
                <span className="mono" style={{ textAlign: 'right' }}>{headcount}</span>
              </div>
            );
          })}
        </div>
        <div className="bn-an-card">
          <h3>Adopción por categoría</h3>
          {adopcionCat.map(({ c, total, obligatorios, ratio }) => (
            <div key={c.id} className="bn-bar-row">
              <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
                <span>{c.emoji}</span><span style={{ fontSize: 12.5, fontWeight: 500 }}>{c.nombre}</span>
              </span>
              <div className="bn-bar-track">
                <div className={`bn-bar-fill ${c.tone === 'rose' ? '' : c.tone === 'amber' ? 'amber' : 'green'}`} style={{ width: `${ratio}%` }}></div>
              </div>
              <span className="mono" style={{ textAlign: 'right' }}>{obligatorios}/{total}</span>
            </div>
          ))}
        </div>
      </div>

      {/* Fila 2 · Heatmap + Top wallet */}
      <div className="bn-an-row">
        <div className="bn-an-card">
          <h3>Adopción por área × sede</h3>
          <div className="bn-heat-grid" style={{ gridTemplateColumns: `120px repeat(${sedes.length}, 1fr)` }}>
            <div></div>
            {sedes.map(s => <div key={s} style={{ padding: 6, fontWeight: 600, textAlign: 'center', fontSize: 12 }}>{s}</div>)}
            {areas.map((a, ai) => (
              <React.Fragment key={a}>
                <div style={{ padding: 6, fontSize: 12, fontWeight: 500 }}>{a}</div>
                {sedes.map((s, si) => {
                  const cell = heat[ai][si];
                  return (
                    <div key={s} className="bn-heat-cell" style={{ background: heatColor(cell?.adopcion), opacity: cell ? 1 : 0.3 }}>
                      {cell ? `${cell.adopcion}%` : '–'}
                    </div>
                  );
                })}
              </React.Fragment>
            ))}
          </div>
          <div className="muted" style={{ fontSize: 11, marginTop: 10, display: 'flex', gap: 10 }}>
            <span><span className="bn-heat-cell" style={{ background: '#0E8A57', display: 'inline-block', width: 10, height: 10, padding: 0, borderRadius: 2 }}></span> ≥90%</span>
            <span><span className="bn-heat-cell" style={{ background: '#14B871', display: 'inline-block', width: 10, height: 10, padding: 0, borderRadius: 2 }}></span> ≥80%</span>
            <span><span className="bn-heat-cell" style={{ background: '#F4B400', display: 'inline-block', width: 10, height: 10, padding: 0, borderRadius: 2 }}></span> ≥70%</span>
            <span><span className="bn-heat-cell" style={{ background: '#EF435C', display: 'inline-block', width: 10, height: 10, padding: 0, borderRadius: 2 }}></span> {'<70%'}</span>
          </div>
        </div>
        <div className="bn-an-card">
          <h3>Top wallets · saldos actuales</h3>
          {topWallet.map(({ empleado, balance }) => {
            const max = topWallet[0]?.balance || 1;
            return (
              <div key={empleado.id} className="bn-bar-row">
                <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
                  <div className="doc-avatar" style={{ width: 22, height: 22, fontSize: 10 }}>{empleado.iniciales}</div>
                  <span style={{ fontSize: 12.5, fontWeight: 500 }}>{empleado.nombre.split(' ')[0]} {empleado.nombre.split(' ')[1]}</span>
                </span>
                <div className="bn-bar-track">
                  <div className="bn-bar-fill amber" style={{ width: `${(balance / max * 100)}%` }}></div>
                </div>
                <span className="mono" style={{ textAlign: 'right' }}>{balance}</span>
              </div>
            );
          })}
          <div style={{ marginTop: 16, padding: 12, background: 'var(--surface)', borderRadius: 8, fontSize: 12 }}>
            <div style={{ fontWeight: 600, marginBottom: 6 }}>ROI estimado del módulo</div>
            <div className="muted" style={{ marginBottom: 8 }}>(ahorro_rotación + productividad) / gasto_total</div>
            <div className="mono" style={{ fontSize: 18, fontWeight: 700, color: 'var(--green-600)' }}>3.4×</div>
            <div className="muted" style={{ fontSize: 11, marginTop: 4 }}>Reducción 12% en rotación · uplift 8% en NPS interno · gasto YTD {fmtCOP(kpis.gasto)}</div>
          </div>
        </div>
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── COLABORADOR VIEW ───────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const ColaboradorView = (props) => {
  const { me, meCargo, meWallet, section, setSection, beneficios, categorias,
          eventos, campanas, marketplace, solicitudes, reconocimientosRecibidos, reconocimientosDados,
          valores, onOpenBen, onOpenMkt, onOpenRecog, onSolicitar, onCanjear } = props;

  if (!me) return <div className="muted" style={{ padding: 40, textAlign: 'center' }}>No hay un colaborador asociado.</div>;

  // Beneficios elegibles para mí
  const misBeneficios = beneficios.filter(b => window.esElegibleBeneficio && window.esElegibleBeneficio(me, b));
  const obligatorios = misBeneficios.filter(b => {
    const r = (window.MATRIZ_BENEFICIOS_CARGO || []).find(m => m.cargoId === me.cargoId && m.beneficioId === b.id);
    return r && r.regla === 'obligatorio';
  });
  const opcionales = misBeneficios.filter(b => !obligatorios.includes(b));
  const destacados = misBeneficios.filter(b => b.destacado);
  const badgesUser = (window.badgesDeEmpleado && window.badgesDeEmpleado(me.id)) || [];

  const SECCIONES = [
    { id: 'inicio',         label: 'Inicio',           icon: 'IconHome',      count: null },
    { id: 'mi-catalogo',    label: 'Mi catálogo',      icon: 'IconGift',      count: misBeneficios.length },
    { id: 'marketplace',    label: 'Marketplace',      icon: 'IconStar',      count: marketplace.length },
    { id: 'mis-solicitudes',label: 'Mis solicitudes',  icon: 'IconCheck',     count: solicitudes.length },
    { id: 'reconocimientos',label: 'Mis reconocimientos', icon: 'IconStar',   count: reconocimientosRecibidos.length },
    { id: 'historial',      label: 'Historial',        icon: 'IconClock',     count: meWallet.transacciones.length },
  ];

  return (
    <div className="co-layout">
      <aside className="co-sidebar">
        <div className="muted-xs" style={{ padding: '4px 4px 8px' }}>{me.nombre.split(' ')[0]} · {meCargo?.nombre}</div>
        {SECCIONES.map(s => {
          const I = window[s.icon];
          return (
            <button key={s.id} className={`co-side-item ${section === s.id ? 'active' : ''}`} onClick={() => setSection(s.id)}>
              <I size={15} />
              <span style={{ flex: 1, textAlign: 'left' }}>{s.label}</span>
              {s.count != null && <span className="co-side-count">{s.count}</span>}
            </button>
          );
        })}

        <div className="bn-side-wallet">
          <div className="lbl">Mi wallet</div>
          <div className="num">{fmtPuntos(meWallet.balance)}</div>
          <div className="sub">Acumulado total: {meWallet.total} pts</div>
        </div>

        {badgesUser.length > 0 && (
          <div style={{ marginTop: 14 }}>
            <div className="muted-xs" style={{ marginBottom: 6 }}>Mis badges · {badgesUser.length}</div>
            <div className="bn-badges-row">
              {badgesUser.map(b => (
                <span key={b.id} className={`bn-badge-chip lvl-${b.nivel}`} title={b.descripcion}>
                  <span className="emoji">{b.emoji}</span>{b.nombre}
                </span>
              ))}
            </div>
          </div>
        )}
      </aside>

      <div className="co-content">
        {section === 'inicio' && (
          <div>
            <div className="bn-hero">
              <div>
                <h2>Hola, {me.nombre.split(' ')[0]} 👋</h2>
                <div className="bn-hero-sub">Tu plan de beneficios Atica · {meCargo?.nombre} · Sede {me.sede}</div>
                <div className="bn-hero-wallet">
                  <IconStar size={26} />
                  <div>
                    <div className="bn-wallet-num">{fmtPuntos(meWallet.balance)}</div>
                    <div className="bn-wallet-lbl">en tu wallet · canjéalos en marketplace</div>
                  </div>
                </div>
              </div>
              <div className="bn-hero-events">
                {eventos.length === 0 && <div style={{ opacity: 0.7, fontSize: 13 }}>No tienes eventos automáticos próximos.</div>}
                {eventos.slice(0, 3).map((ev, i) => {
                  const tipo = ev.tipo === 'cumple' ? 'Tu cumpleaños' : `Aniversario ${ev.anios} año${ev.anios > 1 ? 's' : ''}`;
                  const cuando = ev.dias === 0 ? 'Hoy' : `En ${ev.dias} día${ev.dias > 1 ? 's' : ''}`;
                  return (
                    <div key={i} className="bn-hero-event">
                      <div className="bn-hero-event-emoji">{ev.tipo === 'cumple' ? '🎂' : '🏅'}</div>
                      <div className="bn-hero-event-text">
                        <div className="b">{tipo}</div>
                        <div style={{ fontSize: 12, opacity: 0.85 }}>Día libre + {ev.tipo === 'cumple' ? 100 : 250} pts al wallet</div>
                      </div>
                      <span className="bn-hero-event-when">{cuando}</span>
                    </div>
                  );
                })}
              </div>
            </div>

            {destacados.length > 0 && (
              <div style={{ marginBottom: 18 }}>
                <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 10px' }}>Destacados para ti ⭐</h3>
                <div className="bn-grid">
                  {destacados.map(b => <BeneficioCard key={b.id} b={b} cat={categorias.find(c => c.id === b.categoriaId)} onClick={() => onOpenBen(b)} />)}
                </div>
              </div>
            )}

            <div style={{ marginBottom: 18 }}>
              <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 10px' }}>Campañas activas en mayo</h3>
              <div className="bn-camp-grid">
                {campanas.filter(c => c.estado === 'activa').slice(0, 3).map(c => (
                  <div key={c.id} className="bn-camp-card activa">
                    <div className="bn-camp-head">
                      <div className="bn-camp-emoji">{c.emoji}</div>
                      <div style={{ flex: 1 }}>
                        <div className="bn-camp-title">{c.nombre}</div>
                        <div className="bn-camp-when">{c.fechaInicio} → {c.fechaFin}</div>
                      </div>
                    </div>
                    <div className="bn-camp-desc">{c.descripcion}</div>
                  </div>
                ))}
              </div>
            </div>
          </div>
        )}

        {section === 'mi-catalogo' && (
          <div>
            <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 10px' }}>Mis beneficios obligatorios <span className="pill green" style={{ marginLeft: 6 }}>{obligatorios.length}</span></h3>
            <div className="bn-grid" style={{ marginBottom: 22 }}>
              {obligatorios.map(b => <BeneficioCard key={b.id} b={b} cat={categorias.find(c => c.id === b.categoriaId)} onClick={() => onOpenBen(b)} forcedFlag="ya tienes" />)}
            </div>
            <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 10px' }}>Beneficios opcionales para ti <span className="pill amber-soft" style={{ marginLeft: 6 }}>{opcionales.length}</span></h3>
            <div className="bn-grid">
              {opcionales.map(b => <BeneficioCard key={b.id} b={b} cat={categorias.find(c => c.id === b.categoriaId)} onClick={() => onOpenBen(b)} />)}
            </div>
          </div>
        )}

        {section === 'marketplace' && (
          <div>
            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 12 }}>
              <h3 style={{ margin: 0, fontSize: 14, fontWeight: 600 }}>Marketplace de canjes</h3>
              <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--amber-600)' }}><IconStar size={13} /> Tienes {fmtPuntos(meWallet.balance)} disponibles</span>
            </div>
            <div className="bn-grid">
              {marketplace.map(m => {
                const puede = meWallet.balance >= m.puntos;
                return (
                  <div key={m.id} className="bn-mkt-card" style={{ opacity: puede ? 1 : 0.5 }}>
                    <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
                      <div className="bn-mkt-emoji">{m.emoji}</div>
                      <div style={{ flex: 1 }}>
                        <div className="bn-mkt-name">{m.nombre}</div>
                        <div className="muted" style={{ fontSize: 11.5 }}>Stock: {m.stock}</div>
                      </div>
                    </div>
                    <div className="bn-mkt-desc">{m.descripcion}</div>
                    <div className="bn-mkt-foot">
                      <span className="bn-mkt-puntos"><IconStar size={12} /> {fmtPuntos(m.puntos)}</span>
                      <button className="btn primary" disabled={!puede} onClick={() => onOpenMkt(m)} style={{ fontSize: 11.5, padding: '5px 12px' }}>
                        {puede ? 'Canjear' : 'Te faltan ' + (m.puntos - meWallet.balance)}
                      </button>
                    </div>
                  </div>
                );
              })}
            </div>
          </div>
        )}

        {section === 'mis-solicitudes' && (
          <div>
            <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 12px' }}>Mis solicitudes <span className="pill" style={{ marginLeft: 6 }}>{solicitudes.length}</span></h3>
            {solicitudes.length === 0 ? (
              <div style={{ padding: 40, textAlign: 'center', color: 'var(--muted)' }}>
                <IconCheck size={28} style={{ opacity: 0.3 }} />
                <div style={{ marginTop: 10 }}>Aún no has hecho ninguna solicitud.</div>
                <button className="btn primary" style={{ marginTop: 12 }} onClick={() => setSection('mi-catalogo')}>Ver mi catálogo</button>
              </div>
            ) : (
              <div className="bn-history">
                {solicitudes.map(s => {
                  const b = beneficios.find(x => x.id === s.beneficioId);
                  return (
                    <div key={s.id} className="bn-history-item">
                      <div>
                        <div style={{ fontSize: 18 }}>{b?.emoji}</div>
                        <div className="bn-history-when">{s.fechaSolicitud.split(' ')[0]}</div>
                      </div>
                      <div className="bn-history-text">
                        <div className="lbl">{b?.nombre}</div>
                        <div className="desc">"{s.comentario}"</div>
                      </div>
                      <EstadoPill estado={s.estado} />
                    </div>
                  );
                })}
              </div>
            )}
          </div>
        )}

        {section === 'reconocimientos' && (
          <div>
            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 14 }}>
              <h3 style={{ margin: 0, fontSize: 14, fontWeight: 600 }}>Mis reconocimientos</h3>
              <button className="btn primary" onClick={onOpenRecog}><IconPlus size={13} /> Reconocer a alguien</button>
            </div>

            <h4 style={{ fontSize: 12.5, fontWeight: 600, margin: '6px 0 8px', textTransform: 'uppercase', letterSpacing: 0.5, color: 'var(--muted)' }}>Recibidos · {reconocimientosRecibidos.length}</h4>
            <div className="bn-recog-grid" style={{ marginBottom: 22 }}>
              {reconocimientosRecibidos.length === 0 && <div className="muted" style={{ fontSize: 13 }}>Aún no has recibido reconocimientos. ¡Sigue así!</div>}
              {reconocimientosRecibidos.map(r => {
                const v = valores.find(x => x.id === r.valorId) || {};
                return (
                  <div key={r.id} className="bn-recog-card">
                    <div className="bn-recog-msg">"{r.mensaje}"</div>
                    <div className="bn-recog-foot">
                      <span className={`bn-valor-pill ${v.tone}`}>{v.emoji} {v.nombre}</span>
                      <span><b className="mono">+{r.puntos}</b> pts · <span className="muted">{r.cuando}</span></span>
                    </div>
                  </div>
                );
              })}
            </div>

            <h4 style={{ fontSize: 12.5, fontWeight: 600, margin: '6px 0 8px', textTransform: 'uppercase', letterSpacing: 0.5, color: 'var(--muted)' }}>Dados · {reconocimientosDados.length}</h4>
            <div className="bn-recog-grid">
              {reconocimientosDados.length === 0 && <div className="muted" style={{ fontSize: 13 }}>No has dado reconocimientos. ¡Anima a un colega!</div>}
              {reconocimientosDados.map(r => {
                const v = valores.find(x => x.id === r.valorId) || {};
                return (
                  <div key={r.id} className="bn-recog-card">
                    <div className="bn-recog-msg">"{r.mensaje}"</div>
                    <div className="bn-recog-foot">
                      <span className={`bn-valor-pill ${v.tone}`}>{v.emoji} {v.nombre}</span>
                      <span className="muted">{r.cuando}</span>
                    </div>
                  </div>
                );
              })}
            </div>
          </div>
        )}

        {section === 'historial' && (
          <div>
            <h3 style={{ fontSize: 14, fontWeight: 600, margin: '0 0 10px' }}>Movimientos del wallet</h3>
            <div className="bn-history">
              {meWallet.transacciones.map((t, i) => (
                <div key={i} className="bn-history-item">
                  <div className="bn-history-when">{t.fecha}</div>
                  <div className="bn-history-text">
                    <div className="lbl">{t.motivo}</div>
                    <div className="desc">{t.tipo === 'credito' ? 'Crédito' : 'Débito'} en wallet</div>
                  </div>
                  <span className={`pill ${t.tipo === 'credito' ? 'green' : 'amber-soft'}`} style={{ fontFamily: 'var(--font-mono, monospace)' }}>
                    {t.tipo === 'credito' ? '+' : '−'}{t.monto} pts
                  </span>
                </div>
              ))}
            </div>
          </div>
        )}
      </div>
    </div>
  );
};

// Tarjeta reutilizable de beneficio
const BeneficioCard = ({ b, cat, onClick, forcedFlag }) => (
  <div className={`bn-card ${b.destacado ? 'destacado' : ''}`} onClick={onClick}>
    <div className="bn-card-flags">
      {forcedFlag && <span className="pill green">{forcedFlag}</span>}
      {!forcedFlag && b.esAutomatico && <span className="pill amber-soft" title="Automático"><IconZap size={11} /></span>}
      {b.destacado && <span className="pill amber" title="Destacado"><IconStar size={11} /></span>}
    </div>
    <div className="bn-card-head">
      <div className={`bn-card-emoji ${cat?.tone || 'navy'}`}>{b.emoji}</div>
      <div style={{ flex: 1, minWidth: 0 }}>
        <div className="bn-card-name">{b.nombre}</div>
        <div className="bn-card-cat">{cat?.emoji} {cat?.nombre} · {b.proveedor}</div>
      </div>
    </div>
    <div className="bn-card-desc">{b.descripcion}</div>
    <div className="bn-card-meta">
      <span className="muted">{b.modalidad === 'unico' ? 'Único' : b.modalidad === 'mensual' ? 'Mensual' : b.modalidad === 'anual' ? 'Anual' : 'Por evento'}</span>
      {b.puntos > 0 && <span className="bn-puntos">{b.puntos}<IconStar size={10} /></span>}
    </div>
  </div>
);

// ══════════════════════════════════════════════════════════════════════
// ─── MODALES ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════
const BeneficioModal = ({ beneficio, categorias, empleado, puedeSolicitar, onClose, onSolicitar }) => {
  const [comentario, setComentario] = _bn_useState('');
  const cat = categorias.find(c => c.id === beneficio.categoriaId) || {};

  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 720 }}>
        <div className="modal-head">
          <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
            <div className={`bn-card-emoji ${cat.tone || 'navy'}`} style={{ width: 48, height: 48, fontSize: 24 }}>{beneficio.emoji}</div>
            <div>
              <h3 style={{ margin: 0, fontSize: 17 }}>{beneficio.nombre}</h3>
              <div className="muted" style={{ fontSize: 12.5 }}>{cat.emoji} {cat.nombre} · {beneficio.proveedor}</div>
            </div>
          </div>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body">
          <p style={{ fontSize: 13.5, lineHeight: 1.55, margin: '0 0 14px' }}>{beneficio.descripcion}</p>

          <div className="bn-detail-grid">
            <div>
              <h4 style={{ fontSize: 12.5, fontWeight: 600, marginBottom: 6, textTransform: 'uppercase', letterSpacing: 0.5, color: 'var(--muted)' }}>¿Cómo funciona?</h4>
              <p style={{ fontSize: 13, lineHeight: 1.5, margin: 0 }}>{beneficio.faq}</p>

              {beneficio.elegMin && Object.keys(beneficio.elegMin).length > 0 && (
                <div style={{ marginTop: 14 }}>
                  <h4 style={{ fontSize: 12.5, fontWeight: 600, marginBottom: 6, textTransform: 'uppercase', letterSpacing: 0.5, color: 'var(--muted)' }}>Requisitos</h4>
                  <ul style={{ paddingLeft: 18, fontSize: 13, lineHeight: 1.5, margin: 0 }}>
                    {beneficio.elegMin.antiguedadMeses != null && <li>Antigüedad mínima: {beneficio.elegMin.antiguedadMeses} meses</li>}
                    {beneficio.elegMin.niveles && <li>Nivel: {beneficio.elegMin.niveles.join(', ')}</li>}
                    {beneficio.elegMin.areas   && <li>Áreas: {beneficio.elegMin.areas.join(', ')}</li>}
                    {beneficio.elegMin.sedes   && <li>Sedes: {beneficio.elegMin.sedes.join(', ')}</li>}
                  </ul>
                </div>
              )}
            </div>
            <div className="bn-detail-meta">
              <div className="row"><span className="lbl">Costo empresa</span><span className="val mono">{fmtCOP(beneficio.costoEmpresa)}</span></div>
              <div className="row"><span className="lbl">Costo empleado</span><span className="val mono">{beneficio.costoEmpleado === 0 ? 'Gratis' : fmtCOP(beneficio.costoEmpleado)}</span></div>
              {beneficio.puntos > 0 && <div className="row"><span className="lbl">Puntos</span><span className="val mono" style={{ color: 'var(--amber-600)' }}>+{beneficio.puntos} pts</span></div>}
              <div className="row"><span className="lbl">Modalidad</span><span className="val">{beneficio.modalidad}</span></div>
              <div className="row"><span className="lbl">Vigencia</span><span className="val">{beneficio.vigencia}</span></div>
              <div className="row"><span className="lbl">SLA aprobación</span><span className="val">{beneficio.sla > 0 ? `${beneficio.sla}h` : 'Inmediato'}</span></div>
              <div className="row"><span className="lbl">Disparador</span><span className="val">{beneficio.esAutomatico ? '⚡ Automático' : '✋ Por solicitud'}</span></div>
            </div>
          </div>

          {puedeSolicitar && !beneficio.esAutomatico && (
            <div style={{ marginTop: 18, padding: 14, background: 'var(--surface)', borderRadius: 8 }}>
              <h4 style={{ fontSize: 13, fontWeight: 600, marginBottom: 8 }}>Solicitar este beneficio</h4>
              <textarea
                value={comentario}
                onChange={e => setComentario(e.target.value)}
                placeholder="Cuéntanos brevemente por qué necesitas este beneficio…"
                style={{ width: '100%', minHeight: 70, padding: 10, fontSize: 13, fontFamily: 'inherit',
                  border: '1px solid var(--border)', borderRadius: 6, resize: 'vertical' }}
              />
            </div>
          )}

          {empleado && !puedeSolicitar && (
            <div style={{ marginTop: 18, padding: 12, background: '#FFF1D6', border: '1px solid var(--amber-600)', borderRadius: 8, fontSize: 13 }}>
              <IconAlert size={14} style={{ color: 'var(--amber-600)', verticalAlign: '-2px' }} /> No eres elegible para este beneficio según tu cargo, antigüedad o sede actual.
            </div>
          )}
        </div>
        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5 }}><IconCheck size={11} /> ID: {beneficio.id}</span>
          <div style={{ display: 'flex', gap: 8 }}>
            <button className="btn" onClick={onClose}>Cerrar</button>
            {puedeSolicitar && !beneficio.esAutomatico && (
              <button className="btn primary" onClick={() => onSolicitar(comentario || 'Solicitud sin comentario adicional.')}>
                <IconCheck size={13} /> Enviar solicitud
              </button>
            )}
          </div>
        </div>
      </div>
    </div>
  );
};

const CanjeModal = ({ mkt, wallet, onClose, onConfirm }) => {
  const puede = wallet.balance >= mkt.puntos;
  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 480 }}>
        <div className="modal-head">
          <h3 style={{ margin: 0, fontSize: 16 }}>Confirmar canje</h3>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body" style={{ textAlign: 'center', padding: '24px 20px' }}>
          <div style={{ fontSize: 48 }}>{mkt.emoji}</div>
          <h3 style={{ margin: '8px 0 4px' }}>{mkt.nombre}</h3>
          <div className="muted" style={{ fontSize: 13, marginBottom: 16 }}>{mkt.descripcion}</div>

          <div style={{ background: 'var(--surface)', borderRadius: 10, padding: 14, marginBottom: 12 }}>
            <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 13, marginBottom: 6 }}>
              <span className="muted">Saldo actual</span>
              <span className="mono"><b>{wallet.balance}</b> pts</span>
            </div>
            <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 13, marginBottom: 6 }}>
              <span className="muted">Costo del producto</span>
              <span className="mono" style={{ color: 'var(--rose-600)' }}><b>−{mkt.puntos}</b> pts</span>
            </div>
            <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 14, paddingTop: 8, borderTop: '1px solid var(--border)' }}>
              <span style={{ fontWeight: 600 }}>Saldo restante</span>
              <span className="mono" style={{ fontWeight: 700, color: puede ? 'var(--green-600)' : 'var(--rose-600)' }}>{wallet.balance - mkt.puntos} pts</span>
            </div>
          </div>

          {!puede && (
            <div style={{ background: '#FDEEEE', color: 'var(--rose-600)', padding: 10, borderRadius: 6, fontSize: 12.5 }}>
              Saldo insuficiente · te faltan {mkt.puntos - wallet.balance} puntos.
            </div>
          )}
        </div>
        <div className="modal-foot">
          <button className="btn" onClick={onClose}>Cancelar</button>
          <button className="btn primary" disabled={!puede} onClick={onConfirm}>
            <IconCheck size={13} /> Confirmar canje
          </button>
        </div>
      </div>
    </div>
  );
};

const ReconocimientoModal = ({ empleados, valores, me, onClose, onSend, isAdmin }) => {
  const [paraId, setParaId] = _bn_useState('');
  const [valorId, setValorId] = _bn_useState(valores[0]?.id || '');
  const [mensaje, setMensaje] = _bn_useState('');
  const [puntos, setPuntos]   = _bn_useState(100);

  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const valido = paraId && valorId && mensaje.trim().length >= 10;
  const candidatos = empleados.filter(e => !me || e.id !== me.id);

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 580 }}>
        <div className="modal-head">
          <h3 style={{ margin: 0, fontSize: 16 }}>Reconocer a un colega</h3>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body">
          <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
            <div>
              <label style={{ fontSize: 12, fontWeight: 600, marginBottom: 6, display: 'block' }}>¿A quién?</label>
              <select value={paraId} onChange={e => setParaId(e.target.value)} style={{ width: '100%', padding: 8, fontSize: 13, border: '1px solid var(--border)', borderRadius: 6 }}>
                <option value="">— Seleccionar colega —</option>
                {candidatos.map(e => <option key={e.id} value={e.id}>{e.nombre} · {e.area}</option>)}
              </select>
            </div>

            <div>
              <label style={{ fontSize: 12, fontWeight: 600, marginBottom: 6, display: 'block' }}>Valor que representa</label>
              <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(140px, 1fr))', gap: 8 }}>
                {valores.map(v => (
                  <button key={v.id} className={`bn-chip ${valorId === v.id ? 'active' : ''}`} onClick={() => setValorId(v.id)} style={{ justifyContent: 'flex-start' }}>
                    {v.emoji} {v.nombre}
                  </button>
                ))}
              </div>
              {valorId && <div className="muted" style={{ fontSize: 11.5, marginTop: 6 }}>{valores.find(v => v.id === valorId)?.desc}</div>}
            </div>

            <div>
              <label style={{ fontSize: 12, fontWeight: 600, marginBottom: 6, display: 'block' }}>Mensaje (mínimo 10 caracteres)</label>
              <textarea
                value={mensaje}
                onChange={e => setMensaje(e.target.value)}
                placeholder="Describe la acción concreta que quieres reconocer…"
                style={{ width: '100%', minHeight: 80, padding: 10, fontSize: 13, fontFamily: 'inherit', border: '1px solid var(--border)', borderRadius: 6, resize: 'vertical' }}
              />
            </div>

            {isAdmin && (
              <div>
                <label style={{ fontSize: 12, fontWeight: 600, marginBottom: 6, display: 'block' }}>Puntos al wallet del receptor</label>
                <div style={{ display: 'flex', gap: 8 }}>
                  {[50, 100, 150, 200, 300].map(p => (
                    <button key={p} className={`bn-chip ${puntos === p ? 'active' : ''}`} onClick={() => setPuntos(p)}>{p} pts</button>
                  ))}
                </div>
              </div>
            )}
          </div>
        </div>
        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5 }}>{valido ? '✓ Listo para enviar' : 'Completa los campos'}</span>
          <div style={{ display: 'flex', gap: 8 }}>
            <button className="btn" onClick={onClose}>Cancelar</button>
            <button className="btn primary" disabled={!valido} onClick={() => onSend(paraId, valorId, mensaje, puntos)}>
              <IconStar size={13} /> Enviar reconocimiento
            </button>
          </div>
        </div>
      </div>
    </div>
  );
};

const SolicitudModal = ({ solicitud, beneficios, empleados, onClose, onAprobar, onRechazar }) => {
  const [motivo, setMotivo] = _bn_useState('');
  const e = empleados.find(x => x.id === solicitud.empleadoId);
  const b = beneficios.find(x => x.id === solicitud.beneficioId);

  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (ev) => { if (ev.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const pendiente = solicitud.estado === 'pendiente';

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={ev => ev.stopPropagation()} style={{ maxWidth: 580 }}>
        <div className="modal-head">
          <h3 style={{ margin: 0, fontSize: 16 }}>Solicitud {solicitud.id}</h3>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body">
          <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 14 }}>
            <div className="doc-avatar" style={{ width: 42, height: 42 }}>{e?.iniciales}</div>
            <div>
              <div style={{ fontWeight: 600 }}>{e?.nombre}</div>
              <div className="muted" style={{ fontSize: 12 }}>{e?.area} · {e?.sede}</div>
            </div>
            <div style={{ marginLeft: 'auto' }}><EstadoPill estado={solicitud.estado} /></div>
          </div>

          <div style={{ background: 'var(--surface)', borderRadius: 10, padding: 14, marginBottom: 14 }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 10 }}>
              <span style={{ fontSize: 28 }}>{b?.emoji}</span>
              <div>
                <div style={{ fontWeight: 600 }}>{b?.nombre}</div>
                <div className="muted" style={{ fontSize: 12 }}>{b?.proveedor} · {fmtCOP(b?.costoEmpresa)} costo empresa</div>
              </div>
            </div>
            <div style={{ fontSize: 13, fontStyle: 'italic', borderLeft: '3px solid var(--navy-800)', paddingLeft: 10 }}>"{solicitud.comentario}"</div>
          </div>

          <div style={{ fontSize: 12.5 }}>
            <div className="muted">Solicitado: <span className="mono" style={{ color: 'var(--text)' }}>{solicitud.fechaSolicitud}</span></div>
            <div className="muted" style={{ marginTop: 4 }}>SLA hasta: <span className="mono" style={{ color: 'var(--text)' }}>{solicitud.vencimientoSLA}</span></div>
            {solicitud.aprobador && <div className="muted" style={{ marginTop: 4 }}>Resuelto por: <b style={{ color: 'var(--text)' }}>{solicitud.aprobador}</b></div>}
            {solicitud.fechaResolucion && <div className="muted" style={{ marginTop: 4 }}>Fecha resolución: <span className="mono" style={{ color: 'var(--text)' }}>{solicitud.fechaResolucion}</span></div>}
          </div>

          {pendiente && (
            <div style={{ marginTop: 14 }}>
              <label style={{ fontSize: 12, fontWeight: 600, marginBottom: 6, display: 'block' }}>Motivo (opcional · solo si rechazas)</label>
              <textarea
                value={motivo}
                onChange={ev => setMotivo(ev.target.value)}
                placeholder="Razón del rechazo…"
                style={{ width: '100%', minHeight: 60, padding: 10, fontSize: 13, fontFamily: 'inherit', border: '1px solid var(--border)', borderRadius: 6, resize: 'vertical' }}
              />
            </div>
          )}
        </div>
        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5 }}>SLA · {b?.sla}h</span>
          <div style={{ display: 'flex', gap: 8 }}>
            <button className="btn" onClick={onClose}>Cerrar</button>
            {pendiente && (
              <React.Fragment>
                <button className="btn" onClick={() => onRechazar(motivo)} style={{ color: 'var(--rose-600)' }}>Rechazar</button>
                <button className="btn primary" onClick={onAprobar}><IconCheck size={13} /> Aprobar</button>
              </React.Fragment>
            )}
          </div>
        </div>
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── EDITOR DE BENEFICIO (crear / editar) ──────────────────────────
// ══════════════════════════════════════════════════════════════════════
const EMOJIS_SUGERIDOS = ['🎁','🩺','💊','🥗','🍽️','☕','💰','🏠','🧘','💪','🧠','🎂','👶','🎒','🎪','🎓','📚','🌴','🌅','🌟','🏅','🎉','🤝','📞','👓','🕯️','🤸','💝','🛒','🎬'];

const BeneficioEditorModal = ({ beneficio, categorias, cargos, onClose, onSave }) => {
  const esEdicion = !!beneficio;
  const [form, setForm] = _bn_useState(() => beneficio ? { ...beneficio, elegMin: { ...(beneficio.elegMin || {}) } } : {
    nombre: '', categoriaId: categorias[0]?.id || '', emoji: '🎁',
    descripcion: '', proveedor: 'Atica',
    costoEmpresa: 0, costoEmpleado: 0, puntos: 0,
    modalidad: 'mensual', trigger: 'solicitud', sla: 48, vigencia: 'permanente',
    elegMin: { antiguedadMeses: 0 },
    esAutomatico: false, destacado: false, faq: '',
  });

  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const set = (k, v) => setForm(f => ({ ...f, [k]: v }));
  const setEleg = (k, v) => setForm(f => ({ ...f, elegMin: { ...f.elegMin, [k]: v } }));
  const toggleEleg = (k, v) => setForm(f => {
    const next = { ...f.elegMin };
    if (next[k]) delete next[k]; else next[k] = v;
    return { ...f, elegMin: next };
  });

  // Normaliza arrays separados por coma para áreas y sedes
  const asArray = (s) => s ? s.split(',').map(x => x.trim()).filter(Boolean) : null;

  const valido = form.nombre.trim().length >= 4 && form.descripcion.trim().length >= 10 && form.categoriaId && form.proveedor.trim();

  const handleSave = () => {
    // Normaliza tipos numéricos
    const datos = {
      ...form,
      costoEmpresa: Number(form.costoEmpresa) || 0,
      costoEmpleado: Number(form.costoEmpleado) || 0,
      puntos: Number(form.puntos) || 0,
      sla: Number(form.sla) || 0,
      // elegMin ya está estructurado por los toggles
    };
    onSave(datos);
  };

  const niveles = ['operativo', 'técnico', 'liderazgo', 'directivo'];
  const areasUnicas = Array.from(new Set((cargos || []).map(c => c.area)));

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 760 }}>
        <div className="modal-head">
          <div>
            <h3 style={{ margin: 0, fontSize: 17 }}>{esEdicion ? 'Editar beneficio' : 'Nuevo beneficio'}</h3>
            <div className="muted" style={{ fontSize: 12.5, marginTop: 2 }}>
              {esEdicion ? `${beneficio.id} · ${beneficio.nombre}` : 'Configura los datos del nuevo beneficio del catálogo.'}
            </div>
          </div>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body">
          <div className="bn-editor-grid">
            {/* Datos básicos */}
            <div className="full">
              <label>Nombre del beneficio</label>
              <input type="text" value={form.nombre} onChange={e => set('nombre', e.target.value)} placeholder="Ej. Auxilio educativo SENA" />
            </div>

            <div>
              <label>Categoría</label>
              <select value={form.categoriaId} onChange={e => set('categoriaId', e.target.value)}>
                {categorias.map(c => <option key={c.id} value={c.id}>{c.emoji} {c.nombre}</option>)}
              </select>
            </div>
            <div>
              <label>Proveedor</label>
              <input type="text" value={form.proveedor} onChange={e => set('proveedor', e.target.value)} placeholder="Ej. ARL Sura" />
            </div>

            <div className="full">
              <label>Emoji visual</label>
              <div className="bn-editor-emoji">
                {EMOJIS_SUGERIDOS.map(e => (
                  <button key={e} type="button" className={form.emoji === e ? 'active' : ''} onClick={() => set('emoji', e)}>{e}</button>
                ))}
              </div>
            </div>

            <div className="full">
              <label>Descripción corta</label>
              <textarea value={form.descripcion} onChange={e => set('descripcion', e.target.value)} placeholder="Describe en 1-2 oraciones de qué se trata el beneficio." />
            </div>

            <div className="full">
              <label>FAQ / cómo se usa</label>
              <textarea value={form.faq} onChange={e => set('faq', e.target.value)} placeholder="Cómo el colaborador accede o redime el beneficio." />
            </div>

            {/* Costos y puntos */}
            <div>
              <label>Costo empresa (mensual COP)</label>
              <input type="number" min="0" step="1000" value={form.costoEmpresa} onChange={e => set('costoEmpresa', e.target.value)} />
              <div className="hint">Pon 0 si es un beneficio sin costo directo.</div>
            </div>
            <div>
              <label>Costo empleado (COP)</label>
              <input type="number" min="0" step="1000" value={form.costoEmpleado} onChange={e => set('costoEmpleado', e.target.value)} />
              <div className="hint">Por ejemplo en casino subsidiado.</div>
            </div>

            <div>
              <label>Puntos al wallet (al recibirlo)</label>
              <input type="number" min="0" step="50" value={form.puntos} onChange={e => set('puntos', e.target.value)} />
              <div className="hint">Solo si el beneficio gamifica.</div>
            </div>
            <div>
              <label>SLA aprobación (horas)</label>
              <input type="number" min="0" step="1" value={form.sla} onChange={e => set('sla', e.target.value)} />
            </div>

            {/* Modalidad y disparador */}
            <div>
              <label>Modalidad</label>
              <select value={form.modalidad} onChange={e => set('modalidad', e.target.value)}>
                <option value="mensual">Mensual recurrente</option>
                <option value="anual">Anual recurrente</option>
                <option value="unico">Único · una sola vez</option>
                <option value="evento">Por evento</option>
              </select>
            </div>
            <div>
              <label>Disparador</label>
              <select value={form.trigger} onChange={e => set('trigger', e.target.value)}>
                <option value="solicitud">Por solicitud del colaborador</option>
                <option value="auto-ingreso">Automático al ingreso</option>
                <option value="auto-cumple">Automático en cumpleaños</option>
                <option value="auto-aniv">Automático en aniversario laboral</option>
                <option value="auto-ascenso">Automático en ascenso</option>
                <option value="canje-puntos">Canje en marketplace</option>
              </select>
            </div>

            <div className="full">
              <label>Vigencia</label>
              <input type="text" value={form.vigencia} onChange={e => set('vigencia', e.target.value)} placeholder="Ej. permanente · anual · evento" />
            </div>

            {/* Reglas de elegibilidad */}
            <div className="full">
              <label style={{ marginBottom: 8 }}>Reglas de elegibilidad</label>
              <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
                <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
                  <span className="muted" style={{ fontSize: 12.5, minWidth: 130 }}>Antigüedad mínima:</span>
                  <input type="number" min="0" step="1" value={form.elegMin.antiguedadMeses ?? 0}
                         onChange={e => setEleg('antiguedadMeses', Math.max(0, parseInt(e.target.value, 10) || 0))}
                         style={{ width: 90 }} />
                  <span className="muted" style={{ fontSize: 12.5 }}>meses</span>
                </div>
                <label className="bn-editor-toggle">
                  <input type="checkbox"
                         checked={!!form.elegMin.niveles}
                         onChange={e => toggleEleg('niveles', niveles)} />
                  Restringir por nivel
                </label>
                {form.elegMin.niveles && (
                  <div style={{ paddingLeft: 26, display: 'flex', gap: 6, flexWrap: 'wrap' }}>
                    {niveles.map(n => {
                      const on = form.elegMin.niveles.includes(n);
                      return (
                        <button key={n} className={`bn-chip ${on ? 'active' : ''}`}
                                onClick={() => setEleg('niveles', on ? form.elegMin.niveles.filter(x => x !== n) : [...form.elegMin.niveles, n])}>
                          {n}
                        </button>
                      );
                    })}
                  </div>
                )}
                <label className="bn-editor-toggle">
                  <input type="checkbox"
                         checked={!!form.elegMin.areas}
                         onChange={e => toggleEleg('areas', areasUnicas)} />
                  Restringir por área
                </label>
                {form.elegMin.areas && (
                  <input type="text"
                         value={form.elegMin.areas.join(', ')}
                         onChange={e => setEleg('areas', asArray(e.target.value) || [])}
                         placeholder="Operaciones, Aprovechamiento, Calidad" style={{ marginLeft: 26 }} />
                )}
                <label className="bn-editor-toggle">
                  <input type="checkbox"
                         checked={!!form.elegMin.sedes}
                         onChange={e => toggleEleg('sedes', ['Cali'])} />
                  Restringir por sede
                </label>
                {form.elegMin.sedes && (
                  <input type="text"
                         value={form.elegMin.sedes.join(', ')}
                         onChange={e => setEleg('sedes', asArray(e.target.value) || [])}
                         placeholder="Cali, Barranquilla" style={{ marginLeft: 26 }} />
                )}
              </div>
            </div>

            {/* Flags */}
            <label className="bn-editor-toggle">
              <input type="checkbox" checked={!!form.esAutomatico} onChange={e => set('esAutomatico', e.target.checked)} />
              Asignación automática (sin solicitud)
            </label>
            <label className="bn-editor-toggle">
              <input type="checkbox" checked={!!form.destacado} onChange={e => set('destacado', e.target.checked)} />
              Destacado en el catálogo del colaborador
            </label>
          </div>
        </div>
        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5 }}>
            {esEdicion
              ? <span><IconCheck size={11} /> Editando {beneficio.id}</span>
              : valido ? <span><IconCheck size={11} /> Listo para crear</span> : 'Completa nombre, descripción y proveedor.'}
          </span>
          <div style={{ display: 'flex', gap: 8 }}>
            <button className="btn" onClick={onClose}>Cancelar</button>
            <button className="btn primary" disabled={!valido} onClick={handleSave}>
              <IconCheck size={13} /> {esEdicion ? 'Guardar cambios' : 'Crear beneficio'}
            </button>
          </div>
        </div>
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── EDITOR DE PRODUCTO MARKETPLACE (crear / editar) ───────────────
// ══════════════════════════════════════════════════════════════════════
const EMOJIS_MKT = ['🛒','🎬','💪','🛍️','🌴','🥤','☕','💝','🎓','🍿','🏋️','👕','🎁','📚','🍔','🎟️','🏖️','🎧','📱','💼'];

const ProductoEditorModal = ({ producto, categorias, onClose, onSave }) => {
  const esEdicion = !!producto;
  const [form, setForm] = _bn_useState(() => producto ? { ...producto } : {
    nombre: '', emoji: '🛒', puntos: 100, stock: 10,
    categoria: categorias[0]?.id || 'cat-tiempo',
    descripcion: '',
  });

  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const set = (k, v) => setForm(f => ({ ...f, [k]: v }));
  const valido = form.nombre.trim().length >= 4 && form.descripcion.trim().length >= 10 && form.puntos > 0 && form.stock >= 0;

  const handleSave = () => {
    onSave({
      ...form,
      puntos: Number(form.puntos) || 0,
      stock: Number(form.stock) || 0,
    });
  };

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 580 }}>
        <div className="modal-head">
          <div>
            <h3 style={{ margin: 0, fontSize: 17 }}>{esEdicion ? 'Editar producto' : 'Nuevo producto del marketplace'}</h3>
            <div className="muted" style={{ fontSize: 12.5, marginTop: 2 }}>
              {esEdicion ? `${producto.id} · ${producto.nombre}` : 'Producto canjeable por puntos del wallet.'}
            </div>
          </div>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body">
          <div className="bn-editor-grid">
            <div className="full">
              <label>Nombre</label>
              <input type="text" value={form.nombre} onChange={e => set('nombre', e.target.value)} placeholder="Ej. Voucher Olímpica $30.000" />
            </div>

            <div className="full">
              <label>Emoji visual</label>
              <div className="bn-editor-emoji">
                {EMOJIS_MKT.map(e => (
                  <button key={e} type="button" className={form.emoji === e ? 'active' : ''} onClick={() => set('emoji', e)}>{e}</button>
                ))}
              </div>
            </div>

            <div className="full">
              <label>Descripción</label>
              <textarea value={form.descripcion} onChange={e => set('descripcion', e.target.value)} placeholder="Qué incluye el producto y cómo se redime." />
            </div>

            <div>
              <label>Categoría</label>
              <select value={form.categoria} onChange={e => set('categoria', e.target.value)}>
                {categorias.map(c => <option key={c.id} value={c.id}>{c.emoji} {c.nombre}</option>)}
              </select>
            </div>
            <div>
              <label>Puntos requeridos</label>
              <input type="number" min="0" step="50" value={form.puntos} onChange={e => set('puntos', e.target.value)} />
              <div className="hint">Costo en puntos del wallet del colaborador.</div>
            </div>

            <div>
              <label>Stock disponible</label>
              <input type="number" min="0" step="1" value={form.stock} onChange={e => set('stock', e.target.value)} />
              <div className="hint">Cantidad inicial · puede ser un número alto si es ilimitado (ej. 999).</div>
            </div>
          </div>
        </div>
        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5 }}>
            {esEdicion
              ? <span><IconCheck size={11} /> Editando {producto.id}</span>
              : valido ? <span><IconCheck size={11} /> Listo para crear</span> : 'Completa nombre y descripción.'}
          </span>
          <div style={{ display: 'flex', gap: 8 }}>
            <button className="btn" onClick={onClose}>Cancelar</button>
            <button className="btn primary" disabled={!valido} onClick={handleSave}>
              <IconCheck size={13} /> {esEdicion ? 'Guardar cambios' : 'Crear producto'}
            </button>
          </div>
        </div>
      </div>
    </div>
  );
};

// ══════════════════════════════════════════════════════════════════════
// ─── EDITOR DE CAMPAÑA DE BIENESTAR (crear / editar) ───────────────
// ══════════════════════════════════════════════════════════════════════
const EMOJIS_CAMP = ['❤️','🩺','📚','🎀','💵','🎪','🏃','🌱','💆','🧠','☀️','🎯','🤝','🌈','🌳','🌟','🎨','📅'];

const CampanaEditorModal = ({ campana, beneficios, onClose, onSave }) => {
  const esEdicion = !!campana;
  const [form, setForm] = _bn_useState(() => campana ? { ...campana } : {
    nombre: '', emoji: '🎯',
    fechaInicio: '', fechaFin: '',
    audiencia: 'Toda la operación',
    presupuesto: 0,
    descripcion: '',
    beneficiosAsociados: [],
    estado: 'planificada',
    meta: 100,
  });

  _bn_useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const set = (k, v) => setForm(f => ({ ...f, [k]: v }));
  const toggleBeneficio = (id) => {
    setForm(f => {
      const has = f.beneficiosAsociados.includes(id);
      return { ...f, beneficiosAsociados: has ? f.beneficiosAsociados.filter(x => x !== id) : [...f.beneficiosAsociados, id] };
    });
  };

  const valido = form.nombre.trim().length >= 4 && form.descripcion.trim().length >= 10 && form.fechaInicio && form.fechaFin;

  const handleSave = () => {
    onSave({
      ...form,
      presupuesto: Number(form.presupuesto) || 0,
      meta: Number(form.meta) || 100,
    });
  };

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 720 }}>
        <div className="modal-head">
          <div>
            <h3 style={{ margin: 0, fontSize: 17 }}>{esEdicion ? 'Editar campaña' : 'Nueva campaña de bienestar'}</h3>
            <div className="muted" style={{ fontSize: 12.5, marginTop: 2 }}>
              {esEdicion ? `${campana.id} · ${campana.nombre}` : 'Define audiencia, presupuesto y beneficios asociados.'}
            </div>
          </div>
          <button className="modal-close" onClick={onClose}>×</button>
        </div>
        <div className="modal-body">
          <div className="bn-editor-grid">
            <div className="full">
              <label>Nombre de la campaña</label>
              <input type="text" value={form.nombre} onChange={e => set('nombre', e.target.value)} placeholder="Ej. Mes de la salud cardíaca" />
            </div>

            <div className="full">
              <label>Emoji visual</label>
              <div className="bn-editor-emoji">
                {EMOJIS_CAMP.map(e => (
                  <button key={e} type="button" className={form.emoji === e ? 'active' : ''} onClick={() => set('emoji', e)}>{e}</button>
                ))}
              </div>
            </div>

            <div>
              <label>Fecha de inicio</label>
              {window.DatePickerCO ? (
                <DatePickerCO value={form.fechaInicio} onChange={v => set('fechaInicio', v)} placeholder="DD/MM/AAAA" />
              ) : (
                <input type="text" value={form.fechaInicio} onChange={e => set('fechaInicio', e.target.value)} placeholder="DD/MM/AAAA" />
              )}
            </div>
            <div>
              <label>Fecha de fin</label>
              {window.DatePickerCO ? (
                <DatePickerCO value={form.fechaFin} onChange={v => set('fechaFin', v)} placeholder="DD/MM/AAAA" />
              ) : (
                <input type="text" value={form.fechaFin} onChange={e => set('fechaFin', e.target.value)} placeholder="DD/MM/AAAA" />
              )}
            </div>

            <div>
              <label>Estado</label>
              <select value={form.estado} onChange={e => set('estado', e.target.value)}>
                <option value="planificada">Planificada</option>
                <option value="activa">Activa</option>
                <option value="finalizada">Finalizada</option>
              </select>
            </div>
            <div>
              <label>Audiencia</label>
              <input type="text" value={form.audiencia} onChange={e => set('audiencia', e.target.value)} placeholder="Ej. Toda la operación · Mujeres · Liderazgo" />
            </div>

            <div>
              <label>Presupuesto (COP)</label>
              <input type="number" min="0" step="100000" value={form.presupuesto} onChange={e => set('presupuesto', e.target.value)} />
            </div>
            <div>
              <label>Meta de participantes</label>
              <input type="number" min="0" step="10" value={form.meta} onChange={e => set('meta', e.target.value)} />
              <div className="hint">Cuántas personas esperan que participen.</div>
            </div>

            <div className="full">
              <label>Descripción</label>
              <textarea value={form.descripcion} onChange={e => set('descripcion', e.target.value)} placeholder="Actividades planeadas, charlas, talleres, jornadas." />
            </div>

            <div className="full">
              <label>Beneficios asociados ({form.beneficiosAsociados.length} seleccionados)</label>
              <div style={{ maxHeight: 180, overflow: 'auto', border: '1px solid var(--border)', borderRadius: 6, padding: 10, background: 'white' }}>
                <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(220px, 1fr))', gap: 6 }}>
                  {beneficios.map(b => {
                    const on = form.beneficiosAsociados.includes(b.id);
                    return (
                      <label key={b.id} style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '6px 8px', borderRadius: 6, cursor: 'pointer',
                        background: on ? 'var(--navy-50, #EEF1F8)' : 'transparent', border: '1px solid ' + (on ? 'var(--navy-800)' : 'transparent') }}>
                        <input type="checkbox" checked={on} onChange={() => toggleBeneficio(b.id)} style={{ margin: 0 }} />
                        <span style={{ fontSize: 16 }}>{b.emoji}</span>
                        <span style={{ fontSize: 12, fontWeight: 500 }}>{b.nombre}</span>
                      </label>
                    );
                  })}
                </div>
              </div>
              <div className="hint">Estos beneficios se promoverán durante la campaña.</div>
            </div>
          </div>
        </div>
        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 11.5 }}>
            {esEdicion
              ? <span><IconCheck size={11} /> Editando {campana.id}</span>
              : valido ? <span><IconCheck size={11} /> Listo para crear</span> : 'Completa nombre, descripción y fechas.'}
          </span>
          <div style={{ display: 'flex', gap: 8 }}>
            <button className="btn" onClick={onClose}>Cancelar</button>
            <button className="btn primary" disabled={!valido} onClick={handleSave}>
              <IconCheck size={13} /> {esEdicion ? 'Guardar cambios' : 'Crear campaña'}
            </button>
          </div>
        </div>
      </div>
    </div>
  );
};

window.Benefits = Benefits;
