/// Gestionnaire de cache pour le dashboard
/// Cache intelligent basé sur les rôles utilisateurs
library dashboard_cache_manager;

import 'dart:async';
import 'package:flutter/foundation.dart';
import '../models/user_role.dart';

/// Gestionnaire de cache pour optimiser les performances du dashboard
class DashboardCacheManager {
  static final Map<String, dynamic> _cache = {};
  static final Map<String, DateTime> _cacheTimestamps = {};
  static const Duration _cacheExpiry = Duration(minutes: 15);

  /// Invalide le cache pour un rôle spécifique
  static Future<void> invalidateForRole(UserRole role) async {
    final keysToRemove = _cache.keys
        .where((key) => key.startsWith('dashboard_${role.name}'))
        .toList();
    
    for (final key in keysToRemove) {
      _cache.remove(key);
      _cacheTimestamps.remove(key);
    }
    
    debugPrint('🗑️ Cache invalidé pour le rôle: ${role.displayName}');
  }

  /// Vide complètement le cache
  static Future<void> clear() async {
    _cache.clear();
    _cacheTimestamps.clear();
    debugPrint('🧹 Cache dashboard complètement vidé');
  }

  /// Obtient une valeur du cache
  static T? get<T>(String key) {
    final timestamp = _cacheTimestamps[key];
    if (timestamp == null) return null;
    
    // Vérifier l'expiration
    if (DateTime.now().difference(timestamp) > _cacheExpiry) {
      _cache.remove(key);
      _cacheTimestamps.remove(key);
      return null;
    }
    
    return _cache[key] as T?;
  }

  /// Met une valeur en cache
  static void set<T>(String key, T value) {
    _cache[key] = value;
    _cacheTimestamps[key] = DateTime.now();
  }

  /// Obtient les statistiques du cache
  static Map<String, dynamic> getStats() {
    final now = DateTime.now();
    final validEntries = _cacheTimestamps.entries
        .where((entry) => now.difference(entry.value) <= _cacheExpiry)
        .length;
    
    return {
      'totalEntries': _cache.length,
      'validEntries': validEntries,
      'expiredEntries': _cache.length - validEntries,
      'cacheHitRate': '${(validEntries / _cache.length * 100).toStringAsFixed(1)}%',
    };
  }
}
