import { Provider } from '@nestjs/common'; import { DriverService } from './DriverService'; // Import core interfaces import { IDriverRepository } from '@core/racing/domain/repositories/IDriverRepository'; import { IRankingService } from '@core/racing/domain/services/IRankingService'; import { IDriverStatsService } from '@core/racing/domain/services/IDriverStatsService'; import { DriverRatingProvider } from '@core/racing/application/ports/DriverRatingProvider'; import { IImageServicePort } from '@core/racing/application/ports/IImageServicePort'; import { IRaceRegistrationRepository } from '@core/racing/domain/repositories/IRaceRegistrationRepository'; import { INotificationPreferenceRepository } from '@core/notifications/domain/repositories/INotificationPreferenceRepository'; import type { Logger } from "@core/shared/application"; // Import use cases import { GetDriversLeaderboardUseCase } from '@core/racing/application/use-cases/GetDriversLeaderboardUseCase'; import { GetTotalDriversUseCase } from '@core/racing/application/use-cases/GetTotalDriversUseCase'; import { CompleteDriverOnboardingUseCase } from '@core/racing/application/use-cases/CompleteDriverOnboardingUseCase'; import { UpdateDriverProfileUseCase } from '@core/racing/application/use-cases/UpdateDriverProfileUseCase'; import { IsDriverRegisteredForRaceUseCase } from '@core/racing/application/use-cases/IsDriverRegisteredForRaceUseCase'; // Import concrete in-memory implementations import { InMemoryDriverRepository } from '@adapters/racing/persistence/inmemory/InMemoryDriverRepository'; import { InMemoryRankingService } from '@adapters/racing/services/InMemoryRankingService'; import { InMemoryDriverStatsService } from '@adapters/racing/services/InMemoryDriverStatsService'; import { InMemoryDriverRatingProvider } from '@adapters/racing/ports/InMemoryDriverRatingProvider'; import { InMemoryImageServiceAdapter } from '@adapters/media/ports/InMemoryImageServiceAdapter'; import { InMemoryRaceRegistrationRepository } from '@adapters/racing/persistence/inmemory/InMemoryRaceRegistrationRepository'; import { InMemoryNotificationPreferenceRepository } from '@adapters/notifications/persistence/inmemory/InMemoryNotificationPreferenceRepository'; import { ConsoleLogger } from '@adapters/logging/ConsoleLogger'; // Define injection tokens export const DRIVER_REPOSITORY_TOKEN = 'IDriverRepository'; export const RANKING_SERVICE_TOKEN = 'IRankingService'; export const DRIVER_STATS_SERVICE_TOKEN = 'IDriverStatsService'; export const DRIVER_RATING_PROVIDER_TOKEN = 'DriverRatingProvider'; export const IMAGE_SERVICE_PORT_TOKEN = 'IImageServicePort'; export const RACE_REGISTRATION_REPOSITORY_TOKEN = 'IRaceRegistrationRepository'; export const NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN = 'INotificationPreferenceRepository'; export const LOGGER_TOKEN = 'Logger'; // Already defined in AuthProviders, but good to have here too // Use case tokens export const GET_DRIVERS_LEADERBOARD_USE_CASE_TOKEN = 'GetDriversLeaderboardUseCase'; export const GET_TOTAL_DRIVERS_USE_CASE_TOKEN = 'GetTotalDriversUseCase'; export const COMPLETE_DRIVER_ONBOARDING_USE_CASE_TOKEN = 'CompleteDriverOnboardingUseCase'; export const IS_DRIVER_REGISTERED_FOR_RACE_USE_CASE_TOKEN = 'IsDriverRegisteredForRaceUseCase'; export const UPDATE_DRIVER_PROFILE_USE_CASE_TOKEN = 'UpdateDriverProfileUseCase'; export const DriverProviders: Provider[] = [ DriverService, // Provide the service itself { provide: DRIVER_REPOSITORY_TOKEN, useFactory: (logger: Logger) => new InMemoryDriverRepository(logger), // Factory for InMemoryDriverRepository inject: [LOGGER_TOKEN], }, { provide: RANKING_SERVICE_TOKEN, useFactory: (logger: Logger) => new InMemoryRankingService(logger), inject: [LOGGER_TOKEN], }, { provide: DRIVER_STATS_SERVICE_TOKEN, useFactory: (logger: Logger) => new InMemoryDriverStatsService(logger), inject: [LOGGER_TOKEN], }, { provide: DRIVER_RATING_PROVIDER_TOKEN, useFactory: (logger: Logger) => new InMemoryDriverRatingProvider(logger), inject: [LOGGER_TOKEN], }, { provide: IMAGE_SERVICE_PORT_TOKEN, useFactory: (logger: Logger) => new InMemoryImageServiceAdapter(logger), inject: [LOGGER_TOKEN], }, { provide: RACE_REGISTRATION_REPOSITORY_TOKEN, useFactory: (logger: Logger) => new InMemoryRaceRegistrationRepository(logger), inject: [LOGGER_TOKEN], }, { provide: NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN, useFactory: (logger: Logger) => new InMemoryNotificationPreferenceRepository(logger), inject: [LOGGER_TOKEN], }, { provide: LOGGER_TOKEN, useClass: ConsoleLogger, }, // Use cases { provide: GET_DRIVERS_LEADERBOARD_USE_CASE_TOKEN, useFactory: (driverRepo: IDriverRepository, rankingService: IRankingService, driverStatsService: IDriverStatsService, imageService: IImageServicePort, logger: Logger) => new GetDriversLeaderboardUseCase(driverRepo, rankingService, driverStatsService, imageService, logger), inject: [DRIVER_REPOSITORY_TOKEN, RANKING_SERVICE_TOKEN, DRIVER_STATS_SERVICE_TOKEN, IMAGE_SERVICE_PORT_TOKEN, LOGGER_TOKEN], }, { provide: GET_TOTAL_DRIVERS_USE_CASE_TOKEN, useFactory: (driverRepo: IDriverRepository, logger: Logger) => new GetTotalDriversUseCase(driverRepo, logger), inject: [DRIVER_REPOSITORY_TOKEN, LOGGER_TOKEN], }, { provide: COMPLETE_DRIVER_ONBOARDING_USE_CASE_TOKEN, useFactory: (driverRepo: IDriverRepository) => new CompleteDriverOnboardingUseCase(driverRepo), inject: [DRIVER_REPOSITORY_TOKEN], }, { provide: IS_DRIVER_REGISTERED_FOR_RACE_USE_CASE_TOKEN, useFactory: (registrationRepo: IRaceRegistrationRepository, logger: Logger) => new IsDriverRegisteredForRaceUseCase(registrationRepo, logger), inject: [RACE_REGISTRATION_REPOSITORY_TOKEN, LOGGER_TOKEN], }, { provide: UPDATE_DRIVER_PROFILE_USE_CASE_TOKEN, useFactory: (driverRepo: IDriverRepository) => new UpdateDriverProfileUseCase(driverRepo), inject: [DRIVER_REPOSITORY_TOKEN], }, ];