import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigurationModule } from './config/configuration.module';
import { MailerModule } from '@nestjs-modules/mailer';
import { ScheduleModule } from '@nestjs/schedule';
import { APP_INTERCEPTOR } from '@nestjs/core';
import './utils/typeorm.polyfill';

import { TypeOrmConfigService } from './database/typeorm-config.service';
import { AddressModule } from './modules/address/address.module';
import { AuthModule } from './modules/auth/auth.module';
import { ContactModule } from './modules/contact/contact.module';
import { UserModule } from './modules/user/user.module';
import { MailConfigService } from './mail/mail-config.service';
import { ErrorModule } from './error/error.module';
import { ErrorsInterceptor } from './utils/interceptors/errors.interceptor';
import { DiscountModule } from './modules/discount/discount.module';
import { TasksModule } from './tasks/tasks.module';
import { KilometerRangeModule } from './modules/kilometer-range/kilometer-range.module';
import { ServiceModule } from './modules/service/service.module';
import { ProductModule } from './modules/product/product.module';
import { CarModule } from './modules/car/car.module';
import { CategoryModule } from './modules/category/category.module';
import { PollModule } from './modules/poll/poll.module';
import { OrderModule } from './modules/order/order.module';
import { TicketModule } from './modules/ticket/ticket.module';
import { CooperationModule } from './modules/cooperation/cooperation.module';
import { PictureModule } from './modules/picture/picture.module';
import { AttributeModule } from './modules/attribute/attribute.module';
import { SiteInfoModule } from './modules/siteInfo/site-info.module';
import { ManufacturerModule } from './modules/manufacturer/manufacturer.module';
import { ServiceTimeModule } from './modules/service-time/service-time.module';
import { NewsModule } from './modules/news/news.module';
import { GalleryModule } from './modules/gallery/gallery.module';
import { EmergencyPhoneModule } from './modules/emergency-phones/emergency-phone.module';
import { RoleModule } from './modules/role/role.module';
import { LogModule } from './modules/log/log.module';
import { CustomerModule } from './modules/customer/customer.module';
import { ServiceDayClosedModule } from './modules/service-day-closed/service-day-closed.module';
import { WithdrawModule } from './modules/withdraw/withdraw.module';
import { BonusCreditsModule } from './modules/bonus-credit/bonus-credit.module';
import { PromotionPlanModule } from './modules/promotion-plan/promotion-plan.module';
import { DrivingOffenseModule } from './modules/drivinig-offense/driving-offense.module';
import { NegativeScoreModule } from './modules/negative-score/negative-score.module';
import { PaymentModule } from './modules/payment/payment.module';
import { FreewayTollModule } from './modules/freeway-toll/freeway-toll.module';
import { AnnouncementModule } from './modules/announcement/announcement.module';
import { InsuranceModule } from './modules/insurance/insurance.module';

@Module({
  imports: [
    // Config database for typeorm
    TypeOrmModule.forRootAsync({
      useClass: TypeOrmConfigService,
    }),
    ConfigurationModule.register(),
    MailerModule.forRootAsync({
      useClass: MailConfigService,
    }),
    ScheduleModule.forRoot(),
    ErrorModule.register(),

    // Project modules
    UserModule,
    AuthModule,
    RoleModule,
    ProductModule,
    CategoryModule,
    CarModule,
    AddressModule,
    ContactModule,
    DiscountModule,
    ServiceModule,
    KilometerRangeModule,
    PollModule,
    TasksModule,
    OrderModule,
    TicketModule,
    CooperationModule,
    PictureModule,
    AttributeModule,
    SiteInfoModule,
    ManufacturerModule,
    ServiceTimeModule,
    GalleryModule,
    NewsModule,
    EmergencyPhoneModule,
    LogModule,
    CustomerModule,
    ServiceDayClosedModule,
    WithdrawModule,
    BonusCreditsModule,
    PromotionPlanModule,
    DrivingOffenseModule,
    NegativeScoreModule,
    PaymentModule,
    FreewayTollModule,
    AnnouncementModule,
    InsuranceModule,
  ],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: ErrorsInterceptor,
    },
  ],
})
export class AppModule {}
