/* global React, Icon, formatCOP, formatCompactCOP, Switch, EstadoPill, LegalDot,
   VENTURES, CAMPAIGNS, DEALS, STAGES, STAGE_PROB, CHANNELS, CHANNEL_COLOR,
   ventureName, ventureIcon */
const { useState: useStateC, useMemo: useMemoC } = React;

/* Filter chips reused by both centers */
function ScopeChips({ scope, setScope, ids }) {
  const opts = [{ id: "all", name: "Todos los ventures", icon: "LayoutGrid" }]
    .concat(ids.map((id) => ({ id, name: ventureName(id), icon: ventureIcon(id) })));
  return (
    <div className="flex flex-wrap gap-2">
      {opts.map((o) => {
        const active = scope === o.id;
        return (
          <button key={o.id} onClick={() => setScope(o.id)}
            className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-xs font-semibold transition ${active ? "bg-taupe-900 text-white" : "bg-white text-taupe-600 ring-1 ring-taupe-200 hover:bg-taupe-50"}`}>
            <Icon name={o.icon} size={13} />
            {o.name}
          </button>
        );
      })}
    </div>
  );
}

function CenterKpi({ label, value, sub, accent }) {
  return (
    <div className="rounded-xl bg-white p-4 ring-1 ring-taupe-200/70 shadow-sm">
      <div className="font-mono text-[10px] uppercase tracking-[0.14em] text-taupe-400">{label}</div>
      <div className="mt-2 text-[22px] font-extrabold leading-none tracking-tight text-taupe-900">{value}</div>
      {sub && <div className={`mt-1.5 text-xs ${accent || "text-taupe-500"}`}>{sub}</div>}
    </div>
  );
}

function Stepper({ value, onChange, step = 500_000 }) {
  return (
    <div className="inline-flex items-center gap-1.5 rounded-lg bg-taupe-50 p-0.5 ring-1 ring-taupe-200">
      <button onClick={() => onChange(Math.max(0, value - step))}
        className="grid h-6 w-6 place-items-center rounded-md text-taupe-600 hover:bg-white">
        <Icon name="Minus" size={13} />
      </button>
      <span className="min-w-[58px] text-center text-xs font-bold tabular-nums text-taupe-800">{formatCompactCOP(value)}</span>
      <button onClick={() => onChange(value + step)}
        className="grid h-6 w-6 place-items-center rounded-md text-taupe-600 hover:bg-white">
        <Icon name="Plus" size={13} />
      </button>
    </div>
  );
}

/* ============================== MARKETING =============================== */
function MarketingCenter({ scope, setScope }) {
  const [camps, setCamps] = useStateC(() => CAMPAIGNS.map((c) => ({ ...c })));
  const ids = useMemoC(() => [...new Set(CAMPAIGNS.map((c) => c.venture))], []);
  const shown = camps.filter((c) => scope === "all" || c.venture === scope);

  const activas = shown.filter((c) => c.activa);
  const presupuesto = activas.reduce((a, c) => a + c.presupuesto, 0);
  const leads = activas.reduce((a, c) => a + c.leads, 0);
  const cpl = leads ? presupuesto / leads : 0;

  const byChannel = CHANNELS.map((ch) => ({
    canal: ch,
    leads: activas.filter((c) => c.canal === ch).reduce((a, c) => a + c.leads, 0),
  })).filter((x) => x.leads > 0).sort((a, b) => b.leads - a.leads);
  const maxCh = Math.max(1, ...byChannel.map((x) => x.leads));

  const update = (id, patch) => setCamps((cs) => cs.map((c) => (c.id === id ? { ...c, ...patch } : c)));

  return (
    <div className="space-y-6">
      <div>
        <h2 className="text-xl font-extrabold tracking-tight text-taupe-900">Marketing — control central</h2>
        <p className="text-xs text-taupe-500">Activa campañas, ajusta presupuestos y mide leads de todos los ventures en un solo lugar.</p>
      </div>
      <ScopeChips scope={scope} setScope={setScope} ids={ids} />

      <div className="grid gap-4 sm:grid-cols-2 xl:grid-cols-4">
        <CenterKpi label="Inversión activa / mes" value={formatCompactCOP(presupuesto)} sub={formatCOP(presupuesto)} />
        <CenterKpi label="Leads del mes" value={leads} sub={`${activas.length} campañas activas`} accent="text-emerald-600" />
        <CenterKpi label="Costo por lead" value={cpl ? formatCompactCOP(Math.round(cpl)) : "—"} sub="Promedio ponderado" />
        <CenterKpi label="Campañas" value={`${activas.length} / ${shown.length}`} sub="Activas / totales" />
      </div>

      <div className="grid gap-6 xl:grid-cols-[1.6fr_1fr]">
        {/* Campaign control table */}
        <div className="overflow-hidden rounded-xl bg-white ring-1 ring-taupe-200/70 shadow-sm">
          <div className="border-b border-taupe-100 px-5 py-3.5">
            <h3 className="font-bold tracking-tight text-taupe-900">Campañas</h3>
          </div>
          <div className="overflow-x-auto hide-scrollbar">
            <table className="w-full min-w-[640px] text-sm">
              <thead>
                <tr className="border-b border-taupe-100 text-left font-mono text-[10px] uppercase tracking-[0.1em] text-taupe-400">
                  <th className="px-5 py-2.5 font-medium">Campaña</th>
                  <th className="px-3 py-2.5 font-medium">Canal</th>
                  <th className="px-3 py-2.5 font-medium">Presupuesto / mes</th>
                  <th className="px-3 py-2.5 font-medium text-right">Leads</th>
                  <th className="px-5 py-2.5 font-medium text-right">Activa</th>
                </tr>
              </thead>
              <tbody>
                {shown.map((c) => (
                  <tr key={c.id} className={`border-b border-taupe-50 transition ${c.activa ? "" : "opacity-55"}`}>
                    <td className="px-5 py-3">
                      <div className="font-semibold text-taupe-900">{c.nombre}</div>
                      <div className="flex items-center gap-1 text-xs text-taupe-400">
                        <Icon name={ventureIcon(c.venture)} size={11} /> {ventureName(c.venture)}
                      </div>
                    </td>
                    <td className="px-3 py-3">
                      <span className="inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[11px] font-semibold text-white" style={{ background: CHANNEL_COLOR[c.canal] }}>
                        {c.canal}
                      </span>
                    </td>
                    <td className="px-3 py-3"><Stepper value={c.presupuesto} onChange={(v) => update(c.id, { presupuesto: v })} /></td>
                    <td className="px-3 py-3 text-right font-semibold tabular-nums text-taupe-800">{c.leads}</td>
                    <td className="px-5 py-3 text-right"><div className="flex justify-end"><Switch checked={c.activa} onChange={(v) => update(c.id, { activa: v })} /></div></td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

        {/* Channel breakdown */}
        <div className="rounded-xl bg-white p-5 ring-1 ring-taupe-200/70 shadow-sm">
          <h3 className="font-bold tracking-tight text-taupe-900">Leads por canal</h3>
          <p className="mb-4 text-xs text-taupe-400">Solo campañas activas</p>
          <div className="space-y-3.5">
            {byChannel.length === 0 && <div className="text-sm text-taupe-400">Sin campañas activas en este filtro.</div>}
            {byChannel.map((x) => (
              <div key={x.canal}>
                <div className="mb-1 flex items-center justify-between text-xs">
                  <span className="font-medium text-taupe-700">{x.canal}</span>
                  <span className="font-mono font-bold text-taupe-500">{x.leads}</span>
                </div>
                <div className="h-2.5 overflow-hidden rounded-full bg-taupe-50">
                  <div className="h-full rounded-full" style={{ width: `${(x.leads / maxCh) * 100}%`, background: CHANNEL_COLOR[x.canal] }} />
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

/* ============================== VENTAS / CRM ============================ */
function VentasCenter({ scope, setScope }) {
  const [deals, setDeals] = useStateC(() => DEALS.map((d) => ({ ...d })));
  const ids = useMemoC(() => [...new Set(DEALS.map((d) => d.venture))], []);
  const shown = deals.filter((d) => scope === "all" || d.venture === scope);

  const abiertos = shown.filter((d) => d.etapa !== "Cerrado");
  const pipeline = abiertos.reduce((a, d) => a + d.valor, 0);
  const ponderado = abiertos.reduce((a, d) => a + d.valor * STAGE_PROB[d.etapa], 0);
  const cerrados = shown.filter((d) => d.etapa === "Cerrado");
  const valorCerrado = cerrados.reduce((a, d) => a + d.valor, 0);

  const move = (id, dir) => setDeals((ds) => ds.map((d) => {
    if (d.id !== id) return d;
    const i = STAGES.indexOf(d.etapa);
    const ni = Math.min(STAGES.length - 1, Math.max(0, i + dir));
    return { ...d, etapa: STAGES[ni] };
  }));

  return (
    <div className="space-y-6">
      <div>
        <h2 className="text-xl font-extrabold tracking-tight text-taupe-900">Ventas / CRM — pipeline global</h2>
        <p className="text-xs text-taupe-500">Mueve los negocios entre etapas y controla el pipeline de todos los ventures.</p>
      </div>
      <ScopeChips scope={scope} setScope={setScope} ids={ids} />

      <div className="grid gap-4 sm:grid-cols-2 xl:grid-cols-4">
        <CenterKpi label="Pipeline abierto" value={formatCompactCOP(pipeline)} sub={`${abiertos.length} negocios abiertos`} />
        <CenterKpi label="Valor ponderado" value={formatCompactCOP(Math.round(ponderado))} sub="Por probabilidad de etapa" accent="text-amber-600" />
        <CenterKpi label="Cerrado este mes" value={formatCompactCOP(valorCerrado)} sub={`${cerrados.length} negocios ganados`} accent="text-emerald-600" />
        <CenterKpi label="Conversión" value={`${shown.length ? Math.round((cerrados.length / shown.length) * 100) : 0}%`} sub="Cerrados / total" />
      </div>

      {/* Kanban */}
      <div className="overflow-x-auto hide-scrollbar">
        <div className="grid min-w-[860px] grid-cols-5 gap-3">
          {STAGES.map((stage) => {
            const col = shown.filter((d) => d.etapa === stage);
            const total = col.reduce((a, d) => a + d.valor, 0);
            return (
              <div key={stage} className="rounded-xl bg-taupe-50/80 p-2.5 ring-1 ring-taupe-200/60">
                <div className="mb-2 flex items-center justify-between px-1">
                  <span className="text-xs font-bold text-taupe-700">{stage}</span>
                  <span className="font-mono text-[10px] text-taupe-400">{col.length}</span>
                </div>
                <div className="mb-2 px-1 font-mono text-[10px] text-taupe-400">{formatCompactCOP(total)}</div>
                <div className="space-y-2">
                  {col.map((d) => {
                    const i = STAGES.indexOf(d.etapa);
                    return (
                      <div key={d.id} className="rounded-lg bg-white p-3 shadow-sm ring-1 ring-taupe-200/70">
                        <div className="text-sm font-semibold leading-tight text-taupe-900">{d.cliente}</div>
                        <div className="mt-0.5 flex items-center gap-1 text-[11px] text-taupe-400">
                          <Icon name={ventureIcon(d.venture)} size={10} /> {ventureName(d.venture)}
                        </div>
                        <div className="mt-2 flex items-center justify-between">
                          <span className="font-mono text-xs font-bold text-taupe-800">{formatCompactCOP(d.valor)}</span>
                          <div className="flex items-center gap-1">
                            <button disabled={i === 0} onClick={() => move(d.id, -1)}
                              className="grid h-6 w-6 place-items-center rounded-md text-taupe-500 hover:bg-taupe-100 disabled:opacity-30">
                              <Icon name="ChevronLeft" size={14} />
                            </button>
                            <button disabled={i === STAGES.length - 1} onClick={() => move(d.id, 1)}
                              className="grid h-6 w-6 place-items-center rounded-md text-amber-600 hover:bg-amber-50 disabled:opacity-30">
                              <Icon name="ChevronRight" size={14} />
                            </button>
                          </div>
                        </div>
                      </div>
                    );
                  })}
                  {col.length === 0 && <div className="px-1 py-2 text-[11px] text-taupe-300">—</div>}
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { MarketingCenter, VentasCenter });
