/// BLoC pour la gestion des paramètres système (Clean Architecture) library system_settings_bloc; import 'package:dio/dio.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; import '../../domain/usecases/get_settings.dart'; import '../../domain/usecases/update_settings.dart'; import '../../domain/usecases/get_cache_stats.dart'; import '../../domain/usecases/clear_cache.dart' as uc; import '../../domain/usecases/reset_settings.dart'; import '../../domain/repositories/system_config_repository.dart'; import 'system_settings_event.dart'; import 'system_settings_state.dart'; @injectable class SystemSettingsBloc extends Bloc { final GetSettings _getSettings; final UpdateSettings _updateSettings; final GetCacheStats _getCacheStats; final uc.ClearCache _clearCache; final ResetSettings _resetSettings; final ISystemConfigRepository _repository; // Pour méthodes non-couvertes (metrics, test DB, test email) SystemSettingsBloc( this._getSettings, this._updateSettings, this._getCacheStats, this._clearCache, this._resetSettings, this._repository, ) : super(SystemSettingsInitial()) { on(_onLoadSystemConfig); on(_onUpdateSystemConfig); on(_onLoadCacheStats); on(_onLoadSystemMetrics); on(_onClearCache); on(_onTestDatabaseConnection); on(_onTestEmailConfiguration); on(_onResetSystemConfig); on(_onOptimizeDatabase); on(_onForceGlobalLogout); on(_onCleanupSessions); on(_onCleanOldLogs); on(_onPurgeExpiredData); on(_onAnalyzePerformance); on(_onCreateBackup); on(_onScheduleMaintenance); on(_onEmergencyMaintenance); on(_onCheckUpdates); on(_onExportLogs); on(_onGenerateUsageReport); on(_onGenerateAuditReport); on(_onExportGDPRData); } Future _onLoadSystemConfig( LoadSystemConfig event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final config = await _getSettings(); // ✅ Use case emit(SystemConfigLoaded(config)); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur de chargement: ${e.toString()}')); } } Future _onUpdateSystemConfig( UpdateSystemConfig event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final config = await _updateSettings(event.config); // ✅ Use case emit(SystemConfigLoaded(config)); emit(const SystemSettingsSuccess('Configuration mise à jour')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur de mise à jour: ${e.toString()}')); } } Future _onLoadCacheStats( LoadCacheStats event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final stats = await _getCacheStats(); // ✅ Use case emit(CacheStatsLoaded(stats)); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur de chargement: ${e.toString()}')); } } Future _onLoadSystemMetrics( LoadSystemMetrics event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final metrics = await _repository.getMetrics(); emit(SystemMetricsLoaded(metrics)); } catch (e) { emit(SystemSettingsError('Erreur de chargement des métriques: ${e.toString()}')); } } Future _onClearCache( ClearCache event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { await _clearCache(); // ✅ Use case emit(const SystemSettingsSuccess('Cache vidé avec succès')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onTestDatabaseConnection( TestDatabaseConnection event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final result = await _repository.testDatabase(); final success = result['success'] as bool? ?? false; final message = result['message'] as String? ?? 'Test terminé'; if (success) { emit(SystemSettingsSuccess(message)); } else { emit(SystemSettingsError(message)); } } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur de test: ${e.toString()}')); } } Future _onTestEmailConfiguration( TestEmailConfiguration event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final result = await _repository.testEmail(); final success = result['success'] as bool? ?? false; final message = result['message'] as String? ?? 'Test terminé'; if (success) { emit(SystemSettingsSuccess(message)); } else { emit(SystemSettingsError(message)); } } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur de test: ${e.toString()}')); } } /// Réinitialise la configuration système aux valeurs par défaut Future _onResetSystemConfig( ResetSystemConfig event, Emitter emit, ) async { emit(SystemSettingsLoading()); try { final config = await _resetSettings(); // ✅ Use case emit(SystemConfigLoaded(config)); emit(const SystemSettingsSuccess('Configuration réinitialisée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur de réinitialisation: ${e.toString()}')); } } Future _onOptimizeDatabase(OptimizeDatabase event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.optimizeDatabase(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Base de données optimisée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onForceGlobalLogout(ForceGlobalLogout event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.forceGlobalLogout(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Déconnexion globale déclenchée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onCleanupSessions(CleanupSessions event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.cleanupSessions(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Sessions nettoyées')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onCleanOldLogs(CleanOldLogs event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.cleanOldLogs(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Logs nettoyés')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onPurgeExpiredData(PurgeExpiredData event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.purgeExpiredData(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Données purgées')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onAnalyzePerformance(AnalyzePerformance event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.analyzePerformance(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Analyse terminée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onCreateBackup(CreateBackup event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.createBackup(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Sauvegarde créée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onScheduleMaintenance(ScheduleMaintenance event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.scheduleMaintenance(scheduledAt: event.scheduledAt, reason: event.reason); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Maintenance planifiée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onEmergencyMaintenance(EmergencyMaintenance event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.emergencyMaintenance(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Maintenance d\'urgence activée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onCheckUpdates(CheckUpdates event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.checkUpdates(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Vérification terminée')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onExportLogs(ExportLogs event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.exportLogs(); final count = result['count'] as int? ?? 0; emit(SystemSettingsSuccess('$count log(s) exporté(s)')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onGenerateUsageReport(GenerateUsageReport event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.generateUsageReport(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Rapport généré')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onGenerateAuditReport(GenerateAuditReport event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.generateAuditReport(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Rapport d\'audit généré')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } Future _onExportGDPRData(ExportGDPRData event, Emitter emit) async { emit(SystemSettingsLoading()); try { final result = await _repository.exportGDPRData(); emit(SystemSettingsSuccess(result['message'] as String? ?? 'Export RGPD initié')); } catch (e) { if (e is DioException && e.type == DioExceptionType.cancel) return; emit(SystemSettingsError('Erreur: ${e.toString()}')); } } }