using Fantasy;
using Fantasy.Entitas.Interface;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract

namespace NB.Authentication;

public sealed class AccountCacheInfoTimeOutDestroySystem : DestroySystem<AccountCacheInfoTimeOut>
{
    protected override void Destroy(AccountCacheInfoTimeOut self)
    {
        if (self.TimerId != 0)
        {
            self.Scene.TimerComponent.Net.Remove(ref self.TimerId);
        }

        self.Key = null;
    }
}

public static class AccountCacheInfoTimeOutSystem
{
    public static void TimeOut(this AccountCacheInfoTimeOut self, string key, int timeout)
    {
        self.Key = key;
        // 创建一个任务计时器、用在timeout时间后执行，并且要清楚掉当前鉴权服务器缓存
        var scene = self.Scene;
        var runTimeId = self.RuntimeId;

        self.TimerId = scene.TimerComponent.Net.OnceTimer(timeout, () =>
        {
            if (runTimeId != self.RuntimeId)
            {
                return;
            }

            self.TimerId = 0;
            AuthenticationHelper.RemoveLoginAccounts(scene, self.Key,true);
        });
    }
}