import 'package:shared_preferences/shared_preferences.dart'; class SessionManager { static const String _keyUserId = 'user_id'; static const String _keyToken = 'user_token'; static const String _keyRole = 'user_role'; static const String _keyPIN = 'user_pin'; // Ajouté pour le PIN static const String _keyLoginDate = 'login_date'; static const String _keyIsLoggedIn = 'is_logged_in'; static SessionManager? _instance; static SharedPreferences? _prefs; SessionManager._internal(); factory SessionManager() { _instance ??= SessionManager._internal(); return _instance!; } Future _initPrefs() async { _prefs ??= await SharedPreferences.getInstance(); } /// Sauvegarder une session Future saveSession( String userId, { String? token, String? role, String? pinkey, // Ajouté pour le PIN }) async { await _initPrefs(); await _prefs!.setString(_keyUserId, userId); await _prefs!.setBool(_keyIsLoggedIn, true); await _prefs!.setString(_keyLoginDate, DateTime.now().toIso8601String()); if (token != null) { await _prefs!.setString(_keyToken, token); } if (role != null) { await _prefs!.setString(_keyRole, role); } if (pinkey != null) { await _prefs!.setString(_keyPIN, pinkey); } print('Session sauvegardée pour $userId'); } /// Vérifier si l'utilisateur est connecté Future isLoggedIn() async { await _initPrefs(); return _prefs!.getBool(_keyIsLoggedIn) ?? false; } /// Récupérer l'ID utilisateur Future getUserId() async { await _initPrefs(); return _prefs!.getString(_keyUserId); } /// Récupérer le token Future getToken() async { await _initPrefs(); return _prefs!.getString(_keyToken); } /// Récupérer le rôle Future getRole() async { await _initPrefs(); return _prefs!.getString(_keyRole); } /// Récupérer le PIN (nouvelle méthode) Future getPIN() async { await _initPrefs(); return _prefs!.getString(_keyPIN); } /// Méthode synchrone pour le PIN (utilisée dans AuthController) String? getPINSync() { return _prefs?.getString(_keyPIN); } /// Récupérer la date de connexion Future getLoginDate() async { await _initPrefs(); String? dateString = _prefs!.getString(_keyLoginDate); if (dateString != null) { return DateTime.parse(dateString); } return null; } /// Effacer la session Future clearSession() async { await _initPrefs(); await _prefs!.remove(_keyUserId); await _prefs!.remove(_keyToken); await _prefs!.remove(_keyRole); await _prefs!.remove(_keyPIN); // Supprimer aussi le PIN await _prefs!.remove(_keyLoginDate); await _prefs!.setBool(_keyIsLoggedIn, false); print('Session effacée'); } /// Mettre à jour le token uniquement Future updateToken(String newToken) async { await _initPrefs(); await _prefs!.setString(_keyToken, newToken); } /// Vérifier si la session a expiré Future isSessionExpired({Duration? maxAge}) async { maxAge ??= Duration(days: 30); // 30 jours par défaut DateTime? loginDate = await getLoginDate(); if (loginDate == null) return true; return DateTime.now().difference(loginDate) > maxAge; } /// Obtenir toutes les informations de session Future> getSessionInfo() async { await _initPrefs(); return { 'user_id': await getUserId(), 'token': await getToken(), 'role': await getRole(), 'pin': await getPIN(), 'login_date': await getLoginDate(), 'is_logged_in': await isLoggedIn(), 'is_expired': await isSessionExpired(), }; } /// Debug: Afficher les informations de session Future debugPrintSession() async { Map sessionInfo = await getSessionInfo(); print('=== Informations de Session ==='); sessionInfo.forEach((key, value) { if (key == 'pin' || key == 'token') { // Masquer les données sensibles print('$key: ${value?.toString().substring(0, 4) ?? 'null'}...'); } else { print('$key: $value'); } }); print('================================'); } }