// ─── Logística · Lista (remitos de ingreso/egreso) ───────────────────────
// LogisticaScreen: EntityListScreen con tabs Ingresos/Egresos. Extraída de
// screens-others.jsx (P9, split del cajón de 5 módulos). Expone a window:
// LogisticaScreen. Consume LOG_ESTADOS/LOG_TIPOS (dominio/pipeline.js),
// formatDate/formatMoney (dominio/formato.js), resolveLogisticaContraparte
// (helpers.js), expedienteLabelFromId (screens/compras/combobox.jsx).
//
// P9 — fix de raíz (no solo cosmético): antes de este paquete, `l.proveedor`/
// `l.expedienteId` se usaban como si SIEMPRE fueran strings ("Fulano SA"/
// "EXP-…") — cierto con la semilla mock, falso contra la DB real: proveedor no
// es columna (undefined en filas EGRESO, que solo tienen entidadId) y
// expedienteId es un uuid o `null` (columna real, FK, P2). `l.expedienteId.
// toLowerCase()` en el searchFilter reventaba la búsqueda ENTERA en cuanto un
// solo remito no tuviera expediente vinculado (TypeError sobre null/undefined)
// — bug real, no hipotético, apenas entrara data real. Fix: resolver contraparte/
// expediente con los helpers (con fallback '') en columnas, búsqueda y export.
function LogisticaScreen({ onOpen, onNew }) {
  const counts = {};
  LOGISTICA.forEach(l => counts[l.estado] = (counts[l.estado] || 0) + 1);
  // KPIs por lado (Ingresos/Egresos) — todo derivado de las filas del lado.
  const sideKpis = (sideTipo) => {
    const rowsSide = LOGISTICA.filter(l => (l.tipo || 'INGRESO') === sideTipo);
    const c = {}; rowsSide.forEach(l => c[l.estado] = (c[l.estado] || 0) + 1);
    const pct = rowsSide.length ? Math.round((c.ENTREGADO || 0) / rowsSide.length * 100) : 0;
    return [
      { label: sideTipo === 'INGRESO' ? 'Remitos de entrada' : 'Remitos de salida', value: String(rowsSide.length), delta: 'Registrados', deltaTone: 'neutral', icon: IconTruck },
      { label: 'Pendientes',  value: String(c.PENDIENTE || 0),   delta: 'Sin despachar', deltaTone: c.PENDIENTE > 0 ? 'neg' : 'neutral', icon: IconClock },
      { label: 'En tránsito', value: String(c.EN_TRANSITO || 0), delta: 'En camino',     deltaTone: 'neutral', icon: IconArrowUpRight },
      { label: 'Entregados',  value: String(c.ENTREGADO || 0),   delta: `${pct}% del lado`, deltaTone: 'pos', icon: IconCheckCircle },
    ];
  };
  // ── Columnas compartidas (la vieja "Tipo" se reemplaza por una columna propia por lado) ──
  const colId = { key: 'publicId', label: 'ID', width: 'minmax(150px, 1fr)',
    render: (l) => (
      <div className="min-w-0">
        <span className="font-mono text-[12.5px] font-bold tracking-wide uppercase" style={{ color: 'var(--accent)' }}>{l.publicId}</span>
        <p className="text-[11.5px] tabular-nums mt-1" style={{ color: 'var(--muted-foreground)' }}>{formatDate(l.fechaCreacion)}</p>
      </div>
    ) };
  const colProv = (label) => ({ key: 'proveedor', label, width: 'minmax(180px, 1fr)',
    render: (l) => {
      const name = resolveLogisticaContraparte(l);
      return name
        ? <p className="text-[13px] font-bold truncate" style={{ color: 'var(--foreground)' }}>{name}</p>
        : <span className="font-mono text-[12px] font-semibold tabular-nums" style={{ color: 'color-mix(in oklab, var(--muted-foreground) 50%, transparent)' }}>—</span>;
    } });
  const colRemito = { key: 'remito', label: 'Remito', width: 'minmax(150px, 1fr)',
    render: (l) => <span className="font-mono text-[11.5px] font-semibold tabular-nums" style={{ color: 'color-mix(in oklab, var(--foreground) 85%, transparent)' }}>{l.remito}</span> };
  const colSalida = { key: 'salida', label: 'Salida', width: 'minmax(120px, 1fr)',
    render: (l) => <span className="text-[12px] font-mono tabular-nums" style={{ color: l.fechaSalida ? 'var(--foreground)' : 'color-mix(in oklab, var(--muted-foreground) 50%, transparent)' }}>{l.fechaSalida ? formatDate(l.fechaSalida) : '—'}</span> };
  const colEntrega = { key: 'fechaEntrega', label: 'Entrega', width: 'minmax(120px, 1fr)',
    render: (l) => <span className="text-[12px] font-mono tabular-nums" style={{ color: l.fechaEntrega ? 'var(--foreground)' : 'color-mix(in oklab, var(--muted-foreground) 50%, transparent)' }}>{l.fechaEntrega ? formatDate(l.fechaEntrega) : '—'}</span> };
  const colEstado = { key: 'estado', label: 'Estado', width: 'minmax(130px, 1fr)',
    render: (l) => <TablePill label={LOG_ESTADOS[l.estado].label} tone={LOG_ESTADOS[l.estado].tone} /> };
  // Ingresos: «Compra» = OC vinculada (número, estilo id accent), «—» si no tiene compra
  // asociada, o el id crudo + aviso si el FK está pero la compra quedó fuera de la ventana
  // hidratada (BIG_LIMIT=500, core/store.js) — FIX P13 (ítem 3, hallazgo P9): antes esto
  // caía al mismo «—» que "sin compra vinculada", mintiendo que no había vínculo cuando el
  // FK seguía intacto. Honesto > lindo: mostramos el id (no la linda `numero`, que solo la
  // trae el registro real) con la aclaración, en vez de simular que el vínculo no existe.
  const colOrigen = { key: 'origen', label: 'Compra', width: 'minmax(150px, 1fr)',
    render: (l) => {
      if (!l.compraId) {
        return <span className="font-mono text-[12px] font-semibold tabular-nums" style={{ color: 'color-mix(in oklab, var(--muted-foreground) 50%, transparent)' }}>—</span>;
      }
      const c = (window.COMPRAS || []).find(x => x.id === l.compraId);
      if (c) return <span className="font-mono text-[12.5px] font-bold tracking-wide uppercase" style={{ color: 'var(--accent)' }}>{c.numero}</span>;
      return (
        <span className="font-mono text-[11px] font-semibold" style={{ color: 'color-mix(in oklab, var(--muted-foreground) 70%, transparent)' }} title={`Compra vinculada (${l.compraId}) fuera de la ventana cargada`}>
          Vinculada · fuera de ventana
        </span>
      );
    } };
  // Egresos: «Expediente» = caso al que pertenece la entrega.
  const colExpediente = { key: 'expediente', label: 'Expediente', width: 'minmax(150px, 1fr)',
    render: (l) => {
      const label = expedienteLabelFromId(l.expedienteId, '');
      return label
        ? <span className="font-mono text-[12.5px] font-bold tracking-wide uppercase" style={{ color: 'var(--accent)' }}>{label}</span>
        : <span className="font-mono text-[12px] font-semibold tabular-nums" style={{ color: 'color-mix(in oklab, var(--muted-foreground) 50%, transparent)' }}>—</span>;
    } };
  const ingresoCols = [colId, colOrigen, colProv('Proveedor'), colRemito, colSalida, colEntrega, colEstado];
  const egresoCols  = [colId, colExpediente, colProv('Cliente / Destino'), colRemito, colSalida, colEntrega, colEstado];
  return (
    <EntityListScreen
      eyebrow="Operaciones · Logística"
      rowChevron
      title="Logística"
      primaryAction={{ label: 'Nuevo remito', icon: IconPlus, onClick: onNew }}
      secondaryAction={{ label: 'Exportar', icon: IconDownload }}
      tabs={{
        default: 'INGRESO',
        applyFilter: (l, v) => (l.tipo || 'INGRESO') === v,
        options: [
          { key: 'INGRESO', label: 'Ingresos', title: 'Ingresos', description: 'Recepción de lo comprado a proveedores: remitos de entrada, con estados y transportistas.', kpis: sideKpis('INGRESO'), columns: ingresoCols },
          { key: 'EGRESO',  label: 'Egresos',  title: 'Egresos',  description: 'Entregas al cliente: remitos de salida, con estados y transportistas.', kpis: sideKpis('EGRESO'), columns: egresoCols },
        ],
      }}
      filterChips={{
        options: Object.entries(LOG_ESTADOS).map(([v, c]) => ({ label: c.label, value: v })).filter(o => (counts[o.value] || 0) > 0),
        applyFilter: (l, v) => l.estado === v,
      }}
      columns={ingresoCols}
      rows={LOGISTICA}
      searchPlaceholder="Buscar por ID, proveedor o remito…"
      searchFilter={(l, q) =>
        (l.publicId || '').toLowerCase().includes(q) ||
        resolveLogisticaContraparte(l).toLowerCase().includes(q) ||
        (l.remito || '').toLowerCase().includes(q) ||
        expedienteLabelFromId(l.expedienteId, '').toLowerCase().includes(q)
      }
      onRowClick={onOpen}
      dateField="fechaCreacion"
      exportFilename="Logística"
      exportConfig={[
        { label: 'ID', value: (l) => l.publicId },
        { label: 'Tipo', value: (l) => (LOG_TIPOS[l.tipo || 'INGRESO'] || {}).label || l.tipo },
        { label: 'Fecha', value: (l) => l.fechaCreacion },
        { label: 'Proveedor / Cliente', value: (l) => resolveLogisticaContraparte(l) },
        { label: 'Remito', value: (l) => l.remito },
        { label: 'Salida', value: (l) => l.fechaSalida || '' },
        { label: 'Entrega', value: (l) => l.fechaEntrega || '' },
        { label: 'Expediente', value: (l) => expedienteLabelFromId(l.expedienteId, '') },
        { label: 'Estado', value: (l) => (LOG_ESTADOS[l.estado] || {}).label || l.estado },
      ]}
    />
  );
}

Object.assign(window, { LogisticaScreen });
