import 'package:geosector_app/chat/chat_module.dart'; import 'package:geosector_app/chat/services/chat_service.dart'; import 'package:geosector_app/core/services/api_service.dart'; import 'package:geosector_app/core/services/current_user_service.dart'; import 'package:geosector_app/core/services/current_amicale_service.dart'; /// Service singleton pour gérer le cycle de vie du module chat /// Initialise le chat une seule fois au login et maintient les syncs en arrière-plan class ChatManager { static ChatManager? _instance; static ChatManager get instance => _instance ??= ChatManager._(); ChatManager._(); bool _isInitialized = false; bool get isInitialized => _isInitialized; bool _isPaused = false; bool get isPaused => _isPaused; /// Initialiser le chat (appelé après login réussi) /// Cette méthode est idempotente - peut être appelée plusieurs fois sans effet Future initializeChat() async { if (_isInitialized) { print('⚠️ Chat déjà initialisé - ignoré'); return; } try { // Récupérer les informations de l'utilisateur connecté final currentUser = CurrentUserService.instance; final apiService = ApiService.instance; final currentAmicale = CurrentAmicaleService.instance.currentAmicale; if (currentUser.currentUser == null) { print('❌ Impossible d\'initialiser le chat - utilisateur non connecté'); return; } print('🔄 Initialisation du chat pour ${currentUser.userName}...'); // Initialiser le module chat await ChatModule.init( apiUrl: apiService.baseUrl, userId: currentUser.currentUser!.id, userName: currentUser.userName ?? currentUser.userEmail ?? 'Utilisateur', userRole: currentUser.currentUser!.role, userEntite: currentUser.fkEntite ?? currentAmicale?.id, authToken: currentUser.sessionId, ); _isInitialized = true; print('✅ Chat initialisé avec succès - syncs démarrées toutes les 15 secondes'); } catch (e) { print('❌ Erreur initialisation chat: $e'); // Ne pas propager l'erreur pour ne pas bloquer l'app // Le chat sera simplement indisponible _isInitialized = false; } } /// Réinitialiser le chat (utile après changement d'amicale ou reconnexion) Future reinitialize() async { print('🔄 Réinitialisation du chat...'); dispose(); await Future.delayed(const Duration(milliseconds: 100)); await initializeChat(); } /// Arrêter le chat (appelé au logout ou fermeture app) void dispose() { if (_isInitialized) { try { // Nettoyer le module chat ET le service ChatModule.cleanup(); // Reset le flag _isInitialized dans ChatModule _isInitialized = false; _isPaused = false; print('🛑 Chat arrêté - syncs stoppées et module réinitialisé'); } catch (e) { print('⚠️ Erreur lors de l\'arrêt du chat: $e'); } } } /// Mettre en pause les synchronisations (app en arrière-plan) void pauseSyncs() { if (_isInitialized && !_isPaused) { try { ChatService.instance.pauseSyncs(); _isPaused = true; print('⏸️ Syncs chat mises en pause'); } catch (e) { print('⚠️ Erreur lors de la pause du chat: $e'); } } } /// Reprendre les synchronisations (app au premier plan) void resumeSyncs() { if (_isInitialized && _isPaused) { try { ChatService.instance.resumeSyncs(); _isPaused = false; print('▶️ Syncs chat reprises'); } catch (e) { print('⚠️ Erreur lors de la reprise du chat: $e'); } } } /// Vérifier si le chat est prêt à être utilisé bool get isReady { if (!_isInitialized) return false; // Vérifier que l'utilisateur est toujours connecté final currentUser = CurrentUserService.instance; if (currentUser.currentUser == null) { print('⚠️ Chat initialisé mais utilisateur déconnecté'); dispose(); return false; } // Ne pas considérer comme prêt si en pause if (_isPaused) { print('⚠️ Chat en pause'); return false; } return true; } }