import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import { ScheduleModule } from '@nestjs/schedule';
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';

import { PrismaModule } from './prisma/prisma.module';
import { NotificationsModule } from './modules/notifications/notifications.module';
import { PdfModule } from './modules/pdf/pdf.module';
import { AuthModule } from './modules/auth/auth.module';
import { UsersModule } from './modules/users/users.module';
import { TenantsModule } from './modules/tenants/tenants.module';
import { ComplexesModule } from './modules/complexes/complexes.module';
import { LotsModule } from './modules/lots/lots.module';
import { ResidentsModule } from './modules/residents/residents.module';
import { FinanceModule } from './modules/finance/finance.module';
import { HealthModule } from './modules/health/health.module';
import { TicketsModule } from './modules/tickets/tickets.module';
import { ImportsModule } from './modules/imports/imports.module';
import { DunningModule } from './modules/dunning/dunning.module';
import { AssembliesModule } from './modules/assemblies/assemblies.module';
import { DocumentsModule } from './modules/documents/documents.module';
import { BookingsModule } from './modules/bookings/bookings.module';
import { AccessModule } from './modules/access/access.module';
import { BillingModule } from './modules/billing/billing.module';
import { MaintenanceModule } from './modules/maintenance/maintenance.module';
import { CommunityModule } from './modules/community/community.module';
import { LeadsModule } from './modules/leads/leads.module';
import { AuditModule } from './modules/audit/audit.module';
import { AuditInterceptor } from './common/interceptors/audit.interceptor';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: [`.env.${process.env.NODE_ENV ?? 'development'}`, '.env'],
    }),
    ThrottlerModule.forRoot([
      {
        ttl: parseInt(process.env.THROTTLE_TTL ?? '60') * 1000,
        limit: parseInt(process.env.THROTTLE_LIMIT ?? '100'),
      },
    ]),
    ScheduleModule.forRoot(),
    PrismaModule,
    PdfModule,
    NotificationsModule,
    HealthModule,
    AuthModule,
    UsersModule,
    TenantsModule,
    ComplexesModule,
    LotsModule,
    ResidentsModule,
    FinanceModule,
    TicketsModule,
    ImportsModule,
    DunningModule,
    AssembliesModule,
    DocumentsModule,
    BookingsModule,
    AccessModule,
    BillingModule,
    MaintenanceModule,
    CommunityModule,
    LeadsModule,
    AuditModule,
  ],
  providers: [
    { provide: APP_GUARD, useClass: ThrottlerGuard },
    { provide: APP_INTERCEPTOR, useClass: AuditInterceptor },
  ],
})
export class AppModule {}
