using System;
using System.Collections.Generic;

namespace BestHTTP.Extensions
{
    public
#if CSHARP_7_OR_LATER
        readonly
#endif
            struct TimerData
    {
        public readonly DateTime Created;
        public readonly TimeSpan Interval;
        public readonly object Context;

        public readonly Func<object, bool> OnTimer;

        public bool IsOnTime { get { return DateTime.Now >= this.Created + this.Interval; } }

        public TimerData(TimeSpan interval, object context, Func<object, bool> onTimer)
        {
            this.Created = DateTime.Now;
            this.Interval = interval;
            this.Context = context;
            this.OnTimer = onTimer;
        }

        /// <summary>
        /// Create a new TimerData but the Created field will be set to the current time.
        /// </summary>
        public TimerData CreateNew()
        {
            return new TimerData(this.Interval, this.Context, this.OnTimer);
        }

        public override string ToString()
        {
            return string.Format("[TimerData Created: {0}, Interval: {1}, IsOnTime: {2}]", this.Created, this.Interval, this.IsOnTime);
        }
    }

    public static class Timer
    {
        private static List<TimerData> Timers = new List<TimerData>();

        public static void Add(TimerData timer)
        {
            Timers.Add(timer);
        }

        internal static void Process()
        {
            for (int i = 0; i < Timers.Count; ++i)
            {
                TimerData timer = Timers[i];

                if (timer.IsOnTime)
                {
                    bool repeat = timer.OnTimer(timer.Context);

                    if (repeat)
                        Timers[i] = timer.CreateNew();
                    else
                        Timers.RemoveAt(i--);
                }
            }
        }
    }
}
