TheInfinityIQ_GCP/src/gcp-backend/GCP.Api/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs
#nullable disable

using System.Text;

using GCP.Api.Data.Entities;

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;

namespace GCP.Api.Areas.Identity.Pages.Account
{
	[AllowAnonymous]
	public class RegisterConfirmationModel : PageModel
	{
		private readonly UserManager<User> _userManager;
		private readonly IEmailSender _sender;

		public RegisterConfirmationModel(UserManager<User> userManager, IEmailSender sender)
		{
			_userManager = userManager;
			_sender = sender;
			_ = _sender; // NOTE: for ignoring message/warning
		}

		public string Email { get; set; }
		public bool DisplayConfirmAccountLink { get; set; }
		public string EmailConfirmationUrl { get; set; }

		public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
		{
			if (email is null)
			{
				return RedirectToPage("/Index");
			}
			returnUrl ??= Url.Content("~/");

			var user = await _userManager.FindByEmailAsync(email);
			if (user is null)
			{
				return NotFound($"Unable to load user with email '{email}'.");
			}

			Email = email;
			// Once you add a real email sender, you should remove this code that lets you confirm the account
			DisplayConfirmAccountLink = true;
			if (DisplayConfirmAccountLink)
			{
				var userId = await _userManager.GetUserIdAsync(user);
				var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
				code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
				EmailConfirmationUrl = Url.Page(
					"/Account/ConfirmEmail",
					pageHandler: null,
					values: new { area = "Identity", userId, code, returnUrl },
					protocol: Request.Scheme);
			}

			return Page();
		}
	}
}
