namespace KYFramework;

public enum TimerClass
{
    None,
    OnceTimer,
    OnceWaitTimer,
    RepeatedTimer,
}

public class TimerAction
{
    public static TimerAction Create(long id, TimerClass timerClass, long startTime, long time, int type, object obj)
    {
        TimerAction timerAction = Game.ObjectPool.Fetch<TimerAction>();
        timerAction.Id = id;
        timerAction.TimerClass = timerClass;
        timerAction.StartTime = startTime;
        timerAction.Object = obj;
        timerAction.Time = time;
        timerAction.Type = type;
        return timerAction;
    }

    public long Id;
        
    public TimerClass TimerClass;

    public object Object;

    public long StartTime;

    public long Time;

    public int Type;
        
    public void Recycle()
    {
        this.Id = 0;
        this.Object = null;
        this.StartTime = 0;
        this.Time = 0;
        this.TimerClass = TimerClass.None;
        this.Type = 0;
        Game.ObjectPool.Recycle(this);
    }
}

public struct TimerCallback
{
    public object Args;
}

public class TimerComponent : Component
{
    public static TimerComponent Instance;
    /// <summary>
    /// key: time, value: timer id
    /// </summary>
    public readonly MultiMap<long, long> TimeId = new();

    public readonly Queue<long> timeOutTime = new();

    public readonly Queue<long> timeOutTimerIds = new();

    public readonly Dictionary<long, TimerAction> timerActions = new();

    public long idGenerator;

    // 记录最小时间,不用每次都去MultiMap取第一个值
    public long minTime = long.MaxValue;
}