import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:test_sa/modules/cx_module/chat/services/call_manager.dart'; import 'package:test_sa/modules/cx_module/chat/services/signalr_service.dart'; /// App-level initialization service /// Handles initialization of core services like SignalR and CallManager class AppInitializationService { static final AppInitializationService _instance = AppInitializationService._internal(); factory AppInitializationService() => _instance; AppInitializationService._internal(); bool _isInitialized = false; bool get isInitialized => _isInitialized; /// Initialize SignalR and CallManager after user login /// This should be called from the landing page after successful login Future initializeAfterLogin({ required String userId, required String authToken, required String employeeNumber, String? conversationId, String? moduleId, String? referenceId, }) async { if (_isInitialized) { log('⚠️ [APP INIT] Already initialized, skipping...', name: 'AppInitializationService'); return; } try { log('═══════════════════════════════════════════', name: 'AppInitializationService'); log('🚀 [APP INIT] Starting app initialization...', name: 'AppInitializationService'); log(' User ID: $userId', name: 'AppInitializationService'); log(' Employee Number: $employeeNumber', name: 'AppInitializationService'); log('═══════════════════════════════════════════', name: 'AppInitializationService'); // Step 1: Initialize SignalR Service log('🔌 [APP INIT] Step 1: Initializing SignalR Service...', name: 'AppInitializationService'); final signalRService = SignalRService(); final connected = await signalRService.initialize( userId: userId, authToken: authToken, conversationId: conversationId, ); if (!connected) { throw Exception('Failed to initialize SignalR connection'); } log('✅ [APP INIT] SignalR Service initialized', name: 'AppInitializationService'); log(' Connection State: ${signalRService.connectionState}', name: 'AppInitializationService'); log(' Connection ID: ${signalRService.connectionId ?? "NULL"}', name: 'AppInitializationService'); // Step 2: Initialize CallManager log('📞 [APP INIT] Step 2: Initializing CallManager...', name: 'AppInitializationService'); await CallManager().initialize( userId: userId, authToken: authToken, conversationId: conversationId, moduleId: moduleId, referenceId: referenceId, employeeNumber: employeeNumber, ); log('✅ [APP INIT] CallManager initialized', name: 'AppInitializationService'); _isInitialized = true; log('═══════════════════════════════════════════', name: 'AppInitializationService'); log('✅ [APP INIT] App initialization complete!', name: 'AppInitializationService'); log(' ✅ SignalR Service: Ready', name: 'AppInitializationService'); log(' ✅ CallManager: Ready', name: 'AppInitializationService'); log(' ✅ WebRTC: Will initialize on first call', name: 'AppInitializationService'); log('═══════════════════════════════════════════', name: 'AppInitializationService'); } catch (e, stackTrace) { log('❌ [APP INIT] Initialization failed: $e', name: 'AppInitializationService', error: e, stackTrace: stackTrace); _isInitialized = false; rethrow; } } /// Reset initialization state (for logout) Future reset() async { log('🔄 [APP INIT] Resetting app initialization...', name: 'AppInitializationService'); try { // Reset CallManager await CallManager().reset(); // Disconnect SignalR await SignalRService().disconnect(); _isInitialized = false; log('✅ [APP INIT] Reset complete', name: 'AppInitializationService'); } catch (e) { log('⚠️ [APP INIT] Error during reset: $e', name: 'AppInitializationService'); } } /// Check if services are ready for calling bool areServicesReady() { final signalRConnected = SignalRService().isConnected; final callManagerInitialized = CallManager().isCallInProgress || _isInitialized; return signalRConnected && _isInitialized; } }