initializeDependencies function

Future<void> initializeDependencies()

Implementation

Future<void> initializeDependencies() async {
  // Isar Service - Clean Architecture compliant
  final isarService = IsarService();
  await isarService.initialize([
    ProjectModelSchema,
    AppSettingsModelSchema,
    UserProfileModelSchema,
    ComponentModelSchema,
    AppPreferencesDtoSchema,
    OnboardingStatusDtoSchema,
  ]);
  sl.registerSingleton<IsarService>(isarService);

  // Register Isar instance for legacy code
  final isar = isarService.instance;
  if (isar != null) {
    sl.registerSingleton<Isar>(isar);
  }

  // Repositories
  sl.registerSingleton<ProjectLocalDataSource>(
      ProjectLocalDataSourceImpl(sl()));
  sl.registerSingleton<ProjectRepository>(ProjectRepositoryImpl(sl()));
  sl.registerSingleton<SettingsRepository>(SettingsRepositoryImpl(sl()));
  sl.registerSingleton<UserProfileRepository>(UserProfileRepositoryImpl(sl()));

  // Component Feature - DataSource already implements repository interface
  sl.registerSingleton<ComponentRepository>(ComponentLocalDataSource(sl()));

  // Register SharedPreferences as singleton (needed for AppStateCubit)
  final prefs = await SharedPreferences.getInstance();
  sl.registerSingleton<SharedPreferences>(prefs);

  // Core Use Cases
  sl.registerLazySingleton<InitializeAppUseCase>(
    () => InitializeAppUseCase(
      componentRepository: sl(),
      prefs: sl(),
    ),
  );

  // Settings Feature Use Cases
  sl.registerLazySingleton(() => GetUserProfile(sl()));
  sl.registerLazySingleton(() => SaveUserProfile(sl()));
  sl.registerLazySingleton(() => UpdateProfilePhoto(sl()));
  sl.registerLazySingleton(() => UpdateCompanyLogo(sl()));

  // Onboarding Use Cases
  sl.registerLazySingleton(() => SaveOnboardingDataUseCase(sl()));

  // Dio
  sl.registerSingleton<Dio>(Dio());

  // Diagram Feature
  // Data Sources
  sl.registerLazySingleton<CablePresetsDataSource>(
      () => CablePresetsDataSourceImpl());
  sl.registerLazySingleton<ProtectionPresetsDataSource>(
      () => ProtectionPresetsDataSourceImpl());

  // Repositories
  sl.registerLazySingleton<DiagramRepository>(() => DiagramRepositoryImpl(
        cablePresetsDataSource: sl(),
        protectionPresetsDataSource: sl(),
      ));

  // Use Cases
  sl.registerLazySingleton(() => CalculateDiagramUseCase());
  sl.registerLazySingleton(() => ValidateDiagramUseCase());
  sl.registerLazySingleton(() => AddChildNodeUseCase());
  sl.registerLazySingleton(() => UpdateNodeUseCase());

  // Blocs
  sl.registerFactory(() => DiagramCubit(
        calculateDiagramUseCase: sl(),
        validateDiagramUseCase: sl(),
        addChildNodeUseCase: sl(),
        updateNodeUseCase: sl(),
      ));

  sl.registerFactory(() => ComponentLibraryCubit(sl()));

  // Settings Feature Cubits
  sl.registerFactory(() => UserProfileCubit(
        getUserProfile: sl(),
        saveUserProfile: sl(),
        updateProfilePhoto: sl(),
        updateCompanyLogo: sl(),
      ));

  // Health Feature
  sl.registerFactory(() => HealthBloc(diagramCubit: sl()));

  // Budget Feature
  sl.registerSingleton<PriceRepository>(MockPriceRepository());
  sl.registerLazySingleton<MaterialAggregatorService>(
      () => MaterialAggregatorService(componentRepository: sl()));
  sl.registerLazySingleton<PricingEngine>(
      () => PricingEngine(sl(), aggregator: sl()));
  sl.registerFactory(() => BudgetCubit(sl()));

  // Onboarding Feature
  sl.registerFactory(() => OnboardingCubit(saveDataUseCase: sl()));

  // Core Cubits
  sl.registerFactory<AppStateCubit>(
    () => AppStateCubit(
      initializeAppUseCase: sl(),
      prefs: sl(),
    ),
  );
}