using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;
using Fantasy;
using Fantasy.Entitas.Interface;
using Microsoft.IdentityModel.Tokens;

namespace NB.Authentication.Jwt;

public sealed class AuthenticationJwtComponentAwakeSystem : AwakeSystem<AuthenticationJwtComponent>
{
    protected override void Awake(AuthenticationJwtComponent self)
    {
        self.Awake();
    }
}

public static class AuthenticationJwtComponentSystem 
{
    public static void Awake(this AuthenticationJwtComponent self)
    {
        var rsa = RSA.Create();
        rsa.ImportRSAPublicKey(Convert.FromBase64String(self.PublicKeyPem), out _);
        rsa.ImportRSAPrivateKey(Convert.FromBase64String(self.PrivateKeyPem), out _);
        self.SigningCredentials = new SigningCredentials(new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256);
        // 创建 TokenValidationParameters 对象，用于配置验证参数
        self.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateLifetime = false, // 禁止令牌验证时间是否过期
            ValidateIssuer = true, // 验证发行者
            ValidateAudience = true, // 验证受众
            ValidateIssuerSigningKey = true, // 验证签名密钥
            ValidIssuer = "NoBug", // 有效的发行者
            ValidAudience = "NoBug", // 有效的受众
            IssuerSigningKey = new RsaSecurityKey(rsa) // RSA公钥作为签名密钥
        };
    }

    public static string GetToken(this AuthenticationJwtComponent self, long aId, string address, uint sceneId, int region)
    {
        var jwtPayload = new JwtPayload()
        {
            { "aId", aId },
            { "Address", address },
            { "SceneId", sceneId },
            { "Region", region },
        };

        var jwtSecurityToken = new JwtSecurityToken(
            issuer: "NoBug",
            audience: "NoBug",
            claims: jwtPayload.Claims,
            expires: DateTime.UtcNow.AddMilliseconds(3000),
            signingCredentials: self.SigningCredentials);
        return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
    }
}