import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AuditInterceptor } from './common/interceptors/audit.interceptor';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ScheduleModule } from '@nestjs/schedule';
import { AuthModule } from './auth/auth.module';
import { UsersModule } from './users/users.module';
import { TeamsModule } from './teams/teams.module';
import { LeavesModule } from './leaves/leaves.module';
import { HolidaysModule } from './holidays/holidays.module';
import { AuditModule } from './audit/audit.module';
import { NotificationsModule } from './notifications/notifications.module';
import { AnnouncementsModule } from './announcements/announcements.module';
import { PlanningModule } from './planning/planning.module';
import { ReportsModule } from './reports/reports.module';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    ScheduleModule.forRoot(),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        type: 'mysql',
        host:     config.get('DB_HOST') ?? 'localhost',
        port:     +(config.get('DB_PORT') ?? '3306'),
        username: config.get('DB_USER') ?? 'root',
        password: config.get('DB_PASS') ?? '',
        database: config.get('DB_NAME') ?? 'gfly_rh',
        entities:   [__dirname + '/**/*.entity{.ts,.js}'],
        migrations: [__dirname + '/migrations/*{.ts,.js}'],
        synchronize: false,
        logging: true,
      }),
    }),
    AuthModule,
    UsersModule,
    TeamsModule,
    LeavesModule,
    HolidaysModule,
    AuditModule,
    NotificationsModule,
    AnnouncementsModule,
    PlanningModule,
    ReportsModule,
  ],
  providers: [
    {
      provide:  APP_INTERCEPTOR,
      useClass: AuditInterceptor,
    },
  ],
})
export class AppModule {}