import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
import { ApiLogInterceptor } from './api-logs/api-log.interceptor';
import { ApiLog } from './api-logs/entities/api-log.entity';
import { ApiLogsRepository } from './api-logs/api-log.repository';
import { GroupsModule } from './groups/groups.module';
import { ContentManagementsModule } from './content_managements/content_managements.module';
import { FaqsModule } from './faqs/faqs.module';
import { OffersModule } from './offers/offers.module';
import { AppUsersModule } from './app_users/app_users.module';
import { AppUsersStepsModule } from './app_users_steps/app_users_steps.module';
import { NewsModule } from './news/news.module';
import { AuthModule } from './auth/auth.module';
import { ChallengesModule } from './challenges/challenges.module';
import { ProvincesModule } from './provinces/provinces.module';
import { AchievementsModule } from './achievements/achievements.module';
import { NotificationsModule } from './notifications/notifications.module';
import { StreaksModule } from './streaks/streaks.module';
import { CategoriesModule } from './categories/categories.module';
import { TipsModule } from './tips/tips.module';
import { ScheduleModule } from '@nestjs/schedule';
import { CronModule } from './cron/cron.module';

@Module({
  imports: [
    ScheduleModule.forRoot(),
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),
    TypeOrmModule.forRootAsync({
      useFactory: async (configService: ConfigService) => ({
        type: 'postgres',
        host: configService.get('DATABASE_HOST'),
        port: configService.get('DATABASE_PORT'),
        username: configService.get('DATABASE_USERNAME'),
        password: configService.get('DATABASE_PASSWORD'),
        database: configService.get('DATABASE_NAME'),
        synchronize: false,
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        logging: process.env.IS_LOGGING === 'true',
      }),
      inject: [ConfigService],
    }),
    TypeOrmModule.forFeature([ApiLog]),
    UserModule,
    GroupsModule,
    ContentManagementsModule,
    FaqsModule,
    OffersModule,
    AppUsersModule,
    AppUsersStepsModule,
    NewsModule,
    AuthModule,
    ChallengesModule,
    ProvincesModule,
    AchievementsModule,
    NotificationsModule,
    StreaksModule,
    CategoriesModule,
    TipsModule,
    CronModule,
  ],
  controllers: [AppController],
  providers: [AppService, ApiLogsRepository],
})
export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(ApiLogInterceptor)
      .forRoutes({ path: '*', method: RequestMethod.ALL });
  }
}
