import 'package:get_it/get_it.dart'; import 'config/app_config.dart'; import 'data/services/bridge_service.dart'; import 'data/services/alarm_service.dart'; import 'data/services/coordination_service.dart'; import 'data/services/function_button_service.dart'; import 'data/services/state_service.dart'; import 'presentation/blocs/connection/connection_bloc.dart'; import 'presentation/blocs/camera/camera_bloc.dart'; import 'presentation/blocs/monitor/monitor_bloc.dart'; import 'presentation/blocs/ptz/ptz_bloc.dart'; import 'presentation/blocs/alarm/alarm_bloc.dart'; import 'presentation/blocs/lock/lock_bloc.dart'; import 'presentation/blocs/sequence/sequence_bloc.dart'; import 'presentation/blocs/wall/wall_bloc.dart'; final sl = GetIt.instance; /// Initialize all dependencies Future initializeDependencies() async { // Config final config = await AppConfig.load(); sl.registerSingleton(config); // Services sl.registerLazySingleton(() => BridgeService()); sl.registerLazySingleton(() => AlarmService()); sl.registerLazySingleton(() => StateService( bridgeService: sl(), alarmService: sl(), )); sl.registerLazySingleton(() => CoordinationService()); sl.registerLazySingleton(() => FunctionButtonService( bridgeService: sl(), coordinationService: sl(), )); // BLoCs sl.registerFactory(() => ConnectionBloc( bridgeService: sl(), config: sl(), )); sl.registerFactory(() => CameraBloc( bridgeService: sl(), config: sl(), )); sl.registerFactory(() => MonitorBloc( stateService: sl(), config: sl(), )); sl.registerFactory(() => PtzBloc( bridgeService: sl(), coordinationService: sl(), )); sl.registerFactory(() => AlarmBloc( alarmService: sl(), stateService: sl(), )); sl.registerFactory(() => LockBloc( coordinationService: sl(), keyboardId: sl().keyboardId, )); sl.registerFactory(() => SequenceBloc( coordinationService: sl(), )); sl.registerFactory(() => WallBloc( bridgeService: sl(), )); } /// Initialize services (call after dependencies are set up) Future initializeServices() async { final config = sl(); final bridgeService = sl(); final alarmService = sl(); final stateService = sl(); final coordinationService = sl(); // Initialize services with config await bridgeService.initialize(config.servers); await alarmService.initialize(config.servers); await stateService.initialize(); await coordinationService.initialize(config.coordinatorUrl, config.keyboardId); // Load function button config sl().loadConfig(config.functionButtons); // Wire reconnection callback: resync state when a bridge comes back online bridgeService.onReconnected = (serverId) { stateService.syncFromBridges(); }; // Connect to all bridges await bridgeService.connectAll(); // Sync initial state await stateService.syncFromBridges(); // Start periodic alarm sync alarmService.startPeriodicSync( Duration(seconds: config.alarmSyncIntervalSeconds), ); // Connect to coordinator (non-blocking, auto-reconnects) coordinationService.connect(); } /// Dispose all services void disposeServices() { sl().dispose(); sl().dispose(); sl().dispose(); sl().dispose(); }