import 'package:get_it/get_it.dart'; import 'package:test_sa/modules/cx_module/chat/services/signalr_service.dart'; import 'package:test_sa/modules/cx_module/chat/call/services/webrtc_service.dart'; import 'package:test_sa/modules/cx_module/chat/services/call_manager.dart'; import 'package:test_sa/modules/cx_module/chat/call/services/call_notification_service.dart'; import 'dart:developer'; /// Global service locator instance final getIt = GetIt.instance; /// Setup dependency injection /// This is called ONCE during app startup in the MAIN ISOLATE ONLY /// NEVER call this from background isolate Future setupServiceLocator() async { await _registerServices(); } /// Internal helper to register services with duplicate protection Future _registerServices() async { // 1. SignalR Service if (!getIt.isRegistered()) { getIt.registerLazySingleton(() => SignalRService()); } else { log(' ⚠️ SignalRService already registered, skipping', name: 'ServiceLocator'); } // 2. WebRTC Service if (!getIt.isRegistered()) { getIt.registerLazySingleton(() => WebRTCService()); } else { log(' ⚠️ WebRTCService already registered, skipping', name: 'ServiceLocator'); } // 3. CallManager (depends on SignalRService, WebRTCService) if (!getIt.isRegistered()) { getIt.registerLazySingleton(() => CallManager()); } else { log(' ⚠️ CallManager already registered, skipping', name: 'ServiceLocator'); } // 4. CallNotificationService (depends on CallManager) if (!getIt.isRegistered()) { getIt.registerLazySingleton(() => CallNotificationService()); } else { log(' ⚠️ CallNotificationService already registered, skipping', name: 'ServiceLocator'); } // Verify all critical dependencies are available _verifyDependencies(); } /// Verify that all required dependencies are registered void _verifyDependencies() { final dependencies = [ SignalRService, WebRTCService, CallManager, CallNotificationService, ]; bool allRegistered = true; for (final type in dependencies) { if (getIt.isRegistered(type: type)) { log(' ✅ $type is registered', name: 'ServiceLocator'); } else { log(' ❌ $type is NOT registered', name: 'ServiceLocator'); allRegistered = false; } } if (allRegistered) { } else { log('❌ [DI] Some dependencies are missing!', name: 'ServiceLocator'); throw StateError('Required dependencies are not registered in GetIt'); } } /// Reset all communication services /// Used for logout or testing Future resetServices() async { try { if (getIt.isRegistered()) { await getIt().reset(); } if (getIt.isRegistered()) { await getIt().reset(); } } catch (e) { log('❌ [DI] Error resetting services: $e', name: 'ServiceLocator'); } }