import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:youmazgestion/Models/users.dart'; import 'package:youmazgestion/Services/app_database.dart'; class UserController extends GetxController { final _username = ''.obs; final _email = ''.obs; final _role = ''.obs; final _name = ''.obs; final _lastname = ''.obs; final _password = ''.obs; final _userId = 0.obs; // ✅ Ajout de l'ID utilisateur String get username => _username.value; String get email => _email.value; String get role => _role.value; String get name => _name.value; String get lastname => _lastname.value; String get password => _password.value; int get userId => _userId.value; @override void onInit() { super.onInit(); loadUserData(); // Charger les données au démarrage } // ✅ CORRECTION : Charger les données complètes depuis SharedPreferences ET la base de données Future loadUserData() async { try { final prefs = await SharedPreferences.getInstance(); final storedUsername = prefs.getString('username') ?? ''; final storedRole = prefs.getString('role') ?? ''; final storedUserId = prefs.getInt('user_id') ?? 0; if (storedUsername.isNotEmpty) { try { // Récupérer les données complètes depuis la base de données Users user = await AppDatabase.instance.getUser(storedUsername); // Mettre à jour TOUTES les données _username.value = user.username; _email.value = user.email; _name.value = user.name; _lastname.value = user.lastName; _password.value = user.password; _role.value = storedRole; // Récupéré depuis SharedPreferences _userId.value = storedUserId; // Récupéré depuis SharedPreferences print("✅ Données chargées depuis la DB - Username: ${_username.value}"); print("✅ Name: ${_name.value}, Email: ${_email.value}"); print("✅ Role: ${_role.value}, UserID: ${_userId.value}"); } catch (dbError) { print('❌ Erreur DB, chargement depuis SharedPreferences uniquement: $dbError'); // Fallback : charger depuis SharedPreferences uniquement _username.value = storedUsername; _email.value = prefs.getString('email') ?? ''; _role.value = storedRole; _name.value = prefs.getString('name') ?? ''; _lastname.value = prefs.getString('lastname') ?? ''; _userId.value = storedUserId; } } else { print("❌ Aucun utilisateur stocké trouvé"); } } catch (e) { print('❌ Erreur lors du chargement des données utilisateur: $e'); } } // ✅ NOUVELLE MÉTHODE : Mise à jour complète avec Users + credentials void setUserWithCredentials(Users user, String role, int userId) { _username.value = user.username; _email.value = user.email; _role.value = role; // Rôle depuis les credentials _name.value = user.name; _lastname.value = user.lastName; _password.value = user.password; _userId.value = userId; // ID depuis les credentials print("✅ Utilisateur mis à jour avec credentials:"); print(" Username: ${_username.value}"); print(" Name: ${_name.value}"); print(" Email: ${_email.value}"); print(" Role: ${_role.value}"); print(" UserID: ${_userId.value}"); // Sauvegarder dans SharedPreferences saveUserData(); } // ✅ MÉTHODE EXISTANTE AMÉLIORÉE void setUser(Users user) { _username.value = user.username; _email.value = user.email; _role.value = user.role; _name.value = user.name; _lastname.value = user.lastName; _password.value = user.password; // Note: _userId reste inchangé si pas fourni print("✅ Utilisateur mis à jour (méthode legacy):"); print(" Username: ${_username.value}"); print(" Role: ${_role.value}"); // Sauvegarder dans SharedPreferences saveUserData(); } // ✅ CORRECTION : Sauvegarder TOUTES les données importantes Future saveUserData() async { try { final prefs = await SharedPreferences.getInstance(); await prefs.setString('username', _username.value); await prefs.setString('email', _email.value); await prefs.setString('role', _role.value); await prefs.setString('name', _name.value); await prefs.setString('lastname', _lastname.value); await prefs.setInt('user_id', _userId.value); // ✅ Sauvegarder l'ID print("✅ Données sauvegardées avec succès dans SharedPreferences"); } catch (e) { print('❌ Erreur lors de la sauvegarde des données utilisateur: $e'); } } // ✅ CORRECTION : Vider TOUTES les données (SharedPreferences + Observables) Future clearUserData() async { try { final prefs = await SharedPreferences.getInstance(); // Vider SharedPreferences await prefs.remove('username'); await prefs.remove('email'); await prefs.remove('role'); await prefs.remove('name'); await prefs.remove('lastname'); await prefs.remove('user_id'); // ✅ Supprimer l'ID aussi // Vider les variables observables _username.value = ''; _email.value = ''; _role.value = ''; _name.value = ''; _lastname.value = ''; _password.value = ''; _userId.value = 0; // ✅ Réinitialiser l'ID print("✅ Toutes les données utilisateur ont été effacées"); } catch (e) { print('❌ Erreur lors de l\'effacement des données utilisateur: $e'); } } // ✅ MÉTHODE UTILITAIRE : Vérifier si un utilisateur est connecté bool get isLoggedIn => _username.value.isNotEmpty && _userId.value > 0; // ✅ MÉTHODE UTILITAIRE : Obtenir le nom complet String get fullName => '${_name.value} ${_lastname.value}'.trim(); Future hasPermission(String permission, String route) async { try { if (_username.value.isEmpty) { print('⚠️ Username vide, rechargement des données...'); await loadUserData(); } if (_username.value.isEmpty) { print('❌ Impossible de vérifier les permissions : utilisateur non connecté'); return false; } return await AppDatabase.instance.hasPermission(username, permission, route); } catch (e) { print('❌ Erreur vérification permission: $e'); return false; // Sécurité : refuser l'accès en cas d'erreur } } Future hasAnyPermission(List permissionNames, String menuRoute) async { for (String permissionName in permissionNames) { if (await hasPermission(permissionName, menuRoute)) { return true; } } return false; } // ✅ MÉTHODE DEBUG : Afficher l'état actuel void debugPrintUserState() { print("=== ÉTAT UTILISATEUR ==="); print("Username: ${_username.value}"); print("Name: ${_name.value}"); print("Lastname: ${_lastname.value}"); print("Email: ${_email.value}"); print("Role: ${_role.value}"); print("UserID: ${_userId.value}"); print("IsLoggedIn: $isLoggedIn"); print("========================"); } }