// ─── Compras · Lista (Órdenes de compra históricas) ──────────────────────
// ComprasScreen: EntityListScreen configurado (paginación server-side vía
// collection="compras" + KPIs de v_compras_stats). Extraído tal cual de
// screens-others.jsx (P9, split del cajón de 5 módulos) — cero cambio de
// comportamiento salvo el export de Expediente (ver abajo). Expone a window:
// ComprasScreen. Consume window.COMPRAS, window.useEntityStats (ui/entity-list.jsx),
// COMPRA_ESTADOS (dominio/pipeline.js), formatMoney/formatMoneyShort/formatDate
// (dominio/formato.js), expedienteLabelFromId (screens/compras/combobox.jsx).

function ComprasScreen({ onOpen, prefilter, onNew }) {
  const totalMes = COMPRAS.reduce((s, c) => s + c.total, 0);
  const counts = {};
  COMPRAS.forEach(c => counts[c.estado] = (counts[c.estado] || 0) + 1);

  // v_compras_stats: {total, sumTotal, byEstado} — cubre las 4 KPIs + filterChips.
  const srvStats = window.useEntityStats('compras');
  const kTotal = srvStats ? srvStats.total : COMPRAS.length;
  const kSumTotal = srvStats ? srvStats.sumTotal : totalMes;
  const kByEstado = srvStats ? (srvStats.byEstado || {}) : counts;

  return (
    <EntityListScreen
      eyebrow="Operaciones · Compras"
      rowChevron
      title="Compras"
      description="Compras a proveedores generadas desde expedientes y stock."
      primaryAction={{ label: 'Nueva compra', icon: IconPlus, onClick: onNew }}
      secondaryAction={{ label: 'Exportar', icon: IconDownload }}
      kpis={[
        { label: 'Total órdenes',  value: String(kTotal),         delta: 'Registradas',   deltaTone: 'neutral', icon: IconShoppingCart },
        { label: 'Recibidas',      value: String(kByEstado.RECIBIDA || 0),   delta: `${kTotal ? Math.round((kByEstado.RECIBIDA || 0) / kTotal * 100) : 0}% del total`, deltaTone: 'neutral', icon: IconCheckCircle },
        { label: 'En tránsito',    value: String((kByEstado.EN_TRANSITO || 0) + (kByEstado.PENDIENTE || 0)), delta: 'Próximas a recibir', deltaTone: 'neutral', icon: IconTruck },
        { label: 'Monto comprado', value: formatMoneyShort(kSumTotal),     delta: 'Suma de órdenes', deltaTone: 'neutral', icon: IconDollar },
      ]}
      filterChips={{
        options: Object.entries(COMPRA_ESTADOS).map(([v, c]) => ({ label: c.label, value: v, count: kByEstado[v] || 0 })).filter(o => o.count > 0),
        applyFilter: (c, v) => c.estado === v,
      }}
      columns={[
        { key: 'numero', label: 'Orden', width: 'minmax(150px, 1fr)',
          render: (c) => (
            <div className="min-w-0">
              <span className="font-mono text-[12.5px] font-bold tracking-wide uppercase" style={{ color: 'var(--accent)' }}>{c.numero}</span>
              <p className="text-[11px] tabular-nums mt-1" style={{ color: 'var(--muted-foreground)' }}>{formatDate(c.fecha)}</p>
            </div>
          ),
        },
        { key: 'proveedor', label: 'Proveedor', width: 'minmax(180px, 1fr)',
          render: (c) => <p className="text-[13px] font-bold truncate" style={{ color: 'var(--foreground)' }}>{c.proveedor}</p> },
        { key: 'comprobante', label: 'Comprobante', width: 'minmax(160px, 1fr)',
          render: (c) => {
            // Una compra puede no tener comprobante emitido todavía (comprobante_tipo NULL en
            // la DB — no toda compra tiene comprobante). Normalizamos a '—' como el resto del
            // módulo (compras/detalle.jsx hace lo mismo con `|| '—'`): sin esto, `.startsWith`
            // sobre null crasheaba TODA la lista al aparecer una compra sin comprobante
            // (regla de la casa: los datos degradados degradan a "—", nunca tumban la lista).
            const tipo = c.comprobanteTipo || '—';
            const pending = tipo === '—';
            const isNC = tipo.startsWith('Nota');
            return (
              <div className="min-w-0">
                <p className="text-[12.5px] font-bold truncate" style={{
                  color: pending ? 'var(--muted-foreground)' : (isNC ? 'var(--danger)' : 'var(--foreground)'),
                }}>
                  {tipo}
                </p>
                <p className="font-mono text-[11px] font-semibold tabular-nums mt-1" style={{ color: 'var(--muted-foreground)' }}>
                  {c.comprobanteNumero}
                </p>
              </div>
            );
          } },
        { key: 'items', label: 'Ítems', width: 'minmax(90px, 1fr)',
          render: (c) => <span className="text-[13px] font-bold tabular-nums" style={{ color: 'var(--foreground)' }}>{c.items}</span> },
        { key: 'total', label: 'Total', width: 'minmax(130px, 1fr)',
          render: (c) => <span className="text-[14px] font-extrabold tabular-nums" style={{ color: 'var(--foreground)' }}>{formatMoney(c.total)}</span> },
        { key: 'estado', label: 'Estado', width: 'minmax(130px, 1fr)',
          render: (c) => { const e = COMPRA_ESTADOS[c.estado] || { label: c.estado || '—', tone: 'neutral' }; return <TablePill label={e.label} tone={e.tone} />; } },
      ]}
      rows={COMPRAS}
      collection="compras"
      searchPlaceholder="Buscar por OC#, proveedor o comprobante…"
      searchFilter={(c, q) =>
        (c.numero || '').toLowerCase().includes(q) ||
        (c.proveedor || '').toLowerCase().includes(q) ||
        (c.comprobanteNumero || '').toLowerCase().includes(q) ||
        (c.comprobanteTipo || '').toLowerCase().includes(q)
      }
      onRowClick={onOpen}
      prefilter={prefilter}
      dateField="fecha"
      // Orden por defecto: más nuevo → más viejo por fecha, desempata por
      // `numero` (P15 — alias de public_id en este serializer, ver compras.ts;
      // mismo molde que screens/expedientes/lista.jsx).
      sortRows={(a, b) =>
        (b.fecha || '').localeCompare(a.fecha || '') ||
        (b.numero || '').localeCompare(a.numero || '')
      }
      exportFilename="Compras"
      exportConfig={[
        { label: 'Orden de compra', value: (c) => c.numero },
        { label: 'Fecha', value: (c) => c.fecha },
        { label: 'Proveedor', value: (c) => c.proveedor },
        { label: 'Comprobante', value: (c) => (c.comprobanteTipo === '—' ? 'Sin emitir' : c.comprobanteTipo) },
        { label: 'N° comprobante', value: (c) => c.comprobanteNumero },
        // P9: exportaba c.expedienteId crudo (uuid real, columna expediente_id — antes
        // texto mock "EXP-…"); resuelto al publicId visible, mismo criterio que el
        // resto de las metaceldas de este módulo (ver ComprasDetailScreen).
        { label: 'Expediente', value: (c) => expedienteLabelFromId(c.expedienteId, '') },
        { label: 'Ítems', value: (c) => c.items },
        { label: 'Total', value: (c) => c.total },
        { label: 'Estado', value: (c) => (COMPRA_ESTADOS[c.estado] || {}).label || c.estado },
      ]}
    />
  );
}

Object.assign(window, { ComprasScreen });
