import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import { APP_GUARD } from '@nestjs/core';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SnakeNamingStrategy } from './database/snake-naming.strategy';
import { AuditInterceptor } from './common/interceptors/audit.interceptor';

import { AuthModule } from './auth/auth.module';
import { UsersModule } from './users/users.module';
import { RolesModule } from './roles/roles.module';
import { PermissionsModule } from './permissions/permissions.module';
import { SectionsModule } from './sections/sections.module';
import { ModulesModule } from './modules/modules.module';
import { ModuleVersionsModule } from './module-versions/module-versions.module';
import { LessonsModule } from './lessons/lessons.module';
import { ActivitiesModule } from './activities/activities.module';
import { ContentBlocksModule } from './content-blocks/content-blocks.module';
import { MediaModule } from './media/media.module';
import { DrawingTemplatesModule } from './drawing-templates/drawing-templates.module';
import { DrawingsModule } from './drawings/drawings.module';
import { AnnotationsModule } from './annotations/annotations.module';
import { QuestionsModule } from './questions/questions.module';
import { CasesModule } from './cases/cases.module';
import { DecisionTreesModule } from './decision-trees/decision-trees.module';
import { ProcedureStepsModule } from './procedure-steps/procedure-steps.module';
import { QuickReferenceModule } from './quick-reference/quick-reference.module';
import { ProgressModule } from './progress/progress.module';
import { NotesModule } from './notes/notes.module';
import { FavoritesModule } from './favorites/favorites.module';
import { AnonymousSessionsModule } from './anonymous-sessions/anonymous-sessions.module';
import { AuditLogsModule } from './audit-logs/audit-logs.module';
import { AppSettingsModule } from './app-settings/app-settings.module';
import { AnalyticsModule } from './analytics/analytics.module';
import { PublicModule } from './public/public.module';

// Environment is read from backend-api/.env first, then the project root .env.
const imports: any[] = [
  ConfigModule.forRoot({ isGlobal: true, envFilePath: ['.env', '../.env'] }),
  ThrottlerModule.forRoot([
    { name: 'default', ttl: 60_000, limit: Number(process.env.RATE_LIMIT || 120) },
  ]),
];

// SKIP_DB lets the process boot for health checks without a database.
const skipDb = process.env.SKIP_DB === 'true';

if (!skipDb) {
  imports.push(
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: process.env.DB_HOST || '127.0.0.1',
      port: parseInt(process.env.DB_PORT || '3306', 10),
      username: process.env.DB_USER || 'root',
      password: process.env.DB_PASS || '',
      database: process.env.DB_NAME || 'mteer_db',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      // Schema is owned by the SQL migrations in backend-api/migrations.
      synchronize: false,
      namingStrategy: new SnakeNamingStrategy(),
      logging: process.env.DB_LOGGING === 'true',
      timezone: 'Z',
      extra: {
        // The database is remote, so an idle pooled socket can be dropped by a
        // firewall or NAT without either end noticing. Keep-alive probes hold
        // the flow open; without them the first query after an idle spell fails
        // with ECONNRESET on a connection the pool still believes is healthy.
        enableKeepAlive: true,
        keepAliveInitialDelay: 10000,
      },
    }),

    // Identity and access
    UsersModule,
    AuthModule,
    RolesModule,
    PermissionsModule,
    AuditLogsModule,

    // Content management
    SectionsModule,
    ModulesModule,
    ModuleVersionsModule,
    LessonsModule,
    ActivitiesModule,
    ContentBlocksModule,
    QuickReferenceModule,

    // Learning engines
    QuestionsModule,
    CasesModule,
    DecisionTreesModule,
    ProcedureStepsModule,

    // Media and learner artefacts
    MediaModule,
    DrawingTemplatesModule,
    DrawingsModule,
    AnnotationsModule,
    NotesModule,
    FavoritesModule,

    // Learner session, progress and reporting
    AnonymousSessionsModule,
    ProgressModule,
    AnalyticsModule,
    AppSettingsModule,

    // Mobile-facing read API
    PublicModule,
  );
}

@Module({
  imports,
  controllers: [AppController],
  providers: [
    AppService,
    { provide: APP_GUARD, useClass: ThrottlerGuard },
    ...(skipDb ? [] : [{ provide: APP_INTERCEPTOR, useClass: AuditInterceptor }]),
  ],
})
export class AppModule {}
