import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { ScheduleModule } from '@nestjs/schedule';
import { ThrottlerModule } from '@nestjs/throttler';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { HealthModule } from './health/health.module';
import { SmsModule } from './sms/sms.module';
import { QuestionnaireModule } from './questionnaire/questionnaire.module';
import { QuestionnairePartialSubmissionModule } from './questionnaire-partial-submission/questionnaire-partial-submission.module';
import { DateIvtModule } from './date-ivt/date-ivt.module';
import { CronModule } from './cron/cron.module';
import { QuestionnaireReminderModule } from './questionnaire-reminder/questionnaire-reminder.module';
import { ShortLinkModule } from './short-link/short-link.module';
import { TwilioWebhookModule } from './twilio-webhook/twilio-webhook.module';
import { MailerModule } from './mailer/mailer.module';
import { createDatabaseConfig } from './config/database.config';

// --- Sentry ---
import { SentryModule } from '@sentry/nestjs/setup';
import { APP_FILTER } from '@nestjs/core';
import { SentryGlobalFilter } from '@sentry/nestjs/setup';

@Module({
  imports: [
    // Sentry doit être chargé AVANT le reste
    SentryModule.forRoot(),

    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),

    ScheduleModule.forRoot(),

    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) =>
        createDatabaseConfig(configService),
      inject: [ConfigService],
    }),

    ThrottlerModule.forRoot([
      {
        ttl: 60000,
        limit: 100,
      },
    ]),

    HealthModule,
    SmsModule,
    QuestionnaireModule,
    QuestionnairePartialSubmissionModule,
    DateIvtModule,
    CronModule,
    QuestionnaireReminderModule,
    ShortLinkModule,
    TwilioWebhookModule,
    MailerModule,
  ],

  controllers: [AppController],

  providers: [
    AppService,

    {
      provide: APP_FILTER,
      useClass: SentryGlobalFilter,
    },
  ],
})
export class AppModule {}
