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 { CategoriesModule } from "./modules/categories/categories.module"
import { ApiLogModule } from "./modules/api-log/api-log.module"
import { CompanyModule } from "./modules/company/company.module"
import typeorm from "./config/typeorm"
import appConfig 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/api-log.service"
import { APP_INTERCEPTOR } from "@nestjs/core"
import { ActivityTypesModule } from "./modules/activity-types/activity-types.module"
import { DepartmentsModule } from "./modules/departments/departments.module"
import { SalarySettingsModule } from "./modules/salary-settings/salary-settings.module"
import { EmployeesModule } from "./modules/employees/employees.module"
import { ClientsModule } from "./modules/clients/clients.module"
import { ProjectsModule } from "./modules/projects/projects.module"
import { ConsultantsModule } from "./modules/consultants/consultants.module"
import { ContractorsModule } from "./modules/contractors/contractors.module"
import { VendorsModule } from "./modules/vendors/vendors.module"
import { PartyTypesModule } from "./modules/party-types/party-types.module"
import { LeaveTypesModule } from "./modules/leave-types/leave-types.module"
import { LeaveRequestsModule } from "./modules/leave-requests/leave-requests.module"
import { PermissionsModule } from "./modules/permissions/permissions.module"
import { RolePermissionsModule } from "./modules/role-permissions/role-permissions.module"
import { TimeTrackingModule } from "./modules/time-tracking/time-tracking.module"
import { ReportsModule } from "./modules/reports/reports.module"
import { PayrollModule } from "./modules/payroll/payroll.module"
import { CronModule } from "./modules/cron/cron.module"
import { AddressModule } from "./modules/address/address.module"
import { NotificationModule } from "./modules/notification/notification.module"
import { EmployeeFlagsModule } from "./modules/employee-flags/employee-flags.module"
import { MisModule } from "./modules/mis/mis.module"

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: ".env",
      load: [typeorm, appConfig],
    }),
    TypeOrmModule.forRootAsync({
      useClass: TypeOrmConfigService,
    }),
    TypeOrmModule.forFeature([ApiLog]),
    CompanyModule,
    RoleModule,
    AuthModule,
    CategoriesModule,
    ApiLogModule,
    ActivityTypesModule,
    DepartmentsModule,
    SalarySettingsModule,
    EmployeesModule,
    ClientsModule,
    ProjectsModule,
    ConsultantsModule,
    ContractorsModule,
    VendorsModule,
    PartyTypesModule,
    LeaveTypesModule,
    LeaveRequestsModule,
    PermissionsModule,
    RolePermissionsModule,
    TimeTrackingModule,
    ReportsModule,
    PayrollModule,
    CronModule,
    AddressModule,
    NotificationModule,
    EmployeeFlagsModule,
    MisModule,
  ],
  controllers: [],
  providers: [
    ApiLogRepository,
    ApiLogService,
    {
      provide: APP_INTERCEPTOR,
      useClass: ApiLogInterceptor,
    },
  ],
})
export class AppModule {}
