using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
namespace EnvelopeGenerator.GeneratorAPI.Controllers
{
///
/// Provides extension methods for extracting user information from a .
///
public static class ControllerExtensions
{
///
/// Attempts to retrieve the user's ID from the claims. Returns null if the ID is not found or invalid.
///
/// The representing the user.
/// The user's ID as an integer, or null if not found or invalid.
public static int? GetIdOrDefault(this ClaimsPrincipal user)
=> int.TryParse(user.FindFirstValue(ClaimTypes.NameIdentifier) ?? user.FindFirstValue("sub"), out int result)
? result : null;
///
/// Retrieves the user's ID from the claims. Throws an exception if the ID is missing or invalid.
///
/// The representing the user.
/// The user's ID as an integer.
/// Thrown if the user ID claim is missing or invalid.
public static int GetId(this ClaimsPrincipal user)
=> user.GetIdOrDefault()
?? throw new InvalidOperationException("User ID claim is missing or invalid. This may indicate a misconfigured or forged JWT token.");
///
/// Retrieves the username from the claims, if available.
///
/// The representing the user.
/// The username as a string, or null if not found.
public static string? GetUsernameOrDefault(this ClaimsPrincipal user)
=> user.FindFirst(ClaimTypes.Name)?.Value;
///
/// Retrieves the user's surname (last name) from the claims, if available.
///
/// The representing the user.
/// The surname as a string, or null if not found.
public static string? GetNameOrDefault(this ClaimsPrincipal user)
=> user.FindFirst(ClaimTypes.Surname)?.Value;
///
/// Retrieves the user's given name (first name) from the claims, if available.
///
/// The representing the user.
/// The given name as a string, or null if not found.
public static string? GetPrenameOrDefault(this ClaimsPrincipal user)
=> user.FindFirst(ClaimTypes.GivenName)?.Value;
///
/// Retrieves the user's email address from the claims, if available.
///
/// The representing the user.
/// The email address as a string, or null if not found.
public static string? GetEmailOrDefault(this ClaimsPrincipal user)
=> user.FindFirst(ClaimTypes.Email)?.Value;
}
}