import { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
import { APP_GUARD } from "@nestjs/core";
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
import { resolve } from "node:path";
import { JwtAuthGuard } from "./common/guards/jwt-auth.guard";
import { PermissionGuard } from "./common/guards/permission.guard";
import { MaintenanceGuard } from "./common/guards/maintenance.guard";
import { PrismaModule } from "./common/prisma/prisma.module";
import { AppController } from "./app.controller";
import { AuthModule } from "./modules/auth/auth.module";
import { UsersModule } from "./modules/users/users.module";
import { CategoriesModule } from "./modules/categories/categories.module";
import { ServiceAdsModule } from "./modules/service-ads/service-ads.module";
import { EngagementsModule } from "./modules/engagements/engagements.module";
import { OffersModule } from "./modules/offers/offers.module";
import { ConversationsModule } from "./modules/conversations/conversations.module";
import { AdminModule } from "./modules/admin/admin.module";
import { NotificationsModule } from "./modules/notifications/notifications.module";
import { ProvidersModule } from "./modules/providers/providers.module";
import { ReviewsModule } from "./modules/reviews/reviews.module";
import { FavoritesModule } from "./modules/favorites/favorites.module";
import { ReportsModule } from "./modules/reports/reports.module";
import { MediaModule } from "./modules/media/media.module";
import { ServiceRequestsModule } from "./modules/service-requests/service-requests.module";
import { PublicConfigController } from "./public-config.controller";
import { validateEnvironment } from "./common/security/environment";
import { ServiceAdRetentionService } from "./common/service-ad-retention";

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: resolve(__dirname, "..", ".env"),
      validate: validateEnvironment,
    }),
    ThrottlerModule.forRoot([
      { ttl: 60_000, limit: 120, blockDuration: 60_000 },
    ]),
    PrismaModule,
    AuthModule,
    UsersModule,
    CategoriesModule,
    ServiceAdsModule,
    EngagementsModule,
    OffersModule,
    ConversationsModule,
    AdminModule,
    NotificationsModule,
    ProvidersModule,
    ReviewsModule,
    FavoritesModule,
    ReportsModule,
    MediaModule,
    ServiceRequestsModule,
  ],
  controllers: [AppController, PublicConfigController],
  providers: [
    ServiceAdRetentionService,
    { provide: APP_GUARD, useClass: ThrottlerGuard },
    { provide: APP_GUARD, useClass: JwtAuthGuard },
    { provide: APP_GUARD, useClass: MaintenanceGuard },
    { provide: APP_GUARD, useClass: PermissionGuard },
  ],
})
export class AppModule {}
