import { Module } from "@nestjs/common";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { TypeOrmModule } from "@nestjs/typeorm";
import { AuthModule } from "./auth/auth.module";
import { CatalogosModule } from "./catalogos/catalogos.module";
import { ControlPlaneAdminModule } from "./control-plane-admin/control-plane-admin.module";
import { ControlPlaneModule } from "./control-plane/control-plane.module";
import { ClientesModule } from "./clientes/clientes.module";
import { CotizacionesModule } from "./cotizaciones/cotizaciones.module";
import { FacturacionPosModule } from "./facturacion-pos/facturacion-pos.module";
import { HistorialModule } from "./historial/historial.module";
import { ReportesModule } from "./reportes/reportes.module";
import { MecanicosModule } from "./mecanicos/mecanicos.module";
import { OtsModule } from "./ots/ots.module";
import { ProductosModule } from "./productos/productos.module";
import { SyncModule } from "./sync/sync.module";
import { TallerParametrosModule } from "./taller-parametros/taller-parametros.module";
import { TenancyModule } from "./tenancy/tenancy.module";
import { UploadsModule } from "./uploads/uploads.module";
import { VehiculosModule } from "./vehiculos/vehiculos.module";
import { WhatsappModule } from "./whatsapp/whatsapp.module";

import { AppController } from "./app.controller";

@Module({
  imports: [
    // Configuration
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: [".env", "../.env"],
    }),

    // Database
    // TEMPORAL: esta es todavia la unica conexion de la app, wireada al
    // tenant unico actual via TENANT_CLI_DB_* (mismas variables que usa el
    // CLI de migraciones — ver src/config/typeorm.config.ts). Se retira por
    // completo cuando la conversion de los 12 modulos a repositorios
    // tenant-aware (tenancy module) termine; hasta entonces, CADA modulo de
    // este arreglo sigue leyendo de aca, no del registro de tenants.
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        type: "mysql",
        host: configService.get("TENANT_CLI_DB_HOST"),
        port: configService.get<number>("TENANT_CLI_DB_PORT", 3306),
        username: configService.get("TENANT_CLI_DB_USERNAME"),
        password: configService.get("TENANT_CLI_DB_PASSWORD"),
        database: configService.get("TENANT_CLI_DB_DATABASE"),
        // Excluye control-plane/entities a proposito: esas entidades viven
        // SOLO en la conexion nombrada 'controlPlane' (ver
        // control-plane.module.ts). Si el glob las agarrara aca tambien,
        // TypeORM registraria Tenant/Identidad/etc. contra la base del
        // tenant demo, no contra mbinvtaller — silencioso y muy dificil de
        // rastrear. control-plane-admin/ tampoco tiene entidades propias
        // hoy (reusa Tenant/SchemaDeviation de control-plane/), pero se
        // excluye igual — "!(control-plane|tenancy)" es un match por
        // nombre EXACTO, no por prefijo, asi que "control-plane-admin" NO
        // quedaba cubierto por "control-plane" solo. Si el dia de mañana
        // alguien agrega un .entity.ts ahi, esto evita la misma trampa.
        entities: [
          __dirname + "/!(control-plane|control-plane-admin|tenancy)/**/*.entity{.ts,.js}",
        ],
        synchronize: false, // Use migrations in production
        logging: configService.get("NODE_ENV") === "development",
      }),
    }),

    ControlPlaneModule,
    TenancyModule,
    ControlPlaneAdminModule,

    // Feature Modules
    AuthModule,
    ClientesModule,
    VehiculosModule,
    OtsModule,
    FacturacionPosModule,
    CotizacionesModule,
    ProductosModule,
    UploadsModule,
    CatalogosModule,
    MecanicosModule,
    SyncModule,
    TallerParametrosModule,
    HistorialModule,
    ReportesModule,
    WhatsappModule,
  ],
  controllers: [AppController],
})
export class AppModule {}
