/**
 * Catálogo de las vistas sobre las que el consultor escribe SQL (plan §6.7).
 *
 * Las columnas NO se repiten acá: se leen de information_schema al arrancar
 * (las que el rol soporte_ia puede ver), así que no se desincronizan.
 * Acá va lo que el modelo necesita para elegir bien: qué es cada vista, qué
 * convención tiene, y qué privilegio del ERP la habilita. Los privilegios
 * replican el filtro de cada vista en db/vistas/negocio.sql (lo controla
 * catalogo-vistas.spec.ts): la base ya filtra igual; esto solo decide qué
 * vistas se le MUESTRAN al modelo.
 */
export interface VistaCatalogo {
  vista: string;
  modulo: string;
  descripcion: string;
  /** Alcanza con uno. Vacío = cualquier usuario de la empresa. */
  privilegios: readonly string[];
  /** Privilegios que cambian QUÉ filas o columnas se ven, sin dar acceso a la vista. */
  opcionales?: readonly string[];
}

const VENTAS_VER = ['VEN_FAC_FACTURA_VER', 'VEN_POS_VENTA_VER', 'REP_FAC_REPORTE_VER'];

export const CATALOGO_VISTAS: readonly VistaCatalogo[] = [
  // ── Ventas ──
  {
    vista: 'v_ventas',
    modulo: 'Ventas',
    descripcion:
      'Facturas de venta (incluye las del punto de venta). Para totales de ventas usá vigente = true ' +
      '(excluye anuladas, canceladas, inutilizadas y rechazadas). total está en la moneda de la factura (moneda, cotizacion). ' +
      'condicion: Contado o Crédito. saldo_pendiente puede ser NULL en las de contado: para deudas de clientes usá v_cuotas_por_cobrar.',
    privilegios: VENTAS_VER,
  },
  {
    vista: 'v_ventas_lineas',
    modulo: 'Ventas',
    descripcion:
      'Productos vendidos en cada factura (una fila por línea). Para "qué/cuánto se vendió de un producto". ' +
      'Filtrá vigente = true. costo_unitario y costo_total son NULL si el usuario no puede ver costos.',
    privilegios: VENTAS_VER,
    opcionales: ['INV_STK_COSTO_VER'],
  },
  {
    vista: 'v_ventas_pagos',
    modulo: 'Ventas',
    descripcion: 'Formas de pago de cada factura de venta (efectivo, tarjeta, transferencia, cheque…).',
    privilegios: ['VEN_FAC_FACTURA_VER', 'VEN_POS_VENTA_VER'],
  },
  {
    vista: 'v_notas_credito',
    modulo: 'Ventas',
    descripcion: 'Notas de crédito de venta, con su total y la factura que afectan. vigente = true para totales.',
    privilegios: ['VEN_NC_NOTA_CREDITO_VER'],
  },
  {
    vista: 'v_documentos',
    modulo: 'Facturación electrónica',
    descripcion:
      'Documentos electrónicos (tipo FACTURA, NOTA_CREDITO, NOTA_REMISION) con su estado en SIFEN (estado_sifen: Aprobado, ' +
      'Rechazado, Pendiente, Documento firmado, Enviado, Cancelado, Error, Inutilizado) y el mensaje de SIFEN. ' +
      'Para contar o listar documentos por estado en SIFEN.',
    privilegios: ['VEN_FAC_FACTURA_VER', 'VEN_NC_NOTA_CREDITO_VER', 'VEN_NR_NOTA_REMISION_VER'],
  },
  {
    vista: 'v_presupuestos',
    modulo: 'Ventas',
    descripcion:
      'Presupuestos a clientes. estado: DRAFT, IN_REVIEW, APPROVED, SENT, VIEWED, ACCEPTED, REJECTED, EXPIRED, CONVERTED, ' +
      'FACTURADO, CANCELLED, SUPERSEDED.',
    privilegios: ['VEN_PRE_PRESUPUESTO_VER'],
  },
  {
    vista: 'v_pedidos',
    modulo: 'Ventas',
    descripcion:
      'Pedidos y órdenes de venta. tipo: venta_mayorista, compra_asistida, orden_venta. estado_orden: borrador, confirmada, ' +
      'aprobada, en_proceso, facturada_parcial, facturada, cancelada, vencida.',
    privilegios: ['VEN_PED_PEDIDO_VER', 'VEN_OV_ORDEN_VENTA_VER', 'VEN_OV_VER'],
  },
  {
    vista: 'v_sesiones_caja',
    modulo: 'Caja',
    descripcion:
      'Aperturas y cierres de caja (estado ABIERTA o CERRADA) con lo vendido por medio de pago, el monto declarado al cerrar y la diferencia.',
    privilegios: ['TES_CJA_CAJA_VER', 'TES_CAJ_CAJA_VER', 'VEN_POS_VENTA_VER'],
  },
  {
    vista: 'v_movimientos_caja',
    modulo: 'Caja',
    descripcion: 'Entradas y salidas manuales de dinero de una caja (no las ventas).',
    privilegios: ['TES_CJA_CAJA_VER', 'TES_CAJ_CAJA_VER'],
  },
  // ── Clientes y cobranzas ──
  {
    vista: 'v_clientes',
    modulo: 'Clientes',
    descripcion:
      'Clientes de la empresa. limite_credito, saldo_pendiente y credito_habilitado son NULL si el usuario no puede ver saldos.',
    privilegios: ['VEN_CLI_CLIENTE_VER'],
    opcionales: ['CRM_CLI_SALDO_VER', 'COB_CC_CUENTA_COBRAR_VER'],
  },
  {
    vista: 'v_vendedores',
    modulo: 'Ventas',
    descripcion: 'Vendedores y cobradores, con sus porcentajes de comisión y meta mensual.',
    privilegios: ['ADM_VENDCOB_VER'],
  },
  {
    vista: 'v_cuotas_por_cobrar',
    modulo: 'Cobranzas',
    descripcion:
      'Cuotas de las facturas a crédito vigentes. pendiente = true: falta cobrar (saldo). dias_atraso > 0: vencida. ' +
      'Para cartera, morosidad y "cuánto me deben".',
    privilegios: ['COB_CC_CUENTA_COBRAR_VER', 'COB_REP_REPORTE_VER', 'REP_COB_REPORTE_VER'],
  },
  {
    vista: 'v_recibos',
    modulo: 'Cobranzas',
    descripcion:
      "Recibos de cobro. Solo estado = 'emitido' es válido (anulado no cuenta). monto_cobrado: lo cobrado en el recibo.",
    privilegios: ['COB_REC_RECIBO_VER'],
  },
  {
    vista: 'v_recibos_aplicaciones',
    modulo: 'Cobranzas',
    descripcion:
      'Qué factura y cuota pagó cada recibo, y cuánto (monto_pagado). Para "cuánto se cobró de una factura" o cuánto ' +
      'tardan en pagar (fecha_dia del recibo contra fecha_dia de la factura en v_ventas, por venta_id).',
    privilegios: ['COB_REC_RECIBO_VER'],
  },
  {
    vista: 'v_recibos_medios',
    modulo: 'Cobranzas',
    descripcion: 'Con qué medio se pagó cada recibo (efectivo, cheque, transferencia…).',
    privilegios: ['COB_REC_RECIBO_VER'],
  },
  {
    vista: 'v_rendiciones_cobranza',
    modulo: 'Cobranzas',
    descripcion: 'Rendiciones de cobradores. estado: BORRADOR, PENDIENTE, OBSERVADO, APROBADO, RECHAZADO, ANULADO.',
    privilegios: ['COB_RND_RENDICION_VER'],
  },
  {
    vista: 'v_comisiones',
    modulo: 'Comisiones',
    descripcion: 'Comisiones de vendedores y cobradores. estado: pendiente, aprobada, liquidada, cancelada.',
    privilegios: ['COB_COM_COMISION_VER'],
  },
  // ── Compras y gastos ──
  {
    vista: 'v_proveedores',
    modulo: 'Compras',
    descripcion: 'Proveedores de la empresa.',
    privilegios: ['CMP_PRV_PROVEEDOR_VER'],
  },
  {
    vista: 'v_compras',
    modulo: 'Compras',
    descripcion:
      'Facturas de compra. anulada = false para totales. total en la moneda de la compra (moneda, cotizacion).',
    privilegios: ['CMP_FAC_FACTURA_PROV_VER'],
  },
  {
    vista: 'v_ordenes_compra',
    modulo: 'Compras',
    descripcion: 'Órdenes de compra. estado: pendiente_aprobacion, pendiente, parcial, completada, cancelada.',
    privilegios: ['CMP_OC_ORDEN_COMPRA_VER'],
  },
  {
    vista: 'v_cuentas_pagar',
    modulo: 'Compras',
    descripcion:
      'Cuotas a pagar a proveedores. saldo > 0: pendiente. vencida = true: pasó el vencimiento con saldo. Para "cuánto debo".',
    privilegios: ['CMP_CXP_CUENTA_PAGAR_VER', 'CMP_PP_PLAN_PAGOS_VER'],
  },
  {
    vista: 'v_pagos_proveedor',
    modulo: 'Compras',
    descripcion: 'Órdenes de pago a proveedores. estado: BORRADOR, PAGADO, ANULADA.',
    privilegios: ['CMP_OP_ORDEN_PAGO_VER', 'CMP_PAG_PAGO_PROV_VER'],
  },
  {
    vista: 'v_gastos',
    modulo: 'Gastos',
    descripcion: 'Facturas de gastos. anulado = false para totales.',
    privilegios: ['TES_GAS_GASTO_VER'],
  },
  {
    vista: 'v_gastos_lineas',
    modulo: 'Gastos',
    descripcion: 'Detalle de los gastos por tipo de gasto. Para "en qué se gastó".',
    privilegios: ['TES_GAS_GASTO_VER'],
  },
  // ── Inventario ──
  {
    vista: 'v_productos',
    modulo: 'Inventario',
    descripcion: 'Productos y servicios con su precio de venta. costo es NULL si el usuario no puede ver costos.',
    privilegios: ['INV_PRD_PRODUCTO_VER'],
    opcionales: ['INV_STK_COSTO_VER'],
  },
  {
    vista: 'v_stock',
    modulo: 'Inventario',
    descripcion:
      'Existencia de cada producto en cada depósito (disponible, reservado). bajo_minimo = true: por debajo del stock mínimo.',
    privilegios: ['INV_STK_STOCK_VER'],
  },
  {
    vista: 'v_movimientos_inventario',
    modulo: 'Inventario',
    descripcion:
      'Movimientos de inventario (compras, ventas, transferencias, ajustes). afecta_stock: 1 suma, -1 resta, 0 no cambia. ' +
      'Para "por qué cambió el stock de un producto".',
    privilegios: ['INV_MOV_MOVIMIENTO_VER', 'INV_TRF_TRANSFERENCIA_VER', 'INV_AJU_AJUSTE_VER'],
    opcionales: ['INV_STK_COSTO_VER'],
  },
  {
    vista: 'v_lotes',
    modulo: 'Inventario',
    descripcion: 'Lotes de productos con vencimiento y existencia por depósito.',
    privilegios: ['INV_LOT_LOTE_VER'],
  },
  // ── Tesorería ──
  {
    vista: 'v_cuentas_tesoreria',
    modulo: 'Tesorería',
    descripcion:
      'Cuentas de tesorería (bancos, caja chica, billeteras) con su saldo actual y la cuenta contable a la que ' +
      'se asientan (cuenta_contable_codigo / cuenta_contable; null = sin cuenta asignada, sus movimientos no generan asiento).',
    privilegios: ['TES_CTA_CUENTA_BANCARIA_VER'],
  },
  {
    vista: 'v_movimientos_tesoreria',
    modulo: 'Tesorería',
    descripcion:
      "Ingresos, egresos y transferencias entre cuentas. Solo estado = 'CONFIRMADO' afecta el saldo. " +
      'Una transferencia son dos filas con el mismo transferencia_id. asiento_numero / asiento_estado: el asiento que ' +
      'lo contabilizó (null = no tiene asiento); se_asienta_con dice si se asienta el movimiento o su documento de origen.',
    privilegios: ['TES_MOV_MOVIMIENTO_VER', 'TES_TRF_TRANSFERENCIA_VER'],
  },
  {
    vista: 'v_cheques',
    modulo: 'Tesorería',
    descripcion:
      'Cheques recibidos y emitidos. estado: EN_CARTERA, DEPOSITADO, DEBITADO, RECHAZADO, DEVUELTO, ANULADO.',
    privilegios: ['TES_CHQ_CHEQUE_VER'],
  },
  {
    vista: 'v_cotizaciones',
    modulo: 'Monedas',
    descripcion: 'Cotizaciones de monedas cargadas por la empresa, por fecha.',
    privilegios: ['ADM_COTIZ_VER', 'CONT_TC_TIPO_CAMBIO_VER'],
  },
  // ── Contabilidad ──
  {
    vista: 'v_asientos',
    modulo: 'Contabilidad',
    descripcion: 'Asientos contables. estado: BORRADOR, CONFIRMADO, REVERTIDO. origen: el documento que lo generó.',
    privilegios: ['CONT_ASI_ASIENTO_VER'],
  },
  {
    vista: 'v_asientos_lineas',
    modulo: 'Contabilidad',
    descripcion: 'Líneas de los asientos (cuenta, debe, haber en guaraníes). Para saldos o movimientos de una cuenta.',
    privilegios: ['CONT_ASI_ASIENTO_VER'],
  },
  {
    vista: 'v_plan_cuentas',
    modulo: 'Contabilidad',
    descripcion: 'Plan de cuentas. imputable = true: acepta movimientos.',
    privilegios: ['CONT_PC_CUENTA_VER'],
  },
  // ── RRHH ──
  {
    vista: 'v_empleados',
    modulo: 'RRHH',
    descripcion: 'Empleados (sin sueldos ni datos personales).',
    privilegios: ['RH_EMP_EMPLEADO_VER'],
  },
  {
    vista: 'v_liquidaciones_sueldo',
    modulo: 'RRHH',
    descripcion:
      'Liquidaciones de sueldo: solo totales de la planilla, nunca por empleado. estado: BORRADOR, PRE_LIQUIDACION, CERRADA, ANULADA.',
    privilegios: ['RH_LIQ_LIQUIDACION_VER'],
  },
  {
    vista: 'v_vacaciones',
    modulo: 'RRHH',
    descripcion: 'Solicitudes de vacaciones y días pendientes del año.',
    privilegios: ['RH_VAC_VACACION_VER'],
  },
  // ── Administración, CRM, importaciones ──
  {
    vista: 'v_empresa',
    modulo: 'Empresa',
    descripcion: 'Datos de la empresa: facturación electrónica activa, timbrado, certificado digital y suscripción.',
    privilegios: [],
  },
  {
    vista: 'v_alertas_abiertas',
    modulo: 'Empresa',
    descripcion: 'Alertas abiertas de la empresa que el usuario puede ver, con la acción sugerida.',
    privilegios: [],
  },
  {
    vista: 'v_sucursales',
    modulo: 'Empresa',
    descripcion: 'Sucursales con su establecimiento y puntos de expedición.',
    privilegios: ['ADM_SUC_SUCURSAL_VER'],
  },
  {
    vista: 'v_usuarios',
    modulo: 'Empresa',
    descripcion: 'Usuarios de la empresa y sus perfiles.',
    privilegios: ['ADM_USR_USUARIO_VER'],
  },
  {
    vista: 'v_oportunidades',
    modulo: 'CRM',
    descripcion:
      'Oportunidades comerciales del CRM con pipeline, etapa, valor y probabilidad. Sin el permiso de ver las ajenas, solo las del propio vendedor.',
    privilegios: ['CRM_OPO_OPORTUNIDAD_VER'],
    opcionales: ['CRM_OPO_OPORTUNIDAD_VER_AJENAS'],
  },
  {
    vista: 'v_embarques',
    modulo: 'Importaciones',
    descripcion: 'Embarques de importación con su estado y fechas. costo_total_gs es NULL sin permiso de ver costos.',
    privilegios: ['IMP_EMB_EMBARQUE_VER'],
    opcionales: ['IMP_COS_COSTO_VER'],
  },
  // ── Ventas · documentos y configuración ──
  {
    vista: 'v_remisiones',
    modulo: 'Ventas',
    descripcion:
      'Notas de remisión (traslado de mercadería): cliente, motivo, fechas de traslado y estado. ' +
      'El estado SIFEN detallado está en v_documentos (tipo NOTA_REMISION).',
    privilegios: ['VEN_NR_NOTA_REMISION_VER'],
  },
  {
    vista: 'v_notas_debito',
    modulo: 'Ventas',
    descripcion: 'Notas de débito de venta (cabecera, sin total).',
    privilegios: ['VEN_ND_NOTA_DEBITO_VER'],
  },
  {
    vista: 'v_autofacturas',
    modulo: 'Ventas',
    descripcion: 'Autofacturas (compras a quien no emite factura), con total y estado.',
    privilegios: ['VEN_AUTOFAC_VER'],
  },
  {
    vista: 'v_solicitudes_credito',
    modulo: 'Ventas',
    descripcion:
      'Solicitudes de crédito: términos negociados (monto, cuotas, entrega inicial) antes de facturar a crédito. ' +
      'estado: borrador, pendiente_aprobacion, aprobada, facturada, rechazada, cancelada. origen: NORMAL o REFINANCIACION.',
    privilegios: ['VEN_SOL_SOLICITUD_VER'],
  },
  {
    vista: 'v_ofertas',
    modulo: 'Ventas',
    descripcion: 'Ofertas y promociones configuradas. vigente = activa y dentro de su período.',
    privilegios: ['VEN_OFERTA_VER', 'INV_OFE_OFERTA_VER'],
  },
  {
    vista: 'v_listas_precios',
    modulo: 'Ventas',
    descripcion: 'Listas de precios (cabecera): tipo de aplicación, moneda, vigencia, descuento o recargo general.',
    privilegios: ['VEN_LISTA_VER', 'INV_LP_LISTA_VER'],
  },
  {
    vista: 'v_lista_precios_productos',
    modulo: 'Ventas',
    descripcion: 'Precio de cada producto en cada lista de precios. Para "¿a cuánto está X en la lista Y?".',
    privilegios: ['VEN_LISTA_VER', 'INV_LP_LISTA_VER'],
  },
  {
    vista: 'v_condiciones_pago',
    modulo: 'Configuración',
    descripcion:
      'Condiciones de pago configuradas (Contado, crédito a Plazo o en Cuotas), con días, cuotas y cuál es la de por defecto.',
    privilegios: ['ADM_CONDPAGO_VER', 'VEN_FAC_FACTURA_VER', 'VEN_POS_VENTA_VER'],
  },
  {
    vista: 'v_timbrados',
    modulo: 'Configuración',
    descripcion: 'Timbrados de la empresa: número, fecha de inicio y ambiente (prod/test).',
    privilegios: ['ADM_NUM_NUMERACION_VER', 'ADM_EMP_EMPRESA_VER'],
  },
  {
    vista: 'v_puntos_expedicion',
    modulo: 'Configuración',
    descripcion: 'Puntos de expedición por sucursal y caja (con qué punto se numeran los documentos).',
    privilegios: ['ADM_NUM_NUMERACION_VER', 'ADM_EMP_EMPRESA_VER'],
  },
  {
    vista: 'v_medios_pago_empresa',
    modulo: 'Configuración',
    descripcion:
      'Medios de pago habilitados en la empresa. no_mueve_dinero = true: un gasto pagado con ese medio NO genera egreso ' +
      'de tesorería y su asiento va contra cuenta_al_pagar. cuenta_al_pagar / cuenta_al_cobrar: el mapeo contable del ' +
      'medio (null sin permiso de contabilidad o si no está mapeado).',
    privilegios: ['ADM_MEDPAGO_VER', 'VEN_FAC_FACTURA_VER', 'VEN_POS_VENTA_VER'],
    opcionales: ['CONT_MAP_MAPEO_VER', 'CONT_ASI_ASIENTO_VER'],
  },
  // ── Cobranzas · gestión ──
  {
    vista: 'v_promesas_pago',
    modulo: 'Cobranzas',
    descripcion: 'Promesas de pago tomadas por los cobradores: fecha prometida, monto, estado y cumplimiento.',
    privilegios: ['COB_PRM_PROMESA_VER'],
  },
  {
    vista: 'v_gestiones_cobranza',
    modulo: 'Cobranzas',
    descripcion:
      'Gestiones de cobranza (visitas, llamadas, mensajes) con su resultado y próxima acción. ' +
      'Sin el privilegio de ver gestiones ajenas, solo las del cobrador del usuario.',
    privilegios: ['COB_WFL_GESTION_VER'],
    opcionales: ['COB_WFL_VER_GESTIONES_AJENAS'],
  },
  {
    vista: 'v_refinanciaciones',
    modulo: 'Cobranzas',
    descripcion: 'Refinanciaciones de deuda: capital original, interés exonerado, nuevas cuotas y estado.',
    privilegios: ['COB_REF_REFINANCIACION_VER'],
  },
  {
    vista: 'v_retenciones_recibidas',
    modulo: 'Cobranzas',
    descripcion: 'Retenciones (IVA/Renta) que los clientes aplicaron al pagar, con su comprobante.',
    privilegios: ['COB_RET_RETENCION_VER'],
  },
  {
    vista: 'v_saldos_a_favor',
    modulo: 'Cobranzas',
    descripcion: 'Saldos a favor de clientes (pagos de más, devoluciones) y cuánto queda disponible.',
    privilegios: ['COB_SF_SALDO_VER'],
  },
  {
    vista: 'v_cobros_online',
    modulo: 'Cobranzas',
    descripcion: 'Cobros online de Novasis Pay: monto, comprador y estado (pendiente, pagado, expirado…).',
    privilegios: ['NOV_COBROS_VER', 'EC_PAG_PAGO_VER'],
  },
  {
    vista: 'v_links_pago',
    modulo: 'Cobranzas',
    descripcion: 'Links de pago enviados a clientes: origen, monto, estado y vencimiento.',
    privilegios: ['FIS_BAN_BANCARD_VER', 'EC_PAG_PAGO_VER'],
  },
  // ── Compras · documentos ──
  {
    vista: 'v_notas_credito_compra',
    modulo: 'Compras',
    descripcion: 'Notas de crédito recibidas de proveedores, con total y si afectan stock.',
    privilegios: ['CMP_NCC_NOTA_CREDITO_VER'],
  },
  {
    vista: 'v_recepciones_compra',
    modulo: 'Compras',
    descripcion: 'Recepciones de mercadería contra órdenes de compra: depósito, fecha y estado.',
    privilegios: ['CMP_REC_RECEPCION_VER'],
  },
  {
    vista: 'v_ordenes_pago',
    modulo: 'Compras',
    descripcion: 'Órdenes de pago a proveedores. estado: BORRADOR, PAGADO, ANULADA.',
    privilegios: ['CMP_OP_ORDEN_PAGO_VER'],
  },
  {
    vista: 'v_requisiciones',
    modulo: 'Compras',
    descripcion:
      'Requisiciones internas (pedidos de compra o gasto con aprobación). estado: borrador, pendiente_aprobacion, ' +
      'aprobada, rechazada, cancelada, ejecutada_parcial, ejecutada_total.',
    privilegios: ['CMP_REQ_REQUISICION_VER'],
  },
  // ── Inventario ──
  {
    vista: 'v_depositos',
    modulo: 'Inventario',
    descripcion: 'Depósitos por sucursal (dónde se guarda stock).',
    privilegios: ['INV_DEP_DEPOSITO_VER', 'INV_STK_STOCK_VER'],
  },
  {
    vista: 'v_presentaciones_producto',
    modulo: 'Inventario',
    descripcion: 'Presentaciones de cada producto (caja de 12, pack…): nombre, unidades que contiene y precio.',
    privilegios: ['INV_PRD_PRODUCTO_VER'],
  },
  // ── Tesorería · conciliación y arqueos ──
  {
    vista: 'v_extractos_bancarios',
    modulo: 'Tesorería',
    descripcion: 'Extractos bancarios importados (período y saldos), para conciliar banco contra sistema.',
    privilegios: ['TES_CONC_CONCILIACION_VER'],
  },
  {
    vista: 'v_extractos_lineas',
    modulo: 'Tesorería',
    descripcion:
      'Cada movimiento del extracto del banco y si quedó conciliado (conciliada) o sin correspondencia en el sistema. ' +
      'Para "¿qué movimientos del banco no están en el sistema?".',
    privilegios: ['TES_CONC_CONCILIACION_VER'],
  },
  {
    vista: 'v_arqueos_caja',
    modulo: 'Tesorería',
    descripcion: 'Arqueos de caja: total contado contra total del sistema y la diferencia.',
    privilegios: ['TES_CJA_CAJA_VER', 'TES_CAJ_CAJA_VER', 'VEN_POS_VENTA_VER'],
  },
  // ── Contabilidad · configuración ──
  {
    vista: 'v_periodos_contables',
    modulo: 'Contabilidad',
    descripcion:
      'Períodos contables por ejercicio y su estado (ABIERTO/CERRADO). Un asiento solo entra en un período ABIERTO: ' +
      'si algo "no se contabiliza", revisá el período de esa fecha.',
    privilegios: ['CONT_PER_PERIODO_VER', 'CONT_EJE_EJERCICIO_VER', 'CONT_ASI_ASIENTO_VER'],
  },
  {
    vista: 'v_centros_costo',
    modulo: 'Contabilidad',
    descripcion: 'Centros de costo configurados.',
    privilegios: ['CONT_CC_CENTRO_COSTO_VER'],
  },
  {
    vista: 'v_mapeo_cuentas',
    modulo: 'Contabilidad',
    descripcion:
      'Mapeo contable: qué cuenta del plan usa cada concepto (VENTA_CONTADO, GASTO_…, etc.). ' +
      'Un concepto sin cuenta asignada hace que ese documento no genere asiento.',
    privilegios: ['CONT_MAP_MAPEO_VER'],
  },
  // ── RRHH · asistencia y legajo ──
  {
    vista: 'v_asistencia',
    modulo: 'RRHH',
    descripcion: 'Marcaciones de asistencia por empleado y día (hora de entrada y salida).',
    privilegios: ['RH_MAR_MARCACION_VER'],
  },
  {
    vista: 'v_legajo_documentos',
    modulo: 'RRHH',
    descripcion: 'Documentos del legajo de cada empleado y sus vencimientos (sin el archivo).',
    privilegios: ['RH_LEG_LEGAJO_VER', 'RH_LEG_DOCUMENTO_VER', 'RH_VEN_VENCIMIENTO_VER'],
  },
  // ── CRM ──
  {
    vista: 'v_leads',
    modulo: 'CRM',
    descripcion: 'Leads (contactos aún no clientes): origen, campaña, estado y si se convirtieron.',
    privilegios: ['CRM_LEA_LEAD_VER'],
  },
  {
    vista: 'v_actividades_crm',
    modulo: 'CRM',
    descripcion: 'Actividades y tareas del CRM (llamadas, visitas, reuniones): programadas, realizadas y su resultado.',
    privilegios: ['CRM_ACT_ACTIVIDAD_VER'],
  },
  // ── Ecommerce ──
  {
    vista: 'v_tienda_online',
    modulo: 'Ecommerce',
    descripcion:
      'Configuración de la tienda online: subdominio, estado (borrador/publicada), sucursal, depósito y lista de precios que usa. ' +
      'Los pedidos de la tienda están en v_pedidos.',
    privilegios: ['EC_CFG_TIENDA_VER'],
  },
  // ── Inmobiliario ──
  {
    vista: 'v_inm_proyectos',
    modulo: 'Inmobiliario',
    descripcion: 'Proyectos inmobiliarios: tipo, estado y fechas de entrega.',
    privilegios: ['INM_PRO_PROYECTO_VER'],
  },
  {
    vista: 'v_inm_unidades',
    modulo: 'Inmobiliario',
    descripcion:
      'Unidades de cada proyecto (deptos, lotes): tipología, superficie, precio de lista y estado (disponible, reservada, vendida…).',
    privilegios: ['INM_UNI_UNIDAD_VER'],
  },
  {
    vista: 'v_inm_operaciones',
    modulo: 'Inmobiliario',
    descripcion:
      'Operaciones (reservas y boletos): unidad, cliente, precio final, estado y estado del legajo de cumplimiento.',
    privilegios: ['INM_OPE_OPERACION_VER'],
  },
  {
    vista: 'v_inm_cuotas',
    modulo: 'Inmobiliario',
    descripcion: 'Cuotas del plan de pago de cada operación inmobiliaria: vencimiento, monto, cobrado y estado.',
    privilegios: ['INM_OPE_OPERACION_VER', 'INM_COB_CARTERA_VER'],
  },
  {
    vista: 'v_inm_cobros',
    modulo: 'Inmobiliario',
    descripcion: 'Cobros del módulo inmobiliario, con moneda de pago y equivalente en guaraníes.',
    privilegios: ['INM_COB_CARTERA_VER'],
  },
  // ── Importaciones ──
  {
    vista: 'v_despachos_importacion',
    modulo: 'Importaciones',
    descripcion: 'Despachos aduaneros de cada embarque, con sus tributos (arancel, IVA, ISC…).',
    privilegios: ['IMP_DES_DESPACHO_VER'],
  },
  // ── Suscripción ──
  {
    vista: 'v_modulos_contratados',
    modulo: 'Suscripción',
    descripcion:
      'Qué módulos y submódulos incluye el plan de la empresa y si están activos. Puede haber suscripciones viejas: ' +
      'filtrá estado_suscripcion = \'Activo\'. Para "¿por qué no veo tal módulo?": si no está o está inactivo no es ' +
      'una falla, es el plan contratado.',
    privilegios: [],
  },
];

export function vistasDelUsuario(privilegios: ReadonlySet<string>): {
  permitidas: VistaCatalogo[];
  sinPermiso: VistaCatalogo[];
} {
  const permitidas: VistaCatalogo[] = [];
  const sinPermiso: VistaCatalogo[] = [];
  for (const v of CATALOGO_VISTAS) {
    const puede = v.privilegios.length === 0 || v.privilegios.some((p) => privilegios.has(p));
    (puede ? permitidas : sinPermiso).push(v);
  }
  return { permitidas, sinPermiso };
}
