import 'package:get_it/get_it.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../../core/network/api_client.dart'; import '../../../core/network/network_info.dart'; // Domain import '../domain/repositories/solidarite_repository.dart'; import '../domain/usecases/gerer_demandes_aide_usecase.dart'; import '../domain/usecases/gerer_propositions_aide_usecase.dart'; import '../domain/usecases/gerer_matching_usecase.dart'; import '../domain/usecases/gerer_evaluations_usecase.dart'; import '../domain/usecases/obtenir_statistiques_usecase.dart'; // Data import 'datasources/solidarite_remote_data_source.dart'; import 'datasources/solidarite_local_data_source.dart'; import 'repositories/solidarite_repository_impl.dart'; /// Configuration de l'injection de dépendances pour le module solidarité /// /// Cette classe configure tous les services, repositories, use cases /// et data sources nécessaires au fonctionnement du module solidarité. class SolidariteInjectionContainer { static final GetIt _sl = GetIt.instance; /// Initialise toutes les dépendances du module solidarité static Future init() async { // ============================================================================ // Features - Solidarité // ============================================================================ // Use Cases - Demandes d'aide _sl.registerLazySingleton(() => CreerDemandeAideUseCase(_sl())); _sl.registerLazySingleton(() => MettreAJourDemandeAideUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirDemandeAideUseCase(_sl())); _sl.registerLazySingleton(() => SoumettreDemandeAideUseCase(_sl())); _sl.registerLazySingleton(() => EvaluerDemandeAideUseCase(_sl())); _sl.registerLazySingleton(() => RechercherDemandesAideUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirDemandesUrgentesUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirMesDemandesUseCase(_sl())); _sl.registerLazySingleton(() => ValiderDemandeAideUseCase()); _sl.registerLazySingleton(() => CalculerPrioriteDemandeUseCase()); // Use Cases - Propositions d'aide _sl.registerLazySingleton(() => CreerPropositionAideUseCase(_sl())); _sl.registerLazySingleton(() => MettreAJourPropositionAideUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirPropositionAideUseCase(_sl())); _sl.registerLazySingleton(() => ChangerStatutPropositionUseCase(_sl())); _sl.registerLazySingleton(() => RechercherPropositionsAideUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirPropositionsActivesUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirMeilleuresPropositionsUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirMesPropositionsUseCase(_sl())); _sl.registerLazySingleton(() => ValiderPropositionAideUseCase()); _sl.registerLazySingleton(() => CalculerScorePropositionUseCase()); // Use Cases - Matching _sl.registerLazySingleton(() => TrouverPropositionsCompatiblesUseCase(_sl())); _sl.registerLazySingleton(() => TrouverDemandesCompatiblesUseCase(_sl())); _sl.registerLazySingleton(() => RechercherProposantsFinanciersUseCase(_sl())); _sl.registerLazySingleton(() => CalculerScoreCompatibiliteUseCase()); _sl.registerLazySingleton(() => EffectuerMatchingIntelligentUseCase( trouverPropositionsCompatibles: _sl(), calculerScoreCompatibilite: _sl(), )); _sl.registerLazySingleton(() => AnalyserTendancesMatchingUseCase()); // Use Cases - Évaluations _sl.registerLazySingleton(() => CreerEvaluationUseCase(_sl())); _sl.registerLazySingleton(() => MettreAJourEvaluationUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirEvaluationUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirEvaluationsDemandeUseCase(_sl())); _sl.registerLazySingleton(() => ObtenirEvaluationsPropositionUseCase(_sl())); _sl.registerLazySingleton(() => SignalerEvaluationUseCase(_sl())); _sl.registerLazySingleton(() => CalculerMoyenneDemandeUseCase(_sl())); _sl.registerLazySingleton(() => CalculerMoyennePropositionUseCase(_sl())); _sl.registerLazySingleton(() => ValiderEvaluationUseCase()); _sl.registerLazySingleton(() => CalculerScoreQualiteEvaluationUseCase()); _sl.registerLazySingleton(() => AnalyserTendancesEvaluationUseCase()); // Use Cases - Statistiques _sl.registerLazySingleton(() => ObtenirStatistiquesSolidariteUseCase(_sl())); _sl.registerLazySingleton(() => CalculerKPIsPerformanceUseCase()); _sl.registerLazySingleton(() => GenererRapportActiviteUseCase()); // Repository _sl.registerLazySingleton( () => SolidariteRepositoryImpl( remoteDataSource: _sl(), localDataSource: _sl(), networkInfo: _sl(), ), ); // Data Sources _sl.registerLazySingleton( () => SolidariteRemoteDataSourceImpl(apiClient: _sl()), ); _sl.registerLazySingleton( () => SolidariteLocalDataSourceImpl(sharedPreferences: _sl()), ); // ============================================================================ // Core (si pas déjà enregistrés) // ============================================================================ // Ces services sont normalement enregistrés dans le core injection container // Nous les enregistrons ici seulement s'ils ne sont pas déjà disponibles if (!_sl.isRegistered()) { _sl.registerLazySingleton(() => ApiClientImpl()); } if (!_sl.isRegistered()) { _sl.registerLazySingleton(() => NetworkInfoImpl()); } if (!_sl.isRegistered()) { final sharedPreferences = await SharedPreferences.getInstance(); _sl.registerLazySingleton(() => sharedPreferences); } } /// Nettoie toutes les dépendances du module solidarité static Future dispose() async { // Use Cases - Demandes d'aide _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); // Use Cases - Propositions d'aide _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); // Use Cases - Matching _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); // Use Cases - Évaluations _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); _sl.unregister(); // Use Cases - Statistiques _sl.unregister(); _sl.unregister(); _sl.unregister(); // Repository et Data Sources _sl.unregister(); _sl.unregister(); _sl.unregister(); } /// Obtient une instance d'un service enregistré static T get() => _sl.get(); /// Vérifie si un service est enregistré static bool isRegistered() => _sl.isRegistered(); /// Réinitialise complètement le container static Future reset() async { await dispose(); await init(); } /// Obtient des statistiques sur les services enregistrés static Map getStats() { return { 'totalServices': _sl.allReadySync().length, 'solidariteServices': { 'useCases': { 'demandes': 10, 'propositions': 10, 'matching': 6, 'evaluations': 11, 'statistiques': 3, }, 'repositories': 1, 'dataSources': 2, }, 'isInitialized': _sl.isRegistered(), }; } /// Valide que tous les services critiques sont enregistrés static bool validateConfiguration() { try { // Vérifier les services critiques final criticalServices = [ SolidariteRepository, SolidariteRemoteDataSource, SolidariteLocalDataSource, CreerDemandeAideUseCase, CreerPropositionAideUseCase, CreerEvaluationUseCase, ObtenirStatistiquesSolidariteUseCase, ]; for (final serviceType in criticalServices) { if (!_sl.isRegistered(instance: serviceType)) { return false; } } return true; } catch (e) { return false; } } /// Effectue un test de santé des services static Future> healthCheck() async { final results = {}; try { // Test du repository final repository = _sl.get(); results['repository'] = repository != null; // Test des data sources final remoteDataSource = _sl.get(); results['remoteDataSource'] = remoteDataSource != null; final localDataSource = _sl.get(); results['localDataSource'] = localDataSource != null; // Test des use cases critiques final creerDemandeUseCase = _sl.get(); results['creerDemandeUseCase'] = creerDemandeUseCase != null; final creerPropositionUseCase = _sl.get(); results['creerPropositionUseCase'] = creerPropositionUseCase != null; final creerEvaluationUseCase = _sl.get(); results['creerEvaluationUseCase'] = creerEvaluationUseCase != null; // Test des services de base results['networkInfo'] = _sl.isRegistered(); results['apiClient'] = _sl.isRegistered(); results['sharedPreferences'] = _sl.isRegistered(); } catch (e) { results['error'] = false; } return results; } } /// Extension pour faciliter l'accès aux services depuis les widgets extension SolidariteServiceLocator on GetIt { // Use Cases - Demandes d'aide CreerDemandeAideUseCase get creerDemandeAide => get(); MettreAJourDemandeAideUseCase get mettreAJourDemandeAide => get(); ObtenirDemandeAideUseCase get obtenirDemandeAide => get(); SoumettreDemandeAideUseCase get soumettreDemandeAide => get(); EvaluerDemandeAideUseCase get evaluerDemandeAide => get(); RechercherDemandesAideUseCase get rechercherDemandesAide => get(); ObtenirDemandesUrgentesUseCase get obtenirDemandesUrgentes => get(); ObtenirMesDemandesUseCase get obtenirMesdemandes => get(); ValiderDemandeAideUseCase get validerDemandeAide => get(); CalculerPrioriteDemandeUseCase get calculerPrioriteDemande => get(); // Use Cases - Propositions d'aide CreerPropositionAideUseCase get creerPropositionAide => get(); MettreAJourPropositionAideUseCase get mettreAJourPropositionAide => get(); ObtenirPropositionAideUseCase get obtenirPropositionAide => get(); ChangerStatutPropositionUseCase get changerStatutProposition => get(); RechercherPropositionsAideUseCase get rechercherPropositionsAide => get(); ObtenirPropositionsActivesUseCase get obtenirPropositionsActives => get(); ObtenirMeilleuresPropositionsUseCase get obtenirMeilleuresPropositions => get(); ObtenirMesPropositionsUseCase get obtenirMesPropositions => get(); ValiderPropositionAideUseCase get validerPropositionAide => get(); CalculerScorePropositionUseCase get calculerScoreProposition => get(); // Use Cases - Matching TrouverPropositionsCompatiblesUseCase get trouverPropositionsCompatibles => get(); TrouverDemandesCompatiblesUseCase get trouverDemandesCompatibles => get(); RechercherProposantsFinanciersUseCase get rechercherProposantsFinanciers => get(); CalculerScoreCompatibiliteUseCase get calculerScoreCompatibilite => get(); EffectuerMatchingIntelligentUseCase get effectuerMatchingIntelligent => get(); AnalyserTendancesMatchingUseCase get analyserTendancesMatching => get(); // Use Cases - Évaluations CreerEvaluationUseCase get creerEvaluation => get(); MettreAJourEvaluationUseCase get mettreAJourEvaluation => get(); ObtenirEvaluationUseCase get obtenirEvaluation => get(); ObtenirEvaluationsDemandeUseCase get obtenirEvaluationsDemande => get(); ObtenirEvaluationsPropositionUseCase get obtenirEvaluationsProposition => get(); SignalerEvaluationUseCase get signalerEvaluation => get(); CalculerMoyenneDemandeUseCase get calculerMoyenneDemande => get(); CalculerMoyennePropositionUseCase get calculerMoyenneProposition => get(); ValiderEvaluationUseCase get validerEvaluation => get(); CalculerScoreQualiteEvaluationUseCase get calculerScoreQualiteEvaluation => get(); AnalyserTendancesEvaluationUseCase get analyserTendancesEvaluation => get(); // Use Cases - Statistiques ObtenirStatistiquesSolidariteUseCase get obtenirStatistiquesSolidarite => get(); CalculerKPIsPerformanceUseCase get calculerKPIsPerformance => get(); GenererRapportActiviteUseCase get genererRapportActivite => get(); // Repository SolidariteRepository get solidariteRepository => get(); }