namespace NBC;

public sealed class Payload
{
    public long aId { get; set; }
    public string Address { get; set; }
    public uint SceneId { get; set; }
    public int exp { get; set; }
    public string iss { get; set; }
    public string aud { get; set; }
}

public sealed class JWTParseComponent : NBC.Entitas.Entity
{
}

public static class JWTParseComponentSystem
    {
        //payload:{"aId":433552570364198912,"Address":"127.0.0.1:8080","exp":1729842327,"iss":"Fantasy","aud":"Fantasy"}
        public static bool Parse(this JWTParseComponent self, string toKen, out Payload payloadData)
        {
            payloadData = null;
            
            try
            {
                // JWT通常是由三个部分组成的,Header,Payload,Signature。
                var tokens = toKen.Split('.');

                if (tokens.Length != 3)
                {
                    Log.Error("Invalid JWT token");
                    return false;
                }
                // JWT的Payload不是标准的Base64格式，因为咱们C#的Convert要求是一个标准的Base64格式。
                // JWT的Payload是Base64URL格式,它里面的"-"替代成了"+","_"替代成了"/",需要把这些给还原成Base64格式
                var basePayload = tokens[1].Replace('-', '+').Replace('_', '/');
                // 因为Base64的编码长度需要是4的倍数，如果不是的话咱们需要把这个长度用=来填充，使其长度符合要求
                switch (basePayload.Length % 4)
                {
                    // case 0:
                    // {
                    //     // 如果这个余数是0，那就表示长度已经是4的倍数，那就没必要处理了。
                    //     break;
                    // }
                    // case 1:
                    // {
                    //     // 如果这个余数是1，那就表示这个Base64格式是不正确的，不是咱们发放的token。
                    //     // 这样情况下，也不需要处理了。
                    //     break;
                    // }
                    case 2:
                    {
                        basePayload +="==";
                        break;
                    }
                    case 3:
                    {
                        basePayload +="=";
                        break;
                    }
                }
                // 将修复后的字符串解码为数组
                var basePayloadBytes = Convert.FromBase64String(basePayload);
                var payload = System.Text.Encoding.UTF8.GetString(basePayloadBytes);
                payloadData = JsonHelper.Deserialize<Payload>(payload);
                return true;
            }
            catch (Exception e)
            {
                Log.Error(e);
                return false;
            }
        }
    }