import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_GUARD } from '@nestjs/core';
import configuration from './config/configuration';
import { DatabaseModule } from './database/database.module';
import { TenantMiddleware } from './middleware/tenant.middleware';
import { JwtAuthGuard } from './common/guards/jwt-auth.guard';
import { PermissionsGuard } from './common/guards/permissions.guard';
import { AuthModule } from './modules/auth/auth.module';
import { TenantsModule } from './modules/tenants/tenants.module';
import { UsersModule } from './modules/users/users.module';
import { RolesModule } from './modules/roles/roles.module';
import { OfficesModule } from './modules/offices/offices.module';
import { HealthModule } from './modules/health/health.module';
import { MembersModule } from './modules/members/members.module';
import { MasterModule } from './modules/master/master.module';
import { DartaChalaniModule } from './modules/darta-chalani/darta-chalani.module';
import { ApplicationsModule } from './modules/applications/applications.module';
import { SavingsModule } from './modules/savings/savings.module';
import { LoansModule } from './modules/loans/loans.module';
import { TasksModule } from './modules/tasks/tasks.module';
import { CrmModule } from './modules/crm/crm.module';
import { AuctionsModule } from './modules/auctions/auctions.module';
import { LettersModule } from './modules/letters/letters.module';
import { MinutesModule } from './modules/minutes/minutes.module';
import { DocumentsModule } from './modules/documents/documents.module';
import { SettingsModule } from './modules/settings/settings.module';
import { ReportsModule } from './modules/reports/reports.module';
import { DepositAccountsModule } from './modules/deposit-accounts/deposit-accounts.module';
import { BlacklistModule } from './modules/blacklist/blacklist.module';
import { ActivityLogsModule } from './modules/activity-logs/activity-logs.module';
import { TaketaPatrasModule } from './modules/taketa-patras/taketa-patras.module';
import { CreditRenewModule } from './modules/credit-renew/credit-renew.module';
import { SharesModule } from './modules/shares/shares.module';
import { AccountingModule } from './modules/accounting/accounting.module';
import { BoardMembersModule } from './modules/board-members/board-members.module';
import { ExtendedMasterModule } from './modules/extended-master/extended-master.module';
import { CreditAnalysisModule } from './modules/credit-analysis/credit-analysis.module';
import { MortgageAppraisalModule } from './modules/mortgage-appraisal/mortgage-appraisal.module';
import { AdditionalWithholdingModule } from './modules/additional-withholding/additional-withholding.module';
import { PhysicalExamModule } from './modules/physical-exam/physical-exam.module';
import { ObjectStorageModule } from './modules/object-storage/object-storage.module';
import { CollateralsModule } from './modules/collaterals/collaterals.module';
import { ApplicationWorkflowModule } from './modules/application-workflow/application-workflow.module';
import { ApplicationFilesModule } from './modules/application-files/application-files.module';
import { LoanSettingsModule } from './modules/loan-settings/loan-settings.module';
import { MemberExtendedModule } from './modules/member-extended/member-extended.module';
import { ExternalGuarantorsModule } from './modules/external-guarantors/external-guarantors.module';
import { SeedOnBootService } from './seed/seed-on-boot.service';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [configuration],
    }),
    DatabaseModule,
    AuthModule,
    TenantsModule,
    UsersModule,
    RolesModule,
    OfficesModule,
    HealthModule,
    MembersModule,
    MasterModule,
    DartaChalaniModule,
    ApplicationsModule,
    SavingsModule,
    LoansModule,
    TasksModule,
    CrmModule,
    AuctionsModule,
    LettersModule,
    MinutesModule,
    DocumentsModule,
    SettingsModule,
    ReportsModule,
    DepositAccountsModule,
    BlacklistModule,
    ActivityLogsModule,
    TaketaPatrasModule,
    CreditRenewModule,
    SharesModule,
    AccountingModule,
    BoardMembersModule,
    ExtendedMasterModule,
    CreditAnalysisModule,
    MortgageAppraisalModule,
    AdditionalWithholdingModule,
    PhysicalExamModule,
    ObjectStorageModule,
    CollateralsModule,
    ApplicationWorkflowModule,
    ApplicationFilesModule,
    LoanSettingsModule,
    MemberExtendedModule,
    ExternalGuarantorsModule,
  ],
  providers: [
    { provide: APP_GUARD, useClass: JwtAuthGuard },
    { provide: APP_GUARD, useClass: PermissionsGuard },
    SeedOnBootService,
  ],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(TenantMiddleware).forRoutes('*');
  }
}
