using Asistencia.Data.Repositories; using Asistencia.Models; namespace Asistencia.Services; public class AuthService { private readonly ProfesorRepository _profesorRepo; private Profesor? _currentUser; public AuthService(ProfesorRepository profesorRepo) { _profesorRepo = profesorRepo; } public Profesor? CurrentUser => _currentUser; public async Task<(bool Success, string Message)> LoginAsync(string rut, string password) { if (string.IsNullOrWhiteSpace(rut) || string.IsNullOrWhiteSpace(password)) return (false, "Ingrese usuario y contraseña"); var profesor = await _profesorRepo.BuscarPorRutAsync(rut); if (profesor == null) return (false, "Usuario no encontrado"); if (profesor.CrearClave) return (false, "Debe crear su contraseña primero"); var authenticated = await _profesorRepo.AutenticarAsync(rut, password); if (authenticated == null) return (false, "Contraseña incorrecta"); _currentUser = authenticated; return (true, "Inicio de sesión exitoso"); } public async Task<(bool Success, string Message)> CrearClaveAsync(string rut, string nuevaClave, string confirmarClave) { if (string.IsNullOrWhiteSpace(nuevaClave)) return (false, "Ingrese una contraseña"); if (nuevaClave.Length < 6) return (false, "La contraseña debe tener al menos 6 caracteres"); if (nuevaClave != confirmarClave) return (false, "Las contraseñas no coinciden"); var encrypted = Helpers.CryptoHelper.Encriptar(nuevaClave); var result = await _profesorRepo.ActualizarClaveAsync(rut, encrypted); return result ? (true, "Contraseña creada exitosamente") : (false, "Error al crear contraseña"); } public async Task<(bool Success, string Message)> ActualizarEmailAsync(string email) { if (_currentUser == null) return (false, "No hay sesión activa"); if (string.IsNullOrWhiteSpace(email) || !email.Contains("@")) return (false, "Ingrese un email válido"); var result = await _profesorRepo.ActualizarEmailAsync(_currentUser.RutPasaporte, email); if (result) { _currentUser.Email = email; return (true, "Email actualizado exitosamente"); } return (false, "Error al actualizar email"); } public async Task<(bool Success, string Message)> CambiarClaveAsync(string claveActual, string nuevaClave, string confirmarClave) { if (_currentUser == null) return (false, "No hay sesión activa"); if (string.IsNullOrWhiteSpace(claveActual)) return (false, "Ingrese la contraseña actual"); if (string.IsNullOrWhiteSpace(nuevaClave) || nuevaClave.Length < 6) return (false, "La nueva contraseña debe tener al menos 6 caracteres"); if (nuevaClave != confirmarClave) return (false, "Las contraseñas no coinciden"); var authenticated = await _profesorRepo.AutenticarAsync(_currentUser.RutPasaporte, claveActual); if (authenticated == null) return (false, "La contraseña actual es incorrecta"); var encrypted = Helpers.CryptoHelper.Encriptar(nuevaClave); var result = await _profesorRepo.ActualizarClaveAsync(_currentUser.RutPasaporte, encrypted); return result ? (true, "Contraseña cambiada exitosamente") : (false, "Error al cambiar contraseña"); } public void Logout() { _currentUser = null; } }