program Gestion;

uses
  Vcl.Forms,
  Vcl.Dialogs,
  System.SysUtils,
  System.UITypes,
  Data.DB,
  IdSSLOpenSSLHeaders,
  frm_Main in 'src\UI\frm_Main.pas' {frmMain},
  dmg_Main in 'src\Data\dmg_Main.pas' {dmgMain: TDataModule},
  uLotesLogic in 'src\Logic\uLotesLogic.pas',
  uAppTheme in 'src\Common\uAppTheme.pas',
  uRichEditHtmlHelper in 'src\Common\uRichEditHtmlHelper.pas',
  uDbParamsHelper in 'src\Common\uDbParamsHelper.pas',
  frm_LotesCreator in 'src\UI\frm_LotesCreator.pas' {frmLotesCreator},
  frm_Lotes in 'src\UI\frm_Lotes.pas' {frmLotes},
  frm_Login in 'src\UI\frm_Login.pas' {frmLogin},
  frm_SelectCompany in 'src\UI\frm_SelectCompany.pas' {frmSelectCompany},
  frm_Empresas in 'src\UI\frm_Empresas.pas' {frmEmpresas},
  frm_Alergenos in 'src\UI\frm_Alergenos.pas' {frmAlergenos},
  frm_AlergenosEditor in 'src\UI\frm_AlergenosEditor.pas' {frmAlergenosEditor},
  frm_TiposIva in 'src\UI\frm_TiposIva.pas' {frmTiposIva},
  frm_TiposIvaEditor in 'src\UI\frm_TiposIvaEditor.pas' {frmTiposIvaEditor},
  frm_Albaranes in 'src\UI\frm_Albaranes.pas' {frmAlbaranes},
  frm_Facturas in 'src\UI\frm_Facturas.pas' {frmFacturas},
  frm_FacturasEditor in 'src\UI\frm_FacturasEditor.pas' {frmFacturasEditor},
  frm_DocumentosRelacionados in 'src\UI\frm_DocumentosRelacionados.pas' {frmDocumentosRelacionados},
  uFacturaPrintService in 'src\UI\uFacturaPrintService.pas',
  uPedidoPrintService in 'src\UI\uPedidoPrintService.pas',
  uAlbaranPrintService in 'src\UI\uAlbaranPrintService.pas',
  uPresupuestoPrintService in 'src\UI\uPresupuestoPrintService.pas',
  uFormatosImpresionService in 'src\Common\uFormatosImpresionService.pas',
  uEdicomInvoiceExporter in 'src\UI\uEdicomInvoiceExporter.pas',
  uEdicomDesadvExporter in 'src\UI\uEdicomDesadvExporter.pas',
  uEtiquetaBultoECIService in 'src\UI\uEtiquetaBultoECIService.pas',
  uPdfRotateService in 'src\Common\uPdfRotateService.pas',
  uEdicomWsClient in 'src\Logic\uEdicomWsClient.pas',
  frm_EmpresasEditor in 'src\UI\frm_EmpresasEditor.pas' {frmEmpresasEditor},
  frm_AlbaranesEditor in 'src\UI\frm_AlbaranesEditor.pas' {frmAlbaranesEditor},
  frm_SelectProduct in 'src\UI\frm_SelectProduct.pas' {frmSelectProduct},
  frm_SelectCliente in 'src\UI\frm_SelectCliente.pas' {frmSelectCliente},
  frm_SelectDestino in 'src\UI\frm_SelectDestino.pas' {frmSelectDestino},
  frm_SelectLote in 'src\UI\frm_SelectLote.pas' {frmSelectLote},
  frm_SelectAlergeno in 'src\UI\frm_SelectAlergeno.pas' {frmSelectAlergeno},
  frm_SelectPedidoPreparado in 'src\UI\frm_SelectPedidoPreparado.pas' {frmSelectPedidoPreparado},
  frm_Articulos in 'src\UI\frm_Articulos.pas' {frmArticulos},
  frm_ArticulosEditor in 'src\UI\frm_ArticulosEditor.pas' {frmArticulosEditor},
  frm_ArticulosEans in 'src\UI\frm_ArticulosEans.pas' {frmArticulosEans},
  frm_ArticulosClientesEan in 'src\UI\frm_ArticulosClientesEan.pas' {frmArticulosClientesEan},
  frm_Familias in 'src\UI\frm_Familias.pas' {frmFamilias},
  frm_FamiliasEditor in 'src\UI\frm_FamiliasEditor.pas' {frmFamiliasEditor},
  frm_ImportarFactusol in 'src\UI\frm_ImportarFactusol.pas' {frmImportarFactusol},
  frm_MateriasPrimas in 'src\UI\frm_MateriasPrimas.pas' {frmMateriasPrimas},
  frm_MateriasPrimasEditor in 'src\UI\frm_MateriasPrimasEditor.pas' {frmMateriasPrimasEditor},
  frm_Recetas in 'src\UI\frm_Recetas.pas' {frmRecetas},
  frm_RecetasEditor in 'src\UI\frm_RecetasEditor.pas' {frmRecetasEditor},
  frm_SelectMateriaPrima in 'src\UI\frm_SelectMateriaPrima.pas' {frmSelectMateriaPrima},
  frm_OrdenesFabricacion in 'src\UI\frm_OrdenesFabricacion.pas' {frmOrdenesFabricacion},
  frm_OrdenesFabricacionEditor in 'src\UI\frm_OrdenesFabricacionEditor.pas' {frmOrdenesFabricacionEditor},
  frm_CalendarioProduccion in 'src\UI\frm_CalendarioProduccion.pas' {frmCalendarioProduccion},
  frm_DiaDetalleProduccion in 'src\UI\frm_DiaDetalleProduccion.pas' {frmDiaDetalleProduccion},
  frm_OrdenProduccionEditor in 'src\UI\frm_OrdenProduccionEditor.pas' {frmOrdenProduccionEditor},
  frm_MonitorFabricacion in 'src\UI\frm_MonitorFabricacion.pas' {frmMonitorFabricacion},
  uBaseForm in 'src\UI\uBaseForm.pas' {frmBase},
  uDbErrorHandler in 'src\Common\uDbErrorHandler.pas',
  frm_DbErrorDialog in 'src\UI\frm_DbErrorDialog.pas' {frmDbErrorDialog},
  uProvAlbaranes in 'src\UI\uProvAlbaranes.pas' {frmProvAlbaranes},
  uProvFacturas in 'src\UI\uProvFacturas.pas' {frmProvFacturas},
  frm_ProvAlbaranes in 'src\UI\frm_ProvAlbaranes.pas' {frmProvAlbaranesList},
  frm_ProvFacturas in 'src\UI\frm_ProvFacturas.pas' {frmProvFacturasList},
  frm_ProvPresupuestos in 'src\UI\frm_ProvPresupuestos.pas' {frmProvPresupuestosList},
  frm_ProvAlbaranesEditor in 'src\UI\frm_ProvAlbaranesEditor.pas' {frmProvAlbaranesEditor},
  frm_ProvFacturasEditor in 'src\UI\frm_ProvFacturasEditor.pas' {frmProvFacturasEditor},
  frm_ProvPresupuestosEditor in 'src\UI\frm_ProvPresupuestosEditor.pas' {frmProvPresupuestosEditor},
  uUIAutoScaler in 'src\UI\uUIAutoScaler.pas',
  frm_DbConfig in 'src\UI\frm_DbConfig.pas' {frmDbConfig},
  uDBGridHelper in 'src\UI\uDBGridHelper.pas',
  frm_BaseSelect in 'src\UI\frm_BaseSelect.pas' {frmBaseSelect},
  frm_BaseList in 'src\UI\frm_BaseList.pas' {frmBaseList},
  frm_VentasPreciosHistorico in 'src\UI\frm_VentasPreciosHistorico.pas' {frmVentasPreciosHistorico},
  frm_EventosMaterialesCat in 'src\UI\frm_EventosMaterialesCat.pas' {frmEventosMaterialesCat},
  frm_EventosMaterialesCatEditor in 'src\UI\frm_EventosMaterialesCatEditor.pas' {frmEventosMaterialesCatEditor},
  frm_SelectEventMaterial in 'src\UI\frm_SelectEventMaterial.pas' {frmSelectEventMaterial},
  frm_Eventos in 'src\UI\frm_Eventos.pas' {frmEventos},
  frm_EventosEditor in 'src\UI\frm_EventosEditor.pas' {frmEventosEditor},
  frm_Usuarios in 'src\UI\frm_Usuarios.pas' {frmUsuarios},
  frm_UsuariosEditor in 'src\UI\frm_UsuariosEditor.pas' {frmUsuariosEditor},
  frm_Clientes in 'src\UI\frm_Clientes.pas' {frmClientes},
  frm_ClientesEditor in 'src\UI\frm_ClientesEditor.pas' {frmClientesEditor},
  frm_ClientesGrupos in 'src\UI\frm_ClientesGrupos.pas' {frmClientesGrupos},
  frm_ClientesGruposEditor in 'src\UI\frm_ClientesGruposEditor.pas' {frmClientesGruposEditor},
  frm_ClientesDestinosEditor in 'src\UI\frm_ClientesDestinosEditor.pas' {frmClientesDestinosEditor},
  frm_Proveedores in 'src\UI\frm_Proveedores.pas' {frmProveedoresList},
  frm_ProveedoresEditor in 'src\UI\frm_ProveedoresEditor.pas' {frmProveedoresEditor},
  frm_Almacenes in 'src\UI\frm_Almacenes.pas' {frmAlmacenes},
  frm_AlmacenesEditor in 'src\UI\frm_AlmacenesEditor.pas' {frmAlmacenesEditor},
  frm_Obradores in 'src\UI\frm_Obradores.pas' {frmObradores},
  frm_ObradoresEditor in 'src\UI\frm_ObradoresEditor.pas' {frmObradoresEditor},
  frm_Tiendas in 'src\UI\frm_Tiendas.pas' {frmTiendas},
  frm_TiendasEditor in 'src\UI\frm_TiendasEditor.pas' {frmTiendasEditor},
  frm_Series in 'src\UI\frm_Series.pas' {frmSeries},
  frm_SeriesEditor in 'src\UI\frm_SeriesEditor.pas' {frmSeriesEditor},
  frm_FormasPago in 'src\UI\frm_FormasPago.pas' {frmFormasPago},
  frm_FormasPagoEditor in 'src\UI\frm_FormasPagoEditor.pas' {frmFormasPagoEditor},
  frm_AsignarMateriasPrimas in 'src\UI\frm_AsignarMateriasPrimas.pas' {frmAsignarMateriasPrimas},
  frm_EntradasMateriasPrimas in 'src\UI\frm_EntradasMateriasPrimas.pas' {frmEntradasMateriasPrimas},
  frm_Inventarios in 'src\UI\frm_Inventarios.pas' {frmInventarios},
  frm_InventariosEditor in 'src\UI\frm_InventariosEditor.pas' {frmInventariosEditor},
  frm_Presupuestos in 'src\UI\frm_Presupuestos.pas' {frmPresupuestos},
  frm_PresupuestosEditor in 'src\UI\frm_PresupuestosEditor.pas' {frmPresupuestosEditor},
  uEdicomProcessor in 'src\Common\uEdicomProcessor.pas',
  frm_Pedidos in 'src\UI\frm_Pedidos.pas' {frmPedidos},
  frm_PedidosEditor in 'src\UI\frm_PedidosEditor.pas' {frmPedidosEditor},
  frm_ArticulosProveedor in 'src\UI\frm_ArticulosProveedor.pas' {frmArticulosProveedor},
  uProvPreciosService in 'src\Logic\uProvPreciosService.pas',
  frm_ProvPreciosVariaciones in 'src\UI\frm_ProvPreciosVariaciones.pas' {frmProvPreciosVariaciones},
  frm_Incidencias in 'src\UI\frm_Incidencias.pas' {frmIncidencias},
  frm_IncidenciasEditor in 'src\UI\frm_IncidenciasEditor.pas' {frmIncidenciasEditor},
  frm_FormatosPresentacion in 'src\UI\frm_FormatosPresentacion.pas' {frmFormatosPresentacion},
  frm_FormatosPresentacionEditor in 'src\UI\frm_FormatosPresentacionEditor.pas' {frmFormatosPresentacionEditor},
  frm_FormatosEnvio in 'src\UI\frm_FormatosEnvio.pas' {frmFormatosEnvio},
  frm_FormatosEnvioEditor in 'src\UI\frm_FormatosEnvioEditor.pas' {frmFormatosEnvioEditor},
  frm_ReportTemplates in 'src\UI\frm_ReportTemplates.pas' {frmReportTemplates},
  frm_ConfigEnvio in 'src\UI\frm_ConfigEnvio.pas' {frmConfigEnvio},
  frm_ConfigEnvioEditor in 'src\UI\frm_ConfigEnvioEditor.pas' {frmConfigEnvioEditor},
  frm_PrintOptions in 'src\UI\frm_PrintOptions.pas' {frmPrintOptions},
  dlg_ClonarTarifa in 'src\UI\dlg_ClonarTarifa.pas' {dlgClonarTarifa},
  dlg_SelectClientesEmail in 'src\UI\dlg_SelectClientesEmail.pas' {dlgSelectClientesEmail},
  uEnviarDocumento in 'src\UI\uEnviarDocumento.pas' {fEnviarDocumento},
  uEmailWhatsApp in 'src\Common\uEmailWhatsApp.pas',
  frm_FichaTecnicaEditor in 'src\UI\frm_FichaTecnicaEditor.pas' {frmFichaTecnicaEditor},
  // ── Sistema de Envíos Multi-Transportista ──────────────────────────────────
  uEnviosTypes in 'src\Logic\uEnviosTypes.pas',
  uEnviosTipsaClient in 'src\Logic\uEnviosTipsaClient.pas',
  uEnviosNacexClient in 'src\Logic\uEnviosNacexClient.pas',
  uEnviosClient in 'src\Logic\uEnviosClient.pas',
  frm_EnviosConfig in 'src\UI\frm_EnviosConfig.pas' {frmEnviosConfig},
  frm_EnviosRecogida in 'src\UI\frm_EnviosRecogida.pas' {frmEnviosRecogida},
  frm_Transportistas in 'src\UI\frm_Transportistas.pas' {frmTransportistas},
  frm_TransportistasEditor in 'src\UI\frm_TransportistasEditor.pas' {frmTransportistasEditor},
  frm_FirmaRecogida in 'src\UI\frm_FirmaRecogida.pas' {frmFirmaRecogida},
  frm_StockEnvasado in 'src\UI\frm_StockEnvasado.pas' {frmStockEnvasado},
  frm_StockEnvasadoEditor in 'src\UI\frm_StockEnvasadoEditor.pas' {frmStockEnvasadoEditor},
  frm_InventarioStockEnvasado in 'src\UI\frm_InventarioStockEnvasado.pas' {frmInventarioStockEnvasado},
  frm_MovimientosInternos in 'src\UI\frm_MovimientosInternos.pas' {frmMovimientosInternos},
  frm_MovimientoInternoEditor in 'src\UI\frm_MovimientoInternoEditor.pas' {frmMovimientoInternoEditor},
  dlg_PegarListaCodigos in 'src\UI\dlg_PegarListaCodigos.pas' {dlgPegarListaCodigos},
  frm_CentrosZonas in 'src\UI\frm_CentrosZonas.pas' {frmCentrosZonas},
  frm_CentrosZonasEditor in 'src\UI\frm_CentrosZonasEditor.pas' {frmCentrosZonasEditor},
  frm_ZonasEquiposEditor in 'src\UI\frm_ZonasEquiposEditor.pas' {frmZonasEquiposEditor},
  frm_EquiposSensoresEditor in 'src\UI\frm_EquiposSensoresEditor.pas' {frmEquiposSensoresEditor},
  frm_RegistrarOperarioZona in 'src\UI\frm_RegistrarOperarioZona.pas' {frmRegistrarOperarioZona},
  frm_LotesProcesosEditor in 'src\UI\frm_LotesProcesosEditor.pas' {frmLotesProcesosEditor},
  frm_EnviosList in 'src\UI\frm_EnviosList.pas' {frmEnviosList},
  frm_AlbaranEnvioEditor in 'src\UI\frm_AlbaranEnvioEditor.pas' {frmAlbaranEnvioEditor},
  frm_SelectImpresoraEnvio in 'src\UI\frm_SelectImpresoraEnvio.pas' {frmSelectImpresoraEnvio},
  uIAService in 'src\Logic\uIAService.pas',
  frm_ChatIA in 'src\UI\frm_ChatIA.pas' {frmChatIA},
  uEnviosWebImporter in 'src\Logic\uEnviosWebImporter.pas',
  frm_ImportarPedidosWeb in 'src\UI\frm_ImportarPedidosWeb.pas' {frmImportarPedidosWeb},
  uValidacionFiscal in 'src\Common\uValidacionFiscal.pas',
  uGS1BarcodeParser in 'src\Common\uGS1BarcodeParser.pas',
  frm_CodigosBarrasCompleto in 'src\UI\frm_CodigosBarrasCompleto.pas' {frmCodigosBarrasCompleto},
  frm_ClientesPrecios in 'src\UI\frm_ClientesPrecios.pas' {frmClientesPrecios},
  // ── Módulo de Calidad e Inocuidad Alimentaria (IFS Food v8) ───────────────
  dmg_Calidad in 'src\Data\dmg_Calidad.pas' {dmgCalidad: TDataModule},
  uCalidadHitosService in 'src\Data\uCalidadHitosService.pas',
  frm_CalidadHitos in 'src\UI\frm_CalidadHitos.pas' {frmCalidadHitos},
  frm_CalidadHitosEditor in 'src\UI\frm_CalidadHitosEditor.pas' {frmCalidadHitosEditor},
  frm_SelectCalidadDocumento in 'src\UI\frm_SelectCalidadDocumento.pas' {frmSelectCalidadDocumento},
  frm_CalidadRegistrosList in 'src\UI\frm_CalidadRegistrosList.pas' {frmCalidadRegistrosList},
  frm_CalidadRegistroEditor in 'src\UI\frm_CalidadRegistroEditor.pas' {frmCalidadRegistroEditor},
  frm_CalidadIncidenciasEditor in 'src\UI\frm_CalidadIncidenciasEditor.pas' {frmCalidadIncidenciasEditor},
  frm_CalidadIncidenciasList in 'src\UI\frm_CalidadIncidenciasList.pas' {frmCalidadIncidenciasList},
  frm_CalidadPrerrequisitosEditor in 'src\UI\frm_CalidadPrerrequisitosEditor.pas' {frmCalidadPrerrequisitosEditor},
  frm_CalidadVerificacionDiaria in 'src\UI\frm_CalidadVerificacionDiaria.pas' {frmCalidadVerificacionDiaria},
  frm_CalidadTrazabilidadMaestra in 'src\UI\frm_CalidadTrazabilidadMaestra.pas' {frmCalidadTrazabilidadMaestra},
  frm_CalidadGruposEditor in 'src\UI\frm_CalidadGruposEditor.pas' {frmCalidadGruposEditor},
  frm_CalidadGrupos in 'src\UI\frm_CalidadGrupos.pas' {frmCalidadGrupos},
  frm_CalidadDocumentosList in 'src\UI\frm_CalidadDocumentosList.pas' {frmCalidadDocumentosList},
  frm_CalidadDocumentoEditor in 'src\UI\frm_CalidadDocumentoEditor.pas' {frmCalidadDocumentoEditor},
  frm_CalidadPlannerList in 'src\UI\frm_CalidadPlannerList.pas' {frmCalidadPlannerList},
  frm_PrepararPedidos in 'src\UI\frm_PrepararPedidos.pas' {frmPrepararPedidos},
  frm_PreparacionPedidoEditor in 'src\UI\frm_PreparacionPedidoEditor.pas' {frmPreparacionPedidoEditor},
  DelphiZXingQRCode in 'src\Common\DelphiZXingQRCode.pas',
  frm_PrintEtiquetasStock in 'src\UI\frm_PrintEtiquetasStock.pas' {frmPrintEtiquetasStock},
  frm_Trabajadores in 'src\UI\frm_Trabajadores.pas' {frmTrabajadores},
  frm_TrabajadoresEditor in 'src\UI\frm_TrabajadoresEditor.pas' {frmTrabajadoresEditor},
  frm_TrabajadoresFichajes in 'src\UI\frm_TrabajadoresFichajes.pas' {frmTrabajadoresFichajes},
  frm_TrabajadoresGrupos in 'src\UI\frm_TrabajadoresGrupos.pas' {frmTrabajadoresGrupos},
  frm_TrabajadoresGruposEditor in 'src\UI\frm_TrabajadoresGruposEditor.pas' {frmTrabajadoresGruposEditor},
  frm_TrabajadorFichajeEditorModal in 'src\UI\frm_TrabajadorFichajeEditorModal.pas' {frmTrabajadorFichajeEditorModal},
  frm_DiaFichajesDetalleModal in 'src\UI\frm_DiaFichajesDetalleModal.pas' {frmDiaFichajesDetalleModal},
  frm_TrabajadorContratoModal in 'src\UI\frm_TrabajadorContratoModal.pas' {frmTrabajadorContratoModal},
  frm_CalendarioLaboral in 'src\UI\frm_CalendarioLaboral.pas' {frmCalendarioLaboral},
  frm_CalendarioLaboralEditor in 'src\UI\frm_CalendarioLaboralEditor.pas' {frmCalendarioLaboralEditor},
  // ── Monitor de Termómetro Bluetooth BLE (MeatMeet Pro) ─────────────────────
  uMeatMeetBLE in 'src\Common\uMeatMeetBLE.pas',
  frm_TermometroMonitor in 'src\UI\frm_TermometroMonitor.pas' {frmTermometroMonitor},
  // ── Subsistema AEAT Veri*Factu (RD 1007/2023) ──────────────────────────────
  uVeriFactuTypes in 'src\Common\uVeriFactuTypes.pas',
  uSifCrypto in 'src\Logic\uSifCrypto.pas',
  uSifEventLogger in 'src\Logic\uSifEventLogger.pas',
  uSifWsClient in 'src\Logic\uSifWsClient.pas',
  uSifXmlBuilder in 'src\Logic\uSifXmlBuilder.pas',
  uVeriFactuService in 'src\Logic\uVeriFactuService.pas',
  // ── Subsistema de Logística y Envíos Tipsa ─────────────────────────────────
  uTipsaTypes in 'src\Logic\uTipsaTypes.pas',
  uTipsaClient in 'src\Logic\uTipsaClient.pas',
  frm_TipsaConfig in 'src\UI\frm_TipsaConfig.pas' {frmTipsaConfig},
  frm_TipsaRecogida in 'src\UI\frm_TipsaRecogida.pas' {frmTipsaRecogida},
  // ── Módulos Auxiliares de UI y Configuración ───────────────────────────────
  frm_AsignarArticulosWeb in 'src\UI\frm_AsignarArticulosWeb.pas' {frmAsignarArticulosWeb},
  frm_ClientesGruposPrecios in 'src\UI\frm_ClientesGruposPrecios.pas' {frmClientesGruposPrecios},
  uConfigEmail in 'src\UI\uConfigEmail.pas' {fConfigEmail};


{$R *.res}

var
  LUserRole: string;

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  
  // Forzar a Indy a cargar las librerías OpenSSL desde la carpeta del ejecutable
  IdSSLOpenSSLHeaders.IdOpenSSLSetLibPath(ExtractFilePath(ParamStr(0)));

  // Registrar el manejador de excepciones de base de datos de manera global
  TDbErrorHandler.RegisterGlobalHandler;
  
  // Primero los DataModules
  Application.CreateForm(TdmgMain, dmgMain);
  Application.CreateForm(TdmgCalidad, dmgCalidad);

  // Interceptar inicio para comprobar el INI de conexión
  if not dmgMain.HasConfig then
  begin
    Application.CreateForm(TfrmDbConfig, frmDbConfig);
    try
      if frmDbConfig.ShowModal <> mrOk then
      begin
        ShowMessage('La aplicación no puede iniciarse sin configurar la conexión a la base de datos.');
        Halt(0);
      end;
    finally
      frmDbConfig.Free;
    end;
  end;

  // Cargar la configuración actual y conectar
  try
    dmgMain.LoadConfig;
    dmgMain.Connect;
  except
    on E: Exception do
    begin
      ShowMessage('Error de conexión a la Base de Datos: ' + E.Message + #13#10 + 
                  'Por favor, revise la configuración de acceso.');
      // Mostrar el formulario de configuración para que puedan corregir
      Application.CreateForm(TfrmDbConfig, frmDbConfig);
      try
        if frmDbConfig.ShowModal <> mrOk then
          Halt(0);
      finally
        frmDbConfig.Free;
      end;
      
      // Intentar reconectar tras corrección
      try
        dmgMain.LoadConfig;
        dmgMain.Connect;
      except
        on E2: Exception do
        begin
          ShowMessage('Imposible conectar con la Base de Datos: ' + E2.Message);
          Halt(0);
        end;
      end;
    end;
  end;

  // Flujo de inicio de sesión dinámico condicional
  LUserRole := 'ADMIN';
  try
    dmgMain.qryExec.Close;
    dmgMain.qryExec.SQL.Text := 'SELECT COUNT(*) as cant FROM ge_usuarios WHERE activo = 1';
    dmgMain.qryExec.Open;
    if not dmgMain.qryExec.IsEmpty and (dmgMain.qryExec.FieldByName('cant').AsInteger > 1) then
    begin
      dmgMain.qryExec.Close;
      // Más de 1 usuario activo: Mostrar pantalla de Login obligatoria
      Application.CreateForm(TfrmLogin, frmLogin);
      try
        if frmLogin.ShowModal = mrOk then
        begin
          LUserRole := frmLogin.LoggedRole;
          if LUserRole = '' then LUserRole := 'ADMIN';
        end
        else
        begin
          Halt(0);
        end;
      finally
        frmLogin.Free;
      end;
    end
    else
    begin
      // 1 único usuario activo (o menor): Autologuear de forma transparente
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'SELECT id, rol FROM ge_usuarios WHERE activo = 1 LIMIT 1';
      dmgMain.qryExec.Open;
      if not dmgMain.qryExec.IsEmpty then
      begin
        dmgMain.CurrentUserId := TdmgMain.CleanUUID(dmgMain.qryExec.FieldByName('id').AsString);
        LUserRole := dmgMain.qryExec.FieldByName('rol').AsString;
        if LUserRole = '' then LUserRole := 'ADMIN';
      end
      else
      begin
        // Por seguridad, si no hay usuarios registrados, usar admin por defecto (id=1)
        dmgMain.CurrentUserId := '1';
        LUserRole := 'ADMIN';
      end;
      dmgMain.qryExec.Close;
    end;
  except
    on E: Exception do
    begin
      // Fallback robusto ante fallos
      dmgMain.CurrentUserId := '1';
      LUserRole := 'ADMIN';
    end;
  end;

  // Seleccionar empresa de trabajo activa
  Application.CreateForm(TfrmSelectCompany, frmSelectCompany);
  try
    if frmSelectCompany.ShowModal <> mrOk then
    begin
      ShowMessage('Debe seleccionar una empresa activa para continuar.');
      Halt(0);
    end;
  finally
    FreeAndNil(frmSelectCompany);
  end;

  // frmMain DEBE ser el primer formulario visual → se convierte en MainForm
  Application.CreateForm(TfrmMain, frmMain);
  frmMain.UserRole := LUserRole;
  Application.Run;
end.
