import { Logger, MiddlewareConsumer, Module } from '@nestjs/common';
import { AuthModule } from './modules/auth/auth.module';
import { UsersModule } from './modules/user/users.module';
import { AppConfigModule } from './config/appconfig.module';
import { DatabaseModule } from './config/database/database.module';
import { AppController } from './app.controller';
import { NewsletterModule } from './modules/newsletter/news-letter.module';
import { DiscordBotModule } from 'modules/bot/discord-bot.module';
import { AdminModule } from 'modules/admin/admin.module';
import { ContactModule } from 'modules/contact/contact.module';
import { RolePermissionModule } from 'modules/role-permission/role-permission.module';
import { AlertModule } from 'modules/alert/alert.module';
import { TicketsModule } from 'modules/ticket/ticket.module';
import { CloudinaryModule } from 'config/multer/cloudinary.module';
import { ConfigService } from '@nestjs/config';
import { FileUploadModule } from 'modules/file-upload/file-upload.module';
import { AppointmentModule } from 'modules/appointment/appointment.module';
import { FeatureModule } from 'modules/feature/feature.module';
import { CsvImportModule } from 'modules/feature/can/csv-import/csv-import.module';
import { RateLimiterMiddleware } from 'common/middlewares/rate-limitter.middleware';
import { ReportModule } from 'modules/report-chat/report.module';
import { ChatbotModule } from 'modules/chatbot/chatbot.module';
import { MdxModule } from 'modules/mdx/mdx.module';
import { CrawlerModule } from 'modules/crawler/crawler.module';
import { BrokenAccessControlModule } from 'modules/feature/can/owasp-scan/all-owasp-scan-module/broken-access-control/access-control.module';
import { CryptoFailureTestModule } from 'modules/feature/can/owasp-scan/all-owasp-scan-module/crypto-failure-test/crypto-test.module';
import { JobsModule } from 'modules/feature/can/job/job.module';
import { AiScannerModule } from 'modules/feature/can/ai-content-checker/ai-scanner.module';
import { MonitoringModule } from 'modules/feature/can/dark-web-monitor-old/monitoring.module';
import { OWASPModule } from 'modules/feature/can/owasp-scan/owasp.module';

//for terminal
// import { CommandModule } from 'nest-commander';
// import { ProcessMdxCommand } from 'modules/mdx/process-mdx.command';
// import { MdxService } from 'modules/mdx/mdx.service';
// import { DatabaseModule } from './config/database/database.module';
import { CSVPopulateModule } from 'modules/feature/can/populate-db-csv/csv-populate.module';
import { JSONPopulateModule } from 'modules/feature/can/populate-db-json/json-populate.module';
import { BlogsModule } from 'modules/blog/blog.module';
import { TxtImportModule } from 'modules/feature/can/txt-import/txt-import.module';
import { FeatureAnalyticsModule } from 'modules/feaature-analytics/analytics.module';
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { AnalyticsInterceptor } from 'common/interceptors/analytics.interceptor';
import { AnalyticsMiddleware } from 'common/middlewares/analytics.middleware';
import { SocialMediaModule } from 'modules/social-media/social-media.module';
import { LibraryModule } from 'modules/library/library.module';
import { AppService } from 'app.service';
import { BreachCheckAlertModule } from 'modules/breach-check-alert/breach-check.module';
import { PermissionsGuard } from 'common/guards/ppermissions.guard';
import { PermissionService } from 'modules/role-permission/permissions/permission.service';
import { PermissionModule } from 'modules/role-permission/permissions/permission.module';
import { JwtAuthGuard } from 'common/guards/jwt-auth.guard';

@Module({
  imports: [
    AppConfigModule,
    DatabaseModule,
    AuthModule,
    AdminModule,
    UsersModule,
    NewsletterModule,
    ReportModule,
    DiscordBotModule,
    ContactModule,
    CloudinaryModule,
    RolePermissionModule,
    AlertModule,
    TicketsModule,
    FileUploadModule,
    AppointmentModule,
    FeatureModule,
    CsvImportModule,
    ChatbotModule,
    MdxModule,
    TxtImportModule,
    BlogsModule,
    FeatureAnalyticsModule,
    CrawlerModule,
    BrokenAccessControlModule,
    CryptoFailureTestModule,
    CSVPopulateModule,
    JSONPopulateModule,
    SocialMediaModule,
    LibraryModule,
    BreachCheckAlertModule,
    JobsModule,
    AiScannerModule,
    PermissionModule,
    MonitoringModule,
    OWASPModule,
  ],
  providers: [
    AppService,
    {
      provide: APP_INTERCEPTOR,
      useClass: AnalyticsInterceptor,
    },
  ],
  controllers: [AppController],
  // providers: [ProcessMdxCommand, MdxService],
})
export class AppModule {
  private readonly logger = new Logger(AppModule.name);
  constructor(private configService: ConfigService) {}

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(RateLimiterMiddleware).forRoutes('*');
    // consumer.apply(ApiKeyRateLimiterMiddleware).forRoutes('*');
    consumer.apply(AnalyticsMiddleware).forRoutes('api');
    consumer.apply(AnalyticsMiddleware).forRoutes('breach-check');
    consumer.apply(AnalyticsMiddleware).forRoutes('security');
  }

  async onModuleInit() {
    this.logger.log('Cloudinary connected successfully!');
  }
}
