// ─── Breadcrumbs del ERP ────────────────────────────────────────────
// Extraído de app.jsx (P3, split del monolito): las tablas de labels por ruta
// (SECTION_LABELS/DOC_LABELS) y el builder que arma el array de breadcrumbs para el
// Header (shell.jsx). Esquema único «Sección · Pantalla», la Sección coincide con el
// grupo del Sidebar (General/Operaciones/Directorio/Herramientas).
// Expone a window: SECTION_LABELS, DOC_LABELS, buildBreadcrumbs. No tiene estado propio
// (buildBreadcrumbs es una función pura: recibe `route` + los ids/colecciones que
// necesita resolver a texto) — la llama core/app.jsx en cada render. Se carga junto con
// core/router.jsx y core/directorio-nav.jsx, justo antes de core/app.jsx.

// Labels de los documentos del expediente (breadcrumb de 4 niveles: Operaciones ›
// Expedientes › <publicId> › <doc>).
const DOC_LABELS = {
  'presupuesto': 'Presupuesto',
  'orden-compra': 'Orden de Compra',
  'remito': 'Remito',
  'factura': 'Factura',
  'recibo': 'Recibo',
  'documentacion-medica': 'Documentación médica',
  'documentacion-extra': 'Documentación extra',
};

// Labels del resto de las rutas: { section, label, child? }. `child` es el 3er nivel
// del breadcrumb para las rutas de detalle/alta/edición (el builder de abajo resuelve
// cada caso a un texto concreto — ej. el publicId real en vez de "Ítem de compra").
const SECTION_LABELS = {
  'dashboard':       { section: 'General',       label: 'Panel general' },
  'compras':         { section: 'Operaciones',  label: 'Compras' },
  'compras-detail':  { section: 'Operaciones',  label: 'Compras', child: 'Ítem de compra' },
  'compras-nuevo':   { section: 'Operaciones',  label: 'Compras', child: 'Nueva compra' },
  'compras-editar':  { section: 'Operaciones',  label: 'Compras', child: 'Editar compra' },
  'finanzas':             { section: 'Operaciones',  label: 'Finanzas' },
  'finanzas-doc-detail':  { section: 'Operaciones',  label: 'Finanzas', child: 'Documento' },
  'finanzas-nota-nueva':  { section: 'Operaciones',  label: 'Finanzas', child: 'Nueva nota' },
  'finanzas-factura-nueva': { section: 'Operaciones',  label: 'Finanzas', child: 'Nueva factura' },
  'finanzas-recibo-nueva': { section: 'Operaciones',  label: 'Finanzas', child: 'Nuevo recibo' },
  'finanzas-pago-nueva':  { section: 'Operaciones',  label: 'Finanzas', child: 'Nuevo pago' },
  'finanzas-facrec-nueva': { section: 'Operaciones',  label: 'Finanzas', child: 'Nueva factura' },
  // P8: mueren las entradas de finanzas-cobro-*/finanzas-pago-detail/-factura/
  // -comprobante/-docextra — rutas huérfanas del bloque muerto (ver core/app.jsx
  // + screens/finanzas/lista.jsx).
  'logistica':        { section: 'Operaciones',  label: 'Logística' },
  'logistica-detail': { section: 'Operaciones',  label: 'Logística', child: 'Recepción' },
  'logistica-nuevo':  { section: 'Operaciones',  label: 'Logística', child: 'Nuevo remito' },
  'logistica-editar': { section: 'Operaciones',  label: 'Logística', child: 'Editar remito' },
  'inventario':        { section: 'Operaciones',  label: 'Inventario' },
  'inventario-detail': { section: 'Operaciones',  label: 'Inventario', child: 'Ítem' },
  'inventario-nuevo':  { section: 'Operaciones',  label: 'Inventario', child: 'Nuevo producto' },
  'inventario-editar': { section: 'Operaciones',  label: 'Inventario', child: 'Editar producto' },
  'inventario-historial': { section: 'Operaciones',  label: 'Inventario', child: 'Historial de movimientos' },
  'inventario-activo-detail': { section: 'Operaciones', label: 'Inventario', child: 'Equipo' },
  'inventario-activo-nuevo': { section: 'Operaciones', label: 'Inventario', child: 'Nuevo equipo VAC' },
  'inventario-historial-alquileres': { section: 'Operaciones', label: 'Inventario', child: 'Historial de alquileres' },
  'entidades':         { section: 'Directorio',   label: 'Entidades' },
  'entidades-detail':  { section: 'Directorio',   label: 'Entidades',   child: 'Entidad' },
  'entidades-nuevo':   { section: 'Directorio',   label: 'Entidades',   child: 'Nueva entidad' },
  'entidades-editar':  { section: 'Directorio',   label: 'Entidades',   child: 'Editar entidad' },
  'medicos':           { section: 'Directorio',   label: 'Médicos' },
  'medicos-detail':    { section: 'Directorio',   label: 'Médicos',    child: 'Médico'  },
  'medicos-nuevo':     { section: 'Directorio',   label: 'Médicos',    child: 'Nuevo médico' },
  'medicos-editar':    { section: 'Directorio',   label: 'Médicos',    child: 'Editar médico' },
  'particulares':      { section: 'Directorio',   label: 'Particulares' },
  'particulares-detail': { section: 'Directorio', label: 'Particulares', child: 'Paciente' },
  'particulares-nuevo':  { section: 'Directorio', label: 'Particulares', child: 'Nuevo paciente' },
  'particulares-editar': { section: 'Directorio', label: 'Particulares', child: 'Editar paciente' },
  'caja-chica':        { section: 'Herramientas', label: 'Caja Chica' },
  'caja-chica-nuevo':  { section: 'Herramientas', label: 'Caja Chica', child: 'Nuevo movimiento' },
  'caja-chica-editar': { section: 'Herramientas', label: 'Caja Chica', child: 'Editar movimiento' },
  'caja-chica-detail': { section: 'Herramientas', label: 'Caja Chica', child: 'Movimiento' },
  'aprobaciones':  { section: 'Herramientas', label: 'Notificaciones de margen' },
  'ajustes-inventario': { section: 'Herramientas', label: 'Ajustes de inventario' },
  'configuracion': { section: 'Herramientas', label: 'Configuración' },
  'proveedores':   { section: 'Directorio',   label: 'Proveedores' },
  'proveedores-detail': { section: 'Directorio', label: 'Proveedores', child: 'Proveedor' },
  'proveedores-nuevo': { section: 'Directorio', label: 'Proveedores', child: 'Nuevo proveedor' },
  'proveedores-editar': { section: 'Directorio', label: 'Proveedores', child: 'Editar proveedor' },
  'presupuestos':  { section: 'Documentos',   label: 'Presupuestos' },
  'ordenes-compra':{ section: 'Documentos',   label: 'Órdenes de compra' },
  'remitos':       { section: 'Documentos',   label: 'Remitos' },
  'facturas':      { section: 'Documentos',   label: 'Facturas' },
  'recibos':       { section: 'Documentos',   label: 'Recibos' },
};

// Arma el array de breadcrumbs para el Header. `ctx` trae el expediente ya resuelto
// (selectedExpediente) y los ids seleccionados de cada módulo — core/app.jsx los junta
// desde su propio estado de navegación en cada render (no hay memoización: es una
// función barata, igual que el IIFE que reemplaza).
function buildBreadcrumbs(route, ctx) {
  const {
    selectedExpediente,
    selectedCompraId, selectedLogisticaId, selectedCajaChicaId,
    selectedInventarioId, selectedActivoId,
    selectedEntidadId, selectedMedicoId, selectedParticularId, selectedProveedorId,
  } = ctx;
  const b = [];
  if (route === 'expedientes-list') {
    b.push({ label: 'Operaciones', href: null });
    b.push({ label: 'Expedientes', href: null });
  } else if (route === 'expedientes-nuevo') {
    b.push({ label: 'Operaciones', href: null });
    b.push({ label: 'Expedientes', href: 'expedientes-list' });
    b.push({ label: 'Nuevo', href: null });
  } else if (route === 'expedientes-detail') {
    b.push({ label: 'Operaciones', href: null });
    b.push({ label: 'Expedientes', href: 'expedientes-list' });
    // Placeholder honesto si el publicId todavía no llegó (alta con el POST en
    // vuelo) — antes caía al del singleton Sofía (dual-path muerto en P6).
    b.push({ label: (selectedExpediente && selectedExpediente.publicId) || 'EXP-…', href: null });
  } else if (DOC_LABELS[route]) {
    b.push({ label: 'Operaciones', href: null });
    b.push({ label: 'Expedientes', href: 'expedientes-list' });
    b.push({ label: (selectedExpediente && selectedExpediente.publicId) || 'EXP-…', href: 'expedientes-detail' });
    b.push({ label: DOC_LABELS[route], href: null });
  } else if (SECTION_LABELS[route]) {
    const sl = SECTION_LABELS[route];
    b.push({ label: sl.section, href: null });
    if (sl.child) {
      // Hallazgo auditoría 05/07/2026 ("Identificador del registro en el 3er breadcrumb...
      // patrón X.find(...) || X[0]"): el `|| X[0]` de las 8 ramas de abajo caía al PRIMER
      // registro del array cuando el id seleccionado todavía no hidrató — como ESE otro
      // registro es truthy, el ternario mostraba SU identificador real en vez del label
      // genérico (sl.child). Fix: sin el `|| X[0]`, un id no encontrado da `undefined`
      // (falsy) y el ternario cae directo al label genérico — mismo criterio que ya usaba
      // `inventario-activo-detail` (nunca tuvo el `|| X[0]`, ver `act` abajo) y que
      // `expedientes-detail` desde P6 (comentario "Placeholder honesto" más arriba).
      if (route === 'compras-detail') {
        b.push({ label: sl.label, href: 'compras' });
        const c = COMPRAS.find((x) => x.id === selectedCompraId);
        b.push({ label: c ? c.numero : sl.child, href: null });
      } else if (route === 'logistica-detail') {
        b.push({ label: sl.label, href: 'logistica' });
        const l = LOGISTICA.find((x) => x.id === selectedLogisticaId);
        b.push({ label: l ? l.publicId : sl.child, href: null });
      } else if (route === 'caja-chica-detail') {
        b.push({ label: sl.label, href: 'caja-chica' });
        const m = CAJA_CHICA.find((x) => x.id === selectedCajaChicaId);
        b.push({ label: m ? m.publicId : sl.child, href: null });
      } else if (route === 'finanzas-doc-detail' || route === 'finanzas-nota-nueva' || route === 'finanzas-factura-nueva' || route === 'finanzas-recibo-nueva' || route === 'finanzas-pago-nueva' || route === 'finanzas-facrec-nueva') {
        b.push({ label: sl.label, href: 'finanzas' });
        b.push({ label: sl.child, href: null });
      } else if (route === 'inventario-historial' || route === 'inventario-historial-alquileres' || route === 'inventario-activo-nuevo') {
        b.push({ label: sl.label, href: 'inventario' });
        b.push({ label: sl.child, href: null });
      } else if (route === 'inventario-detail') {
        b.push({ label: sl.label, href: 'inventario' });
        const inv = INVENTARIO.find((x) => x.id === selectedInventarioId);
        b.push({ label: inv ? (inv.publicId || inv.sku) : sl.child, href: null });
      } else if (route === 'inventario-activo-detail') {
        b.push({ label: sl.label, href: 'inventario' });
        const act = (window.INVENTARIO_ACTIVOS || []).find((x) => x.id === selectedActivoId);
        b.push({ label: act ? act.codigoInterno : sl.child, href: null });
      } else if (route === 'entidades-detail') {
        b.push({ label: sl.label, href: 'entidades' });
        const ent = ENTIDADES.find((x) => x.id === selectedEntidadId);
        b.push({ label: ent ? ent.razonSocial : sl.child, href: null });
      } else if (route === 'medicos-detail') {
        b.push({ label: sl.label, href: 'medicos' });
        const med = MEDICOS.find((x) => x.id === selectedMedicoId);
        b.push({ label: med ? `${med.nombre} ${med.apellido}` : sl.child, href: null });
      } else if (route === 'particulares-detail') {
        b.push({ label: sl.label, href: 'particulares' });
        const par = PARTICULARES.find((x) => x.id === selectedParticularId);
        b.push({ label: par ? `${par.nombre} ${par.apellido}` : sl.child, href: null });
      } else if (route === 'proveedores-detail') {
        b.push({ label: sl.label, href: 'proveedores' });
        const prov = PROVEEDORES.find((x) => x.id === selectedProveedorId);
        b.push({ label: prov ? prov.razonSocial : sl.child, href: null });
      } else {
        // Rutas -nuevo / -editar (y cualquier otra con child): el módulo es
        // clickeable (vuelve a la lista), el child es el último (no link).
        const parent = route.replace(/-(nuevo|editar)$/, '');
        b.push({ label: sl.label, href: parent !== route ? parent : null });
        b.push({ label: sl.child, href: null });
      }
    } else {
      b.push({ label: sl.label, href: null });
    }
  } else {
    b.push({ label: route, href: null });
  }
  return b;
}

Object.assign(window, { SECTION_LABELS, DOC_LABELS, buildBreadcrumbs });
