import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import { APP_GUARD } from '@nestjs/core';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { LoggerModule } from 'nestjs-pino';
import { resolveMongoUri } from './config/runtime-config';
import { RedisModule } from './redis/redis.module';
import { QueueModule } from './queue/queue.module';
import { AuthModule } from './auth/auth.module';
import { UsersModule } from './users/users.module';
import { AuditLogsModule } from './audit-logs/audit-logs.module';
import { TripsModule } from './trips/trips.module';
import { PunchesModule } from './punches/punches.module';
import { GpsModule } from './gps/gps.module';
import { GeofencingModule } from './geofencing/geofencing.module';
import { AdminModule } from './admin/admin.module';
import { AnalyticsModule } from './analytics/analytics.module';
import { NotificationsModule } from './notifications/notifications.module';
import { ExportsModule } from './exports/exports.module';
import { RealtimeModule } from './realtime/realtime.module';
import { TrackingModule } from './tracking/tracking.module';
import { FilesModule } from './files/files.module';
import { LegacyTravelRequestsModule } from './trips/legacy-travel-requests.module';
import { HealthController } from './health/health.controller';
import { ClientConfigController } from './config/client-config.controller';
import { JwtAuthGuard } from './common/guards/jwt-auth.guard';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    LoggerModule.forRoot({
      pinoHttp: { level: process.env.LOG_LEVEL ?? 'info' },
    }),
    MongooseModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (cfg: ConfigService) => ({
        uri: resolveMongoUri(cfg),
      }),
      inject: [ConfigService],
    }),
    RedisModule,
    ThrottlerModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (cfg: ConfigService) => ({
        throttlers: [
          {
            name: 'default',
            ttl: Number(cfg.get('THROTTLE_DEFAULT_TTL_SEC') ?? 60) * 1000,
            limit: Number(cfg.get('THROTTLE_DEFAULT_LIMIT') ?? 400),
          },
        ],
      }),
      inject: [ConfigService],
    }),
    EventEmitterModule.forRoot(),
    QueueModule.register(),
    AuthModule,
    UsersModule,
    AuditLogsModule,
    TripsModule,
    LegacyTravelRequestsModule,
    PunchesModule,
    GpsModule,
    GeofencingModule,
    AdminModule,
    AnalyticsModule,
    NotificationsModule,
    ExportsModule,
    RealtimeModule,
    TrackingModule,
    FilesModule,
  ],
  controllers: [HealthController, ClientConfigController],
  providers: [
    { provide: APP_GUARD, useClass: ThrottlerGuard },
    { provide: APP_GUARD, useClass: JwtAuthGuard },
  ],
})
export class AppModule {}
