// ─── Documentos · Órdenes de compra (del expediente: cliente → nosotros) ──
// OrdenesCompraScreen: lista navegable de OC del expediente (envoltura delgada
// de EntityListScreen). Extraído de screens-documentos.jsx (P10, split junto
// con las otras 5 listas — ver compartido.jsx). Expone a window:
// OrdenesCompraScreen. Consume window.ORDENES_COMPRA/ENTIDADES (core/
// colecciones.js), EntityListScreen/useEntityStats (ui/entity-list.jsx),
// IdDateCell (ui/primitives.jsx), OC_ESTADOS/_docExpCol/_docExpPid/
// _docEntidadNombre/_docMoney/_docMoneyShort (compartido.jsx).
//
// FIX (mapa-comprension.md §inv-dash, bug severidad media — "el placeholder de
// búsqueda promete buscar por cliente pero searchFilter no lo hacía"):
// `searchFilter` ahora incluye `_docEntidadNombre(o.entidadId)` — antes solo
// comparaba `publicId`/expediente, así que tipear el nombre real de un cliente
// no devolvía nada pese a que el placeholder dice "…o cliente". Mismo fix en
// facturas.jsx (mismo bug, misma causa: la resolución de nombre nunca llegaba
// al string comparado).

function OrdenesCompraScreen({ onOpen }) {
  const rows = window.ORDENES_COMPRA || [];
  const counts = {}; rows.forEach((o) => counts[o.estado] = (counts[o.estado] || 0) + 1);
  const total = rows.reduce((s, o) => s + (o.total || 0), 0);

  // FIX P13 (ítem 19, hallazgo BAJO-3 de la consolidación): `/api/ordenes-compra/stats`
  // era el único /stats faltante de su familia (404 en consola, con este mismo fallback
  // local ya cubriendo la UI) — ahora existe (v_ordenes_compra_stats, migración
  // 20260702220000, mismo shape que v_compras_stats). El fallback local se queda igual
  // (useEntityStats ya maneja el catch/degradación si el fetch fallara por otra razón).
  const srvStats = window.useEntityStats('ordenesCompra');
  const kTotal = srvStats ? srvStats.total : rows.length;
  const kByEstado = srvStats ? (srvStats.byEstado || {}) : counts;
  // "Monto total": SUM(total) de TODO el universo desde v_ordenes_compra_stats (srvStats.sumTotal),
  // no el reduce sobre las filas hidratadas (capadas a BIG_LIMIT). Fallback al reduce local si el
  // /stats todavía no llegó o falló — mismo criterio que kTotal/kByEstado.
  const kSumTotal = (srvStats && typeof srvStats.sumTotal === 'number') ? srvStats.sumTotal : total;

  return (
    <EntityListScreen
      eyebrow="Documentos · Órdenes de compra"
      title="Órdenes de compra"
      description="Órdenes de compra que emiten los clientes (obras sociales / sanatorios) a Micos."
      secondaryAction={{ label: 'Exportar', icon: IconDownload }}
      kpis={[
        { label: 'Total', value: String(kTotal), deltaTone: 'neutral', icon: IconClipboardCheck },
        { label: 'En tránsito', value: String((kByEstado.EN_TRANSITO || 0) + (kByEstado.PENDIENTE || 0)), deltaTone: 'neutral', icon: IconClock },
        { label: 'Recibidas', value: String(kByEstado.RECIBIDA || 0), deltaTone: 'pos', icon: IconCheckCircle },
        { label: 'Monto total', value: _docMoneyShort(kSumTotal), deltaTone: 'neutral', icon: IconDollar },
      ]}
      filterChips={{
        options: Object.entries(OC_ESTADOS).map(([v, c]) => ({ label: c.label, value: v, count: kByEstado[v] || 0 })).filter((o) => o.count > 0),
        applyFilter: (o, v) => o.estado === v,
      }}
      columns={[
        { key: 'publicId', label: 'Orden', width: '180px', render: (o) => <IdDateCell id={o.publicId} date={o.fechaEmision} /> },
        { key: 'expedienteId', label: 'Expediente', width: '150px', render: (o) => _docExpCol(o.expedienteId) },
        { key: 'entidadId', label: 'Cliente', width: '1.2fr', render: (o) => { const nombre = _docEntidadNombre(o.entidadId); return <span className="text-[13px] font-bold truncate" style={{ color: nombre ? 'var(--foreground)' : 'var(--muted-foreground)' }}>{nombre || '—'}</span>; } },
        { key: 'total', label: 'Total', width: '150px', render: (o) => <span className="text-[14px] font-extrabold tabular-nums" style={{ color: 'var(--foreground)' }}>{_docMoney(o.total)}</span> },
        { key: 'estado', label: 'Estado', width: '140px', render: (o) => <TablePill label={(OC_ESTADOS[o.estado] || {}).label || o.estado} tone={(OC_ESTADOS[o.estado] || {}).tone || 'neutral'} /> },
      ]}
      rows={rows}
      collection="ordenesCompra"
      searchPlaceholder="Buscar por N°, expediente o cliente…"
      searchFilter={(o, q) => o.publicId.toLowerCase().includes(q) || _docExpPid(o.expedienteId).toLowerCase().includes(q) || _docEntidadNombre(o.entidadId).toLowerCase().includes(q)}
      onRowClick={(o) => onOpen && onOpen(o)}
      dateField="fechaEmision"
      // Orden por defecto: más nuevo → más viejo por fecha de emisión, desempata
      // por publicId (P15 — mismo molde que screens/expedientes/lista.jsx).
      sortRows={(a, b) =>
        (b.fechaEmision || '').localeCompare(a.fechaEmision || '') ||
        (b.publicId || '').localeCompare(a.publicId || '')
      }
      exportFilename="Órdenes de compra"
      exportConfig={[
        { label: 'Orden', value: (o) => o.publicId },
        { label: 'Fecha', value: (o) => o.fechaEmision },
        { label: 'Expediente', value: (o) => _docExpPid(o.expedienteId) },
        { label: 'Cliente', value: (o) => _docEntidadNombre(o.entidadId) },
        { label: 'Total', value: (o) => o.total },
        { label: 'Estado', value: (o) => (OC_ESTADOS[o.estado] || {}).label || o.estado },
      ]}
    />
  );
}

Object.assign(window, { OrdenesCompraScreen });
