import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:youmazgestion/Models/users.dart'; import 'package:youmazgestion/Services/stock_managementDatabase.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 final _pointDeVenteId = 0.obs; final _pointDeVenteDesignation = ''.obs; 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; int get pointDeVenteId => _pointDeVenteId.value; String get pointDeVenteDesignation => _pointDeVenteDesignation.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; final storedPointDeVenteId = prefs.getInt('point_de_vente_id') ?? 0; final storedPointDeVenteDesignation = prefs.getString('point_de_vente_designation') ?? ''; if (storedUsername.isNotEmpty) { try { Users user = await AppDatabase.instance.getUser(storedUsername); _username.value = user.username; _email.value = user.email; _name.value = user.name; _lastname.value = user.lastName; _password.value = user.password; _role.value = storedRole; _userId.value = storedUserId; _pointDeVenteId.value = storedPointDeVenteId; _pointDeVenteDesignation.value = storedPointDeVenteDesignation; // Si la désignation n'est pas sauvegardée, on peut la récupérer if (_pointDeVenteDesignation.value.isEmpty && _pointDeVenteId.value > 0) { await loadPointDeVenteDesignation(); } } catch (dbError) { // Fallback _username.value = storedUsername; _email.value = prefs.getString('email') ?? ''; _role.value = storedRole; _name.value = prefs.getString('name') ?? ''; _lastname.value = prefs.getString('lastname') ?? ''; _userId.value = storedUserId; _pointDeVenteId.value = storedPointDeVenteId; _pointDeVenteDesignation.value = storedPointDeVenteDesignation; } } } catch (e) { print('❌ Erreur lors du chargement des données utilisateur: $e'); } } Future loadPointDeVenteDesignation() async { if (_pointDeVenteId.value <= 0) return; try { final pointDeVente = await AppDatabase.instance.getPointDeVenteById(_pointDeVenteId.value); if (pointDeVente != null) { _pointDeVenteDesignation.value = pointDeVente['designation'] as String; await saveUserData(); // Sauvegarder la désignation } } catch (e) { print('❌ Erreur lors du chargement de la désignation du point de vente: $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 _pointDeVenteId.value = user.pointDeVenteId ?? 0; 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); await prefs.setInt('point_de_vente_id', _pointDeVenteId.value); await prefs.setString('point_de_vente_designation', _pointDeVenteDesignation.value); 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(); 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'); await prefs.remove('point_de_vente_id'); await prefs.remove('point_de_vente_designation'); _username.value = ''; _email.value = ''; _role.value = ''; _name.value = ''; _lastname.value = ''; _password.value = ''; _userId.value = 0; _pointDeVenteId.value = 0; _pointDeVenteDesignation.value = ''; } 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("PointDeVenteID: ${_pointDeVenteId.value}"); print("PointDeVente: ${_pointDeVenteDesignation.value}"); print("IsLoggedIn: $isLoggedIn"); print("========================"); } }