import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../core/services/session_storage.dart'; import '../../core/models/models.dart'; import '../../core/services/services.dart'; import 'package:bcrypt/bcrypt.dart'; enum Status { uninitialized, authenticated, authenticating, unauthenticated } class LoginViewModel extends ChangeNotifier { Status _status = Status.uninitialized; Status get status => _status; bool hasErrors = false; Map? _errores = {}; bool _obscureText = true; Usuario? _usuario; int? _idUsuario; bool _isLoading = true; bool get isLoading => _isLoading; bool get obscureText => _obscureText; // Getters Usuario? get usuario => _usuario; Map? get errores => _errores; Future login(String correo, String contrasena) async { try { print("Iniciando proceso de login para: $correo"); List usuarios = await DatabaseService().obtenerTodos(); Usuario? usuario = usuarios.firstWhere( (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(), orElse: () => Usuario(), ); if (usuario.id != 0 && usuario.clave != null) { bool esContrasenaValida = BCrypt.checkpw(contrasena, usuario.clave!); if (esContrasenaValida) { _status = Status.authenticated; _errores = null; _idUsuario = usuario.id; await SessionStorage().saveId(_idUsuario!); notifyListeners(); } else { _errores = {'contrasena': 'Contraseña incorrecta'}; _status = Status.unauthenticated; notifyListeners(); } } else { _errores = {'correo': 'El correo no existe en el sistema'}; _status = Status.unauthenticated; notifyListeners(); } } catch (e) { print("Error durante el proceso de login: $e"); _status = Status.unauthenticated; notifyListeners(); } } Future checkSession() async { _isLoading = true; // Inicia el estado de carga notifyListeners(); int? idUsuarioGuardado = await SessionStorage().getId(); if (idUsuarioGuardado != null) { print("Sesión encontrada para el ID de usuario: $idUsuarioGuardado"); _idUsuario = idUsuarioGuardado; _status = Status.authenticated; } else { print("No se encontró ninguna sesión activa."); _status = Status.unauthenticated; } _isLoading = false; notifyListeners(); } void logOut() async { print("Cerrando sesión..."); _usuario = null; _idUsuario = null; _status = Status.unauthenticated; _errores = {}; await SessionStorage().clearId(); print("ID de usuario eliminado de SharedPreferences."); notifyListeners(); } void showPassword() { _obscureText = !_obscureText; notifyListeners(); } Future showExitConfirmationDialog(context) async { final bool? confirm = await showDialog( context: context, builder: (ctx) { return AlertDialog( title: const Text('¿Cerrar sesión?'), content: const Text('¿Estás seguro de que quieres cerrar la sesión?'), actions: [ TextButton( onPressed: () => Navigator.of(ctx).pop(false), child: const Text('Cancelar', style: TextStyle(color: Colors.red)), ), TextButton( onPressed: () async { Provider.of(context, listen: false).logOut(); Navigator.of(ctx).pop(true); }, child: const Text('Aceptar'), ), ], ); }, ); if (confirm == true) { Navigator.of(context).pushNamedAndRemoveUntil('login', (route) => false); } } }