import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:youmazgestion/Views/particles.dart' show ParticleBackground; import 'package:youmazgestion/accueil.dart'; import 'package:youmazgestion/Services/app_database.dart'; import '../Models/users.dart'; import '../controller/userController.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State { late TextEditingController _usernameController; late TextEditingController _passwordController; final UserController userController = Get.put(UserController()); bool _isErrorVisible = false; bool _isLoading = false; String _errorMessage = 'Nom d\'utilisateur ou mot de passe invalide'; @override void initState() { super.initState(); _usernameController = TextEditingController(); _passwordController = TextEditingController(); checkUserCount(); } void checkUserCount() async { try { final userCount = await AppDatabase.instance.getUserCount(); print('Nombre d\'utilisateurs trouvés: $userCount'); // Debug // Commentez cette partie pour permettre le login même sans utilisateurs /* if (userCount == 0) { if (mounted) { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const AccueilPage()), ); } } */ } catch (error) { print('Erreur lors de la vérification du nombre d\'utilisateurs: $error'); setState(() { _errorMessage = 'Erreur de connexion à la base de données'; _isErrorVisible = true; }); } } @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } Future saveUserData(Users user, String role, int userId) async { try { // ✅ CORRECTION : Utiliser la nouvelle méthode du contrôleur // Le contrôleur se charge maintenant de tout (observable + SharedPreferences) userController.setUserWithCredentials(user, role, userId); print('Utilisateur sauvegardé: ${user.username}, rôle: $role, id: $userId'); } catch (error) { print('Erreur lors de la sauvegarde: $error'); throw Exception('Erreur lors de la sauvegarde des données utilisateur'); } } void _login() async { if (_isLoading) return; final String username = _usernameController.text.trim(); final String password = _passwordController.text.trim(); // Validation basique if (username.isEmpty || password.isEmpty) { setState(() { _errorMessage = 'Veuillez saisir le nom d\'utilisateur et le mot de passe'; _isErrorVisible = true; }); return; } setState(() { _isLoading = true; _isErrorVisible = false; }); try { print('Tentative de connexion pour: $username'); // Vérification de la connexion à la base de données final dbInstance = AppDatabase.instance; // Test de connexion à la base try { final userCount = await dbInstance.getUserCount(); print('Base de données accessible, $userCount utilisateurs trouvés'); } catch (dbError) { throw Exception('Impossible d\'accéder à la base de données: $dbError'); } // Vérifier les identifiants bool isValidUser = await dbInstance.verifyUser(username, password); print('Résultat de la vérification: $isValidUser'); if (isValidUser) { // Récupérer les informations complètes de l'utilisateur Users user = await dbInstance.getUser(username); print('Utilisateur récupéré: ${user.username}'); // Récupérer les credentials Map? userCredentials = await dbInstance.getUserCredentials(username, password); if (userCredentials != null) { print('Connexion réussie pour: ${user.username}'); print('Rôle: ${userCredentials['role']}'); print('ID: ${userCredentials['id']}'); // ✅ CORRECTION : Sauvegarder ET mettre à jour le contrôleur await saveUserData( user, userCredentials['role'] as String, userCredentials['id'] as int, ); // Navigation if (mounted) { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const AccueilPage()), ); } } else { throw Exception('Erreur lors de la récupération des credentials'); } } else { print('Identifiants invalides pour: $username'); setState(() { _errorMessage = 'Nom d\'utilisateur ou mot de passe invalide'; _isErrorVisible = true; }); } } catch (error) { print('Erreur lors de la connexion: $error'); setState(() { _errorMessage = 'Erreur de connexion: ${error.toString()}'; _isErrorVisible = true; }); } finally { if (mounted) { setState(() { _isLoading = false; }); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text( 'Login', style: TextStyle(color: Colors.white), ), backgroundColor: const Color.fromARGB(255, 4, 54, 95), centerTitle: true, ), body: ParticleBackground( child: Center( child: Container( width: MediaQuery.of(context).size.width * 0.5, height: MediaQuery.of(context).size.height * 0.8, padding: const EdgeInsets.all(16.0), decoration: BoxDecoration( color: Colors.white, shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(30.0), ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Container( padding: const EdgeInsets.symmetric(vertical: 16.0), child: const Icon( Icons.lock_outline, size: 100.0, color: Color.fromARGB(255, 4, 54, 95), ), ), TextField( controller: _usernameController, enabled: !_isLoading, decoration: InputDecoration( labelText: 'Username', prefixIcon: const Icon(Icons.person, color: Colors.blueAccent), border: OutlineInputBorder( borderRadius: BorderRadius.circular(30.0), ), ), ), const SizedBox(height: 16.0), TextField( controller: _passwordController, enabled: !_isLoading, decoration: InputDecoration( labelText: 'Password', prefixIcon: const Icon(Icons.lock, color: Colors.redAccent), border: OutlineInputBorder( borderRadius: BorderRadius.circular(30.0), ), ), obscureText: true, onSubmitted: (_) => _login(), ), const SizedBox(height: 16.0), Visibility( visible: _isErrorVisible, child: Text( _errorMessage, style: const TextStyle( color: Colors.red, fontSize: 14, ), textAlign: TextAlign.center, ), ), const SizedBox(height: 16.0), ElevatedButton( onPressed: _isLoading ? null : _login, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF0015B7), elevation: 5.0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), minimumSize: const Size(double.infinity, 48), ), child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: Colors.white, strokeWidth: 2, ), ) : const Text( 'Se connecter', style: TextStyle( color: Colors.white, fontSize: 16, ), ), ), // Bouton de debug (à supprimer en production) if (_isErrorVisible) TextButton( onPressed: () async { try { final count = await AppDatabase.instance.getUserCount(); print('Debug: $count utilisateurs dans la base'); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('$count utilisateurs trouvés')), ); } catch (e) { print('Debug error: $e'); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Erreur: $e')), ); } }, child: const Text('Debug: Vérifier BDD'), ), ], ), ), ), ), ); } }