import { Module } from "@nestjs/common"
import { ConfigModule } from "@nestjs/config"
import { RoleModule } from "./modules/role/role.module"
import { AuthModule } from "./modules/auth/auth.module"
import { TypeOrmModule } from "@nestjs/typeorm"
import { TypeOrmConfigService } from "./database/type-orm-config.service"
import { ApiLogModule } from "./modules/api-log/api-log.module"
import typeorm from "./config/typeorm"
import appConfig, { cloudflareR2Config } from "./config/app.config"
import { ApiLogRepository } from "./modules/api-log/repositories/api-log.repository"
import { ApiLogInterceptor } from "./modules/api-log/api-log.interceptor"
import { ApiLog } from "./modules/api-log/entities/api-log.entity"
import { ApiLogService } from "./modules/api-log/v1/api-log.service"
import { APP_INTERCEPTOR } from "@nestjs/core"
import { PermissionModule } from "./modules/permission/permission.module"
import { RolePermissionModule } from "./modules/role-permission/role-permission.module"
import { DepartmentModule } from "./modules/department/department.module"
import { TeamMemberModule } from "./modules/team-member/team-member.module"
import { BusinessVerticalsModule } from "./modules/business-verticals/business-verticals.module"
import { CountryModule } from "./modules/country/country.module"
import { StateModule } from "./modules/state/state.module"
import { CityModule } from "./modules/city/city.module"
import { CurrencyModule } from "./modules/currency/currency.module"
import { ModuleModule } from "./modules/module/module.module"
import { VehicleTypeModule } from "./modules/vehicle-type/vehicle-type.module"
import { VehicleManufacturerModule } from "./modules/vehicle-manufacturer/vehicle-manufacturer.module"
import { VehicleModelModule } from "./modules/vehicle-model/vehicle-model.module"
import { VehicleStatusModule } from "./modules/vehicle-status/vehicle-status.module"
import { AddOnsModule } from "./modules/add-ons/add-ons.module"
import { ContractCoverageModule } from "./modules/contract-coverage/contract-coverage.module"
import { ClientTypeModule } from "./modules/client-type/client-type.module"
import { OrganogramModule } from "./modules/organogram/organogram.module"
import { FleetManagementModule } from "./modules/fleet-management/fleet-management.module"
import { VehicleInsuranceModule } from "./modules/vehicle-insurance/vehicle-insurance.module"
import { ScheduleModule } from "@nestjs/schedule"
import { VehicleMaintenanceModule } from "./modules/vehicle-maintenance/vehicle-maintenance.module"
import { HospitalsModule } from "./modules/hospitals/hospitals.module"
import { HospitalContactsModule } from "./modules/hospital-contacts/hospital-contacts.module"
import { ClientsCompaniesModule } from "./modules/clients-companies/clients-companies.module"
import { InspectionQuestionsModule } from "./modules/inspection-questions/inspection-questions.module"
import { ClientCompanyContactsModule } from "./modules/client-company-contacts/client-company-contacts.module"
import { CustomersModule } from "./modules/customers/customers.module"
import { TripsModule } from "./modules/trips/trips.module"
import { EscortsModule } from "./modules/escorts/escorts.module"
import { TripIntermediateStopsModule } from "./modules/trip-intermediate-stops/trip-intermediate-stops.module"
import { DriverAvailabilityModule } from "./modules/driver-availability/driver-availability.module"
import { IncidentReportingModule } from "./modules/incident-reporting/incident-reporting.module"
import { CancelReasonModule } from "./modules/cancel-reasons/cancel-reasons.module"
import { RatingModule } from "./modules/rating/rating.module"
import { PlansModule } from "./modules/plans/plans.module"
import { VehiclePricingModule } from "./modules/vehicle-pricing/vehicle-pricing.module"
import { ChargesTypeModule } from "./modules/charges-type/charges-type.module"
import { AddOnsPricingModule } from "./modules/add-ons-pricing/add-ons-pricing.module"
import { ServicePricingModule } from "./modules/service-pricing/service-pricing.module"
import { MeetGreetPricingModule } from "./modules/meet-greet-pricing/meet-greet-pricing.module"
import { NotificationModule } from "./modules/notification/notification.module"
import { CronModule } from "./modules/cron/cron.module"
import { ClientContractModule } from "./modules/client-contract/client-contract.module"
import { AppVersionModule } from "./modules/app-version/app-version.module"
import { DashboardModule } from "./modules/dashboard/dashboard.module"
import { ReportModule } from "./modules/reports/report.module"
import { CustomersTagsService } from "./modules/customers-tags/v1/customers-tags.service"
import { CustomersTagsController } from "./modules/customers-tags/v1/customers-tags.controller"
import { CustomersTagsModule } from "./modules/customers-tags/customers-tags.module"
import { TripSocketModule } from "./modules/trip-socket/trip-socket.module"
import { CustomerTreatmentPlanModule } from "./modules/customer-treatment-plan/customer-treatment-plan.module"
import { InvoicesModule } from "./modules/invoices/invoices.module"
import { PaymentService } from "./modules/payment/v1/payment.service"
import { PaymentController } from "./modules/payment/v1/payment.controller"
import { PaymentModule } from "./modules/payment/payment.module"
import { ExcelService } from "./utils/xlsx"

@Module({
  imports: [
    ScheduleModule.forRoot(),
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: ".env",
      load: [typeorm, appConfig, cloudflareR2Config],
    }),
    TypeOrmModule.forRootAsync({
      useClass: TypeOrmConfigService,
    }),
    TypeOrmModule.forFeature([ApiLog]),
    RoleModule,
    AuthModule,
    ApiLogModule,
    PermissionModule,
    RolePermissionModule,
    DepartmentModule,
    TeamMemberModule,
    BusinessVerticalsModule,
    CountryModule,
    StateModule,
    CityModule,
    CurrencyModule,
    ModuleModule,
    VehicleTypeModule,
    VehicleManufacturerModule,
    VehicleModelModule,
    VehicleStatusModule,
    AddOnsModule,
    ContractCoverageModule,
    ClientTypeModule,
    OrganogramModule,
    FleetManagementModule,
    VehicleInsuranceModule,
    VehicleMaintenanceModule,
    HospitalsModule,
    HospitalContactsModule,
    ClientsCompaniesModule,
    InspectionQuestionsModule,
    ClientCompanyContactsModule,
    CustomersModule,
    TripsModule,
    EscortsModule,
    TripIntermediateStopsModule,
    DriverAvailabilityModule,
    IncidentReportingModule,
    CancelReasonModule,
    RatingModule,
    PlansModule,
    VehiclePricingModule,
    ChargesTypeModule,
    AddOnsPricingModule,
    ServicePricingModule,
    MeetGreetPricingModule,
    NotificationModule,
    CronModule,
    ClientContractModule,
    AppVersionModule,
    DashboardModule,
    ReportModule,
    CustomersTagsModule,
    ReportModule,
    TripSocketModule,
    CustomerTreatmentPlanModule,
    InvoicesModule,
    PaymentModule,
  ],
  providers: [
    ApiLogRepository,
    ApiLogService,
    ExcelService,
    {
      provide: APP_INTERCEPTOR,
      useClass: ApiLogInterceptor,
    },
    CustomersTagsService,
    PaymentService,
  ],
  controllers: [CustomersTagsController, PaymentController],
})
export class AppModule {}
