import type { AuthRepository } from "@/domain/repositories/auth.repository";
import type { DashboardRepository } from "@/domain/repositories/dashboard.repository";
import type { CompanyRepository } from "@/domain/repositories/company.repository";
import type { UserRepository } from "@/domain/repositories/user.repository";
import type { VehicleRepository } from "@/domain/repositories/vehicle.repository";
import type { SubscriptionRepository } from "@/domain/repositories/subscription.repository";
import type { SiteRepository } from "@/domain/repositories/site.repository";
import type { ActivityLogRepository } from "@/domain/repositories/activity-log.repository";
import type { TicketRepository } from "@/domain/repositories/ticket.repository";
import type { NotificationRepository } from "@/domain/repositories/notification.repository";
import type { HelpArticleRepository } from "@/domain/repositories/help-article.repository";
import type { TelematicsOrderRepository } from "@/domain/repositories/telematics-order.repository";
import type { TelematicsCatalogRepository } from "@/domain/repositories/telematics-catalog.repository";
import type { HelpSectionRepository } from "@/domain/repositories/help-section.repository";
import type { HelpCategoryRepository } from "@/domain/repositories/help-category.repository";
import type { InstallationRepository } from "@/domain/repositories/installation.repository";
import type { InstallerRepository } from "@/domain/repositories/installer.repository";
import type { InternalUserRepository } from "@/domain/repositories/internal-user.repository";
import type { InternalRoleRepository } from "@/domain/repositories/internal-role.repository";
import type { AntaiVehicleRepository } from "@/domain/repositories/antai-vehicle.repository";
import type { BillingRepository } from "@/domain/repositories/billing.repository";
import type { DonnaRepository } from "@/domain/repositories/donna.repository";
import type { RfidCardBatchRepository } from "@/domain/repositories/rfid-card-batch.repository";
import type { HealthRepository } from "@/domain/repositories/health.repository";
import type { IntegrationRepository } from "@/domain/repositories/integration.repository";
import type { IntegrationConnectionRepository } from "@/domain/repositories/integration-connection.repository";
import type { EntitlementRepository } from "@/domain/repositories/entitlement.repository";
import type { AnomalyRuleRepository } from "@/domain/repositories/anomaly-rule.repository";

import { AuthRepositoryImpl } from "@/infrastructure/repositories/auth.repository.impl";
import { DashboardRepositoryImpl } from "@/infrastructure/repositories/dashboard.repository.impl";
import { CompanyRepositoryImpl } from "@/infrastructure/repositories/company.repository.impl";
import { UserRepositoryImpl } from "@/infrastructure/repositories/user.repository.impl";
import { VehicleRepositoryImpl } from "@/infrastructure/repositories/vehicle.repository.impl";
import { SubscriptionRepositoryImpl } from "@/infrastructure/repositories/subscription.repository.impl";
import { SiteRepositoryImpl } from "@/infrastructure/repositories/site.repository.impl";
import { ActivityLogRepositoryImpl } from "@/infrastructure/repositories/activity-log.repository.impl";
import { TicketRepositoryImpl } from "@/infrastructure/repositories/ticket.repository.impl";
import { NotificationRepositoryImpl } from "@/infrastructure/repositories/notification.repository.impl";
import { HelpArticleRepositoryImpl } from "@/infrastructure/repositories/help-article.repository.impl";
import { TelematicsOrderRepositoryImpl } from "@/infrastructure/repositories/telematics-order.repository.impl";
import { TelematicsCatalogRepositoryImpl } from "@/infrastructure/repositories/telematics-catalog.repository.impl";
import { HelpSectionRepositoryImpl } from "@/infrastructure/repositories/help-section.repository.impl";
import { HelpCategoryRepositoryImpl } from "@/infrastructure/repositories/help-category.repository.impl";
import { InstallationRepositoryImpl } from "@/infrastructure/repositories/installation.repository.impl";
import { InstallerRepositoryImpl } from "@/infrastructure/repositories/installer.repository.impl";
import { InternalUserRepositoryImpl } from "@/infrastructure/repositories/internal-user.repository.impl";
import { InternalRoleRepositoryImpl } from "@/infrastructure/repositories/internal-role.repository.impl";
import { AntaiVehicleRepositoryImpl } from "@/infrastructure/repositories/antai-vehicle.repository.impl";
import { BillingRepositoryImpl } from "@/infrastructure/repositories/billing.repository.impl";
import { DonnaRepositoryImpl } from "@/infrastructure/repositories/donna.repository.impl";
import { RfidCardBatchRepositoryImpl } from "@/infrastructure/repositories/rfid-card-batch.repository.impl";
import { HealthRepositoryImpl } from "@/infrastructure/repositories/health.repository.impl";
import { IntegrationRepositoryImpl } from "@/infrastructure/repositories/integration.repository.impl";
import { IntegrationConnectionRepositoryImpl } from "@/infrastructure/repositories/integration-connection.repository.impl";
import { EntitlementRepositoryImpl } from "@/infrastructure/repositories/entitlement.repository.impl";
import { AnomalyRuleRepositoryImpl } from "@/infrastructure/repositories/anomaly-rule.repository.impl";

export interface Container {
  authRepository: AuthRepository;
  dashboardRepository: DashboardRepository;
  companyRepository: CompanyRepository;
  userRepository: UserRepository;
  vehicleRepository: VehicleRepository;
  subscriptionRepository: SubscriptionRepository;
  siteRepository: SiteRepository;
  activityLogRepository: ActivityLogRepository;
  ticketRepository: TicketRepository;
  notificationRepository: NotificationRepository;
  helpArticleRepository: HelpArticleRepository;
  telematicsOrderRepository: TelematicsOrderRepository;
  telematicsCatalogRepository: TelematicsCatalogRepository;
  helpSectionRepository: HelpSectionRepository;
  helpCategoryRepository: HelpCategoryRepository;
  installationRepository: InstallationRepository;
  installerRepository: InstallerRepository;
  internalUserRepository: InternalUserRepository;
  internalRoleRepository: InternalRoleRepository;
  antaiVehicleRepository: AntaiVehicleRepository;
  billingRepository: BillingRepository;
  donnaRepository: DonnaRepository;
  rfidCardBatchRepository: RfidCardBatchRepository;
  healthRepository: HealthRepository;
  integrationRepository: IntegrationRepository;
  integrationConnectionRepository: IntegrationConnectionRepository;
  entitlementRepository: EntitlementRepository;
  anomalyRuleRepository: AnomalyRuleRepository;
}

let instance: Container | null = null;

export function getContainer(): Container {
  if (!instance) {
    instance = {
      authRepository: new AuthRepositoryImpl(),
      dashboardRepository: new DashboardRepositoryImpl(),
      companyRepository: new CompanyRepositoryImpl(),
      userRepository: new UserRepositoryImpl(),
      vehicleRepository: new VehicleRepositoryImpl(),
      subscriptionRepository: new SubscriptionRepositoryImpl(),
      siteRepository: new SiteRepositoryImpl(),
      activityLogRepository: new ActivityLogRepositoryImpl(),
      ticketRepository: new TicketRepositoryImpl(),
      notificationRepository: new NotificationRepositoryImpl(),
      helpArticleRepository: new HelpArticleRepositoryImpl(),
      telematicsOrderRepository: new TelematicsOrderRepositoryImpl(),
      telematicsCatalogRepository: new TelematicsCatalogRepositoryImpl(),
      helpSectionRepository: new HelpSectionRepositoryImpl(),
      helpCategoryRepository: new HelpCategoryRepositoryImpl(),
      installationRepository: new InstallationRepositoryImpl(),
      installerRepository: new InstallerRepositoryImpl(),
      internalUserRepository: new InternalUserRepositoryImpl(),
      internalRoleRepository: new InternalRoleRepositoryImpl(),
      antaiVehicleRepository: new AntaiVehicleRepositoryImpl(),
      billingRepository: new BillingRepositoryImpl(),
      donnaRepository: new DonnaRepositoryImpl(),
      rfidCardBatchRepository: new RfidCardBatchRepositoryImpl(),
      healthRepository: new HealthRepositoryImpl(),
      integrationRepository: new IntegrationRepositoryImpl(),
      integrationConnectionRepository: new IntegrationConnectionRepositoryImpl(),
      entitlementRepository: new EntitlementRepositoryImpl(),
      anomalyRuleRepository: new AnomalyRuleRepositoryImpl(),
    };
  }
  return instance;
}
