import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { configuration } from './config/configuration';
import { validateEnv } from './config/env.validation';
import { PrismaModule } from './database/prisma.module';
import { AuthModule } from './modules/auth/auth.module';
import { HealthModule } from './modules/health/health.module';
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler';
import { APP_GUARD } from '@nestjs/core';
import { PlansModule } from './modules/plans/plans.module';
import { UsersModule } from './modules/users/users.module';
import { LoyaltyProgramsModule } from './modules/loyalty-programs/loyalty-programs.module';
import { LoyaltySettingsModule } from './modules/loyalty-settings/loyalty-settings.module';
import { TemplatesModule } from './modules/templates/templates.module';
import { CouponsModule } from './modules/coupons/coupons.module';
import { LuckyDrawModule } from './modules/lucky-draw/lucky-draw.module';
import { UploadsModule } from './modules/uploads/uploads.module';
import { SalesModule } from './modules/sales/sales.module';
import { ReviewsModule } from './modules/reviews/reviews.module';
import { BusinessTypesModule } from './modules/business-types/business-types.module';
import { ShopsModule } from './modules/shops/shops.module';
import { DashboardModule } from './modules/dashboard/dashboard.module';
import { WalletModule } from './modules/wallet/wallet.module';
import { ScheduleModule } from '@nestjs/schedule';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      load: [configuration],
      validate: validateEnv,
    }),
    ScheduleModule.forRoot(),
    ThrottlerModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        throttlers: [
          {
            ttl: config.get<number>('throttle.ttlSeconds') ?? 60,
            limit: config.get<number>('throttle.limit') ?? 120,
          },
        ],
      }),
    }),
    PrismaModule,
    HealthModule,
    AuthModule,
    PlansModule,
    UsersModule,
    LoyaltyProgramsModule,
    LoyaltySettingsModule,
    TemplatesModule,
    CouponsModule,
    LuckyDrawModule,
    UploadsModule,
    SalesModule,
    ReviewsModule,
    BusinessTypesModule,
    ShopsModule,
    DashboardModule,
    WalletModule,
  ],
  controllers: [AppController],
  providers: [
    AppService,
    {
      provide: APP_GUARD,
      useClass: ThrottlerGuard,
    },
  ],
})
export class AppModule {}
