// ─── Documentos · Presupuestos ──────────────────────────────────────────
// PresupuestosScreen: lista navegable de presupuestos del expediente (envoltura
// delgada de EntityListScreen). Extraído de screens-documentos.jsx (P10, split
// junto con las otras 5 listas — ver compartido.jsx para los helpers/mapas de
// estado compartidos). Cada fila navega al expediente padre (onOpen). Expone a
// window: PresupuestosScreen. Consume window.PRESUPUESTOS (core/colecciones.js),
// EntityListScreen/useEntityStats (ui/entity-list.jsx), IdDateCell (ui/
// primitives.jsx), PRESUP_ESTADOS/_docExpCol/_docExpPid/_docMoney/
// _docMoneyShort/_docCount (compartido.jsx).

function PresupuestosScreen({ onOpen }) {
  const rows = window.PRESUPUESTOS || [];
  const counts = {}; rows.forEach((p) => counts[p.estado] = (counts[p.estado] || 0) + 1);
  const totalAprob = rows.filter((p) => p.estado === 'APROBADO').reduce((s, p) => s + (p.total || 0), 0);

  // KPIs/chips server-side (P2): GET /api/presupuestos/stats agrega TODO el
  // universo en Postgres (no el array capado a BIG_LIMIT en memoria). Si no llegó
  // todavía o falla, sigue con el cálculo en memoria de siempre (`counts`/
  // `rows.length`) como fallback — nunca deja los KPIs vacíos.
  const srvStats = window.useEntityStats('presupuestos');
  const kTotal = srvStats ? srvStats.total : rows.length;
  const kByEstado = srvStats ? (srvStats.byEstado || {}) : counts;
  const kAprobados = kByEstado.APROBADO || 0;

  return (
    <EntityListScreen
      eyebrow="Documentos · Presupuestos"
      title="Presupuestos"
      description="Presupuestos emitidos a clientes desde los expedientes."
      secondaryAction={{ label: 'Exportar', icon: IconDownload }}
      kpis={[
        { label: 'Total', value: String(kTotal), deltaTone: 'neutral', icon: IconFileText },
        { label: 'Aprobados', value: String(kAprobados), deltaTone: 'pos', icon: IconCheckCircle },
        { label: 'Requieren aprob.', value: String(_docCount(rows, (p) => p.requiereAprobacion)), deltaTone: 'warn', icon: IconClock },
        { label: 'Monto aprobado', value: _docMoneyShort(totalAprob), deltaTone: 'neutral', icon: IconDollar },
      ]}
      filterChips={{
        options: Object.entries(PRESUP_ESTADOS).map(([v, c]) => ({ label: c.label, value: v, count: kByEstado[v] || 0 })).filter((o) => o.count > 0),
        applyFilter: (p, v) => p.estado === v,
      }}
      columns={[
        { key: 'publicId', label: 'Presupuesto', width: '180px', render: (p) => <IdDateCell id={p.publicId} date={p.fechaEmision} /> },
        { key: 'expedienteId', label: 'Expediente', width: '160px', render: (p) => _docExpCol(p.expedienteId) },
        { key: 'items', label: 'Ítems', width: '90px', render: (p) => <span className="text-[13px] font-bold tabular-nums" style={{ color: 'var(--foreground)' }}>{(p.items || []).length}</span> },
        { key: 'total', label: 'Total', width: '160px', render: (p) => <span className="text-[14px] font-extrabold tabular-nums" style={{ color: 'var(--foreground)' }}>{_docMoney(p.total)}</span> },
        { key: 'estado', label: 'Estado', width: '140px', render: (p) => <TablePill label={(PRESUP_ESTADOS[p.estado] || {}).label || p.estado} tone={(PRESUP_ESTADOS[p.estado] || {}).tone || 'neutral'} /> },
      ]}
      rows={rows}
      collection="presupuestos"
      searchPlaceholder="Buscar por N°, expediente o estado…"
      searchFilter={(p, q) => p.publicId.toLowerCase().includes(q) || _docExpPid(p.expedienteId).toLowerCase().includes(q) || (p.estado || '').toLowerCase().includes(q)}
      onRowClick={(p) => onOpen && onOpen(p)}
      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="Presupuestos"
      exportConfig={[
        { label: 'Presupuesto', value: (p) => p.publicId },
        { label: 'Fecha', value: (p) => p.fechaEmision },
        { label: 'Expediente', value: (p) => _docExpPid(p.expedienteId) },
        { label: 'Ítems', value: (p) => (p.items || []).length },
        { label: 'Total', value: (p) => p.total },
        { label: 'Estado', value: (p) => (PRESUP_ESTADOS[p.estado] || {}).label || p.estado },
      ]}
    />
  );
}

Object.assign(window, { PresupuestosScreen });
