using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using vita_asistente.Models; using vita_asistente.ViewModels; using System.Threading.Tasks; namespace vita_asistente.Controllers { public class AccountController : Controller { private readonly UserManager _userManager; private readonly SignInManager _signInManager; public AccountController(UserManager userManager, SignInManager signInManager) { _userManager = userManager; _signInManager = signInManager; } // GET: /Account/Register [HttpGet] public IActionResult Register() { return View(); } // POST: /Account/Register [HttpPost] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model) { if (ModelState.IsValid) { // Crear el usuario con los datos del formulario var user = new ApplicationUser { UserName = model.Email, // Usamos Email como nombre de usuario Email = model.Email, Nombre = model.Nombre, Apellido = model.Apellido, Documento = model.Documento, Direccion = model.Direccion, RolPrincipal = "Usuario" // valor por defecto, luego puedes asignar roles }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { // Asignar rol "Usuario" por defecto (si el rol existe) // Si no existe, lo creamos o lo ignoramos. Lo veremos después. // Por ahora, solo iniciamos sesión. await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // Si llegamos aquí, algo falló, devolver la vista con errores return View(model); } // GET: /Account/Login [HttpGet] public IActionResult Login(string? returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; return View(); } // POST: /Account/Login [HttpPost] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string? returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync( model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { return RedirectToLocal(!string.IsNullOrEmpty(returnUrl) ? returnUrl : string.Empty); } if (result.RequiresTwoFactor) { // Manejar 2FA si lo implementas después return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe }); } if (result.IsLockedOut) { return RedirectToAction(nameof(Lockout)); } else { ModelState.AddModelError(string.Empty, "Intento de inicio de sesión inválido."); return View(model); } } // Si llegamos aquí, algo falló return View(model); } // POST: /Account/Logout [HttpPost] [ValidateAntiForgeryToken] public async Task Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } // Acciones auxiliares para redirección, 2FA, bloqueo, etc. (opcionales) private IActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } } // GET: /Account/Lockout [HttpGet] public IActionResult Lockout() { return View(); } // GET: /Account/LoginWith2fa (opcional) [HttpGet] public IActionResult LoginWith2fa(bool rememberMe, string? returnUrl = null) { // Implementar si se usa 2FA return View(); } } }