using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace JNGame.Util
{
    
    public delegate void TimerCallback();

    public class TimerInfo
    {
        public TimerCallback Callback { get; set; }  
        public float Interval { get; set; }
        public int Repeat { get; set; }  
        public float RunTime = 0;
        public bool IsRunSuccess { get; private set; } = false;

        public void Update(float dt)
        {
            
            if (IsRunSuccess) return;
            RunTime += dt;

            if (RunTime >= Interval)
            {
                
                RunTime = 0;
                Callback?.Invoke();

                if (Repeat > 0)
                {
                    Repeat -= 1;
                }
                
                if (Repeat == 0) IsRunSuccess = true;
                
            }

        }
        
    }
    
    public class Timers : SingletonScene<Timers>
    {
        
        private List<TimerInfo> timers = new List<TimerInfo>();

        public TimerInfo SetInterval(float interval,TimerCallback callback)
        {
            return SetTimeout(interval,callback,-1);
        }
        public TimerInfo SetTimeout(float interval,TimerCallback callback,int repeat = 1)
        {
            TimerInfo timerInfo = new TimerInfo()
            {
                Callback = callback,
                Interval = interval,
                Repeat = repeat,
            };
            timers.Add(timerInfo);
            return timerInfo;
        }

        public void ClearTimeout(TimerCallback callback)
        {
            var removes = timers.Where(time => callback == time.Callback).ToList();
            removes.ForEach(time=> timers.Remove(time));
        }

        private void Update()
        {
            timers.ForEach(time =>
            {
                time.Update(Time.deltaTime);
            });
            var removes = timers.Where(time => time.IsRunSuccess).ToList();
            removes.ForEach(time=> timers.Remove(time));
        }
    }
}