using System.Security.Claims;

namespace Hua.Todo.Application.CloudSync.Auth;

/// <summary>
/// 云同步鉴权相关的 <see cref="ClaimsPrincipal"/> 扩展方法。
/// </summary>
public static class ClaimsPrincipalExtensions
{
    /// <summary>
    /// 获取当前用户 ID（若未登录则返回 null）。
    /// </summary>
    /// <param name="user">当前用户主体。</param>
    /// <returns>用户 ID。</returns>
    public static Guid? GetUserId(this ClaimsPrincipal user)
    {
        var value = user.FindFirstValue(ClaimTypes.NameIdentifier);
        return Guid.TryParse(value, out var id) ? id : null;
    }

    /// <summary>
    /// 获取当前会话 ID（若不可用则返回 null）。
    /// </summary>
    /// <param name="user">当前用户主体。</param>
    /// <returns>会话 ID。</returns>
    public static Guid? GetSessionId(this ClaimsPrincipal user)
    {
        var value = user.FindFirstValue(ClaimTypes.Sid);
        return Guid.TryParse(value, out var id) ? id : null;
    }

    /// <summary>
    /// 判断是否具备指定权限。
    /// </summary>
    /// <param name="user">当前用户主体。</param>
    /// <param name="permission">权限点。</param>
    /// <returns>是否具备权限。</returns>
    public static bool HasPermission(this ClaimsPrincipal user, string permission)
    {
        return user.Claims.Any(c => c.Type == CloudClaims.Permission && string.Equals(c.Value, permission, StringComparison.OrdinalIgnoreCase));
    }

    /// <summary>
    /// 判断是否已完成二次认证（step-up）。
    /// </summary>
    /// <param name="user">当前用户主体。</param>
    /// <returns>是否已完成二次认证。</returns>
    public static bool HasStepUp(this ClaimsPrincipal user)
    {
        return user.Claims.Any(c => c.Type == CloudClaims.StepUp && string.Equals(c.Value, "true", StringComparison.OrdinalIgnoreCase));
    }
}

