import { Module } from "@nestjs/common";
import { APP_GUARD } from "@nestjs/core";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
import { TypeOrmModule } from "@nestjs/typeorm";
import { AdminUser } from "./auth/entities/admin-user.entity";
import { AuthModule } from "./auth/auth.module";
import { ContentBlock } from "./content/entities/content-block.entity";
import { Page } from "./content/entities/page.entity";
import { ContentModule } from "./content/content.module";
import { MediaAsset } from "./media/entities/media-asset.entity";
import { MediaModule } from "./media/media.module";
import { FaqItem } from "./faq/entities/faq-item.entity";
import { FaqModule } from "./faq/faq.module";
import { PageView } from "./analytics/entities/page-view.entity";
import { AnalyticsModule } from "./analytics/analytics.module";

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    // Global default: 120 requests/minute per IP. Individual public/
    // sensitive endpoints (login, the analytics beacon) set a tighter
    // @Throttle() of their own — see auth.controller.ts and
    // analytics.controller.ts.
    ThrottlerModule.forRoot([{ name: "default", ttl: 60_000, limit: 120 }]),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        type: "mysql",
        host: config.get<string>("DB_HOST"),
        port: Number(config.get<string>("DB_PORT") ?? 3306),
        username: config.get<string>("DB_USERNAME"),
        password: config.get<string>("DB_PASSWORD"),
        database: config.get<string>("DB_DATABASE"),
        entities: [AdminUser, Page, ContentBlock, MediaAsset, FaqItem, PageView],
        // Schema changes go through migrations (see src/database/migrations),
        // never through synchronize — safe to run against a real DB.
        synchronize: false,
      }),
    }),
    AuthModule,
    ContentModule,
    MediaModule,
    FaqModule,
    AnalyticsModule,
  ],
  providers: [{ provide: APP_GUARD, useClass: ThrottlerGuard }],
})
export class AppModule {}
