import { DynamicModule, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { BullModule } from '@nestjs/bullmq';
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler';
import { AuthModule } from './auth/auth.module';
import { HealthModule } from './health/health.module';
import { UsersModule } from './users/users.module';
import { CustomersModule } from './customers/customers.module';
import { DriversModule } from './drivers/drivers.module';
import { RestaurantsModule } from './restaurants/restaurants.module';
import { CatalogModule } from './catalog/catalog.module';
import { OrdersModule } from './orders/orders.module';
import { PaymentsModule } from './payments/payments.module';
import { DeliveriesModule } from './deliveries/deliveries.module';
import { WalletsModule } from './wallets/wallets.module';
import { CouponsModule } from './coupons/coupons.module';
import { ReviewsModule } from './reviews/reviews.module';
import { NotificationsModule } from './notifications/notifications.module';
import { SupportModule } from './support/support.module';
import { AdminModule } from './admin/admin.module';
import { MetricsModule } from './metrics/metrics.module';
import { AuditModule } from './audit/audit.module';
import { MapsModule } from './maps/maps.module';
import { QueuesModule } from './queues/queues.module';
import { DatabaseModule } from './database/database.module';
import { FinanceModule } from './finance/finance.module';
import { TrackingModule } from './tracking/tracking.module';
import { StorageModule } from './storage/storage.module';
import { MessagingModule } from './messaging/messaging.module';
import { validateEnv } from './config/env';
import { LoggingInterceptor } from './common/interceptors/logging.interceptor';
import { GlobalExceptionFilter } from './common/filters/global-exception.filter';

@Module({})
export class AppModule {
  static register(): DynamicModule {
    const enableQueues = process.env.ENABLE_QUEUES === 'true';

    return {
      module: AppModule,
      imports: [
        ConfigModule.forRoot({ isGlobal: true, validate: validateEnv }),
        ThrottlerModule.forRoot([{ ttl: 60000, limit: 120 }]),
        ...(enableQueues
          ? [
              BullModule.forRootAsync({
                imports: [ConfigModule],
                inject: [ConfigService],
                useFactory: (configService: ConfigService) => ({
                  connection: { url: configService.get<string>('REDIS_URL') },
                }),
              }),
              QueuesModule,
            ]
          : []),
        DatabaseModule,
        HealthModule,
        AuthModule,
        UsersModule,
        CustomersModule,
        DriversModule,
        RestaurantsModule,
        CatalogModule,
        OrdersModule,
        PaymentsModule,
        MessagingModule,
        StorageModule,
        DeliveriesModule,
        WalletsModule,
        CouponsModule,
        ReviewsModule,
        NotificationsModule,
        SupportModule,
        FinanceModule,
        TrackingModule,
        AdminModule,
        MetricsModule,
        AuditModule,
        MapsModule,
      ],
      providers: [
        { provide: APP_INTERCEPTOR, useClass: LoggingInterceptor },
        { provide: APP_GUARD, useClass: ThrottlerGuard },
        { provide: APP_FILTER, useClass: GlobalExceptionFilter },
      ],
    };
  }
}
