import 'package:flutter/services.dart'; import 'package:flutter/foundation.dart'; import 'package:yaml/yaml.dart'; /// Classe pour charger et gérer la configuration du chat depuis chat_config.yaml class ChatConfigLoader { static ChatConfigLoader? _instance; static ChatConfigLoader get instance => _instance ??= ChatConfigLoader._(); Map? _config; ChatConfigLoader._(); /// Charger la configuration depuis le fichier YAML Future loadConfig() async { try { // Charger le fichier YAML final yamlString = await rootBundle.loadString('lib/chat/chat_config.yaml'); // Vérifier que le contenu n'est pas vide if (yamlString.isEmpty) { debugPrint('Fichier de configuration chat vide, utilisation de la configuration par défaut'); _config = _getDefaultConfig(); return; } // Parser le YAML dynamic yamlMap; try { yamlMap = loadYaml(yamlString); } catch (parseError) { debugPrint('Erreur de parsing YAML (utilisation de la config par défaut): $parseError'); debugPrint('Contenu YAML problématique (premiers 500 caractères): ${yamlString.substring(0, yamlString.length > 500 ? 500 : yamlString.length)}'); _config = _getDefaultConfig(); return; } // Convertir en Map _config = _convertYamlToMap(yamlMap); debugPrint('Configuration chat chargée avec succès'); } catch (e) { debugPrint('Erreur lors du chargement de la configuration chat: $e'); // Utiliser une configuration par défaut en cas d'erreur _config = _getDefaultConfig(); } } /// Convertir YamlMap en Map standard dynamic _convertYamlToMap(dynamic yamlData) { if (yamlData is YamlMap) { final map = {}; yamlData.forEach((key, value) { map[key.toString()] = _convertYamlToMap(value); }); return map; } else if (yamlData is YamlList) { return yamlData.map((item) => _convertYamlToMap(item)).toList(); } else { return yamlData; } } /// Obtenir les permissions pour un rôle Map getPermissionsForRole(int role) { if (_config == null) { return {}; } final permissions = _config!['chat_permissions'] as Map?; if (permissions == null) { return {}; } return permissions['role_$role'] as Map? ?? {}; } /// Vérifier si un utilisateur peut envoyer un message à un autre bool canSendMessageTo({ required int senderRole, required int recipientRole, int? senderEntite, int? recipientEntite, }) { final permissions = getPermissionsForRole(senderRole); final canMessageWith = permissions['can_message_with'] as List?; if (canMessageWith == null) { return false; } for (final rule in canMessageWith) { if (rule['role'] == recipientRole) { final condition = rule['condition'] as String?; switch (condition) { case 'same_entite': return senderEntite != null && recipientEntite != null && senderEntite == recipientEntite; case 'all': return true; default: return false; } } } return false; } /// Obtenir les destinataires possibles pour un rôle List> getPossibleRecipientsConfig(int role) { final permissions = getPermissionsForRole(role); final canMessageWith = permissions['can_message_with'] as List?; if (canMessageWith == null) { return []; } return canMessageWith.map((rule) { return { 'role': rule['role'], 'condition': rule['condition'], 'description': rule['description'], 'allow_selection': rule['allow_selection'] ?? false, 'allow_broadcast': rule['allow_broadcast'] ?? false, }; }).toList(); } /// Obtenir le nom d'un rôle String getRoleName(int role) { final permissions = getPermissionsForRole(role); return permissions['name'] as String? ?? 'Utilisateur'; } /// Obtenir la description d'un rôle String getRoleDescription(int role) { final permissions = getPermissionsForRole(role); return permissions['description'] as String? ?? ''; } /// Obtenir le texte d'aide pour un rôle String getHelpText(int role) { final permissions = getPermissionsForRole(role); return permissions['help_text'] as String? ?? ''; } /// Vérifier si un rôle peut créer des groupes bool canCreateGroup(int role) { final permissions = getPermissionsForRole(role); return permissions['can_create_group'] as bool? ?? false; } /// Vérifier si un rôle peut faire du broadcast bool canBroadcast(int role) { final permissions = getPermissionsForRole(role); return permissions['can_broadcast'] as bool? ?? false; } /// Obtenir la configuration UI Map getUIConfig() { return _config?['ui_config'] as Map? ?? {}; } /// Obtenir les messages de l'interface Map getUIMessages() { final uiConfig = getUIConfig(); return uiConfig['messages'] as Map? ?? {}; } /// Obtenir la couleur d'un rôle String getRoleColor(int role) { final uiConfig = getUIConfig(); final roleColors = uiConfig['role_colors'] as Map?; return roleColors?[role.toString()] as String? ?? '#64748B'; } /// Obtenir les informations du module Map getModuleInfo() { return _config?['module_info'] as Map? ?? { 'version': '1.0.0', 'name': 'Chat Module Light', 'description': 'Module de chat autonome et portable pour GEOSECTOR' }; } /// Obtenir la version du module String getModuleVersion() { final moduleInfo = getModuleInfo(); return moduleInfo['version'] as String? ?? '1.0.0'; } /// Configuration par défaut si le fichier YAML n'est pas trouvé Map _getDefaultConfig() { return { 'chat_permissions': { 'role_1': { 'name': 'Membre', 'can_message_with': [ {'role': 1, 'condition': 'same_entite'}, {'role': 2, 'condition': 'same_entite'}, ], 'can_create_group': false, 'can_broadcast': false, 'help_text': 'Vous pouvez discuter avec les membres de votre amicale', }, 'role_2': { 'name': 'Admin Amicale', 'can_message_with': [ {'role': 1, 'condition': 'same_entite'}, {'role': 2, 'condition': 'same_entite'}, {'role': 9, 'condition': 'all'}, ], 'can_create_group': true, 'can_broadcast': false, 'help_text': 'Vous pouvez discuter avec les membres et les super admins', }, 'role_9': { 'name': 'Super Admin', 'can_message_with': [ {'role': 2, 'condition': 'all', 'allow_selection': true, 'allow_broadcast': true}, ], 'can_create_group': true, 'can_broadcast': true, 'help_text': 'Vous pouvez envoyer des messages aux administrateurs d\'amicale', }, }, 'ui_config': { 'show_role_badge': true, 'enable_autocomplete': true, 'messages': { 'no_permission': 'Vous n\'avez pas la permission', 'search_placeholder': 'Rechercher...', }, }, }; } }