import { Module } from '@nestjs/common';
import { APP_FILTER, APP_INTERCEPTOR, APP_GUARD } from '@nestjs/core';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';

import { AppController } from './app.controller';
import { AppService } from './app.service';

import { RolesGuard } from './shared/roles.guard';
import { LoggingInterceptor } from './shared/logging.interceptor';
import { StatesGuard } from './shared/states.guard';
import { HttpErrorFilter } from './shared/http-error.filter';

import { NotificationModule } from './notifications/notifications.module';
import { TaskModule } from './task/task.module';
import { TrackingModule } from './tracking/tracking.module';
import { UserModule } from './user/user.module';
import { DrawModule } from './draw/draw.module';
import { FactionModule } from './faction/faction.module';
import { GameModule } from './game/game.module';
import { ScoreModule } from './score/score.module';
import { ReplayModule } from './replay/replay.module';

/*
  Core of the server,
  Every module is being imported and combined here.

  TypeOrmModule checks ormconfig.json for database connection.

  Providers can be found from shared folder
   - HttpErrorFilter
   - LoggingInterceptor
   - RolesGuard Decorator
   - StatesGuard Decorator
*/

@Module({
  imports: [
    TypeOrmModule.forRoot(),
    UserModule,
    GameModule,
    NotificationModule,
    TaskModule,
    DrawModule,
    FactionModule,
    TrackingModule,
    ScoreModule,
    ReplayModule,
  ],
  controllers: [AppController],
  providers: [
    AppService,
    {
      provide: APP_FILTER,
      useClass: HttpErrorFilter,
    },
    {
      provide: APP_INTERCEPTOR,
      useClass: LoggingInterceptor,
    },
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
    {
      provide: APP_GUARD,
      useClass: StatesGuard,
    },
  ],
})
export class AppModule {
  constructor(private readonly connection: Connection) {}
}