using System;
using System.Timers;

using Codice.Client.Common.Threading;

namespace Unity.PlasticSCM.Editor.UI
{
    internal class UnityPlasticTimerBuilder : IPlasticTimerBuilder
    {
        IPlasticTimer IPlasticTimerBuilder.Get(bool bModalMode, ThreadWaiter.TimerTick timerTickDelegate)
        {
            return new UnityPlasticTimer(DEFAULT_TIMER_INTERVAL, timerTickDelegate);
        }

        IPlasticTimer IPlasticTimerBuilder.Get(bool bModalMode, int timerInterval, ThreadWaiter.TimerTick timerTickDelegate)
        {
            return new UnityPlasticTimer(timerInterval, timerTickDelegate);
        }

        const int DEFAULT_TIMER_INTERVAL = 100;
    }

    internal class UnityPlasticTimer : IPlasticTimer
    {
        internal UnityPlasticTimer(int timerInterval, ThreadWaiter.TimerTick timerTickDelegate)
        {
            mTimerInterval = timerInterval;
            mTimerTickDelegate = timerTickDelegate;
        }

        void IPlasticTimer.Start()
        {
            mTimer = new Timer();
            mTimer.Interval = mTimerInterval;
            mTimer.Elapsed += OnTimerTick;

            mTimer.Start();
        }

        void IPlasticTimer.Stop()
        {
            mTimer.Stop();
            mTimer.Elapsed -= OnTimerTick;
            mTimer.Dispose();
        }

        void OnTimerTick(object sender, EventArgs e)
        {
            mTimerTickDelegate();
        }

        Timer mTimer;
        int mTimerInterval;
        ThreadWaiter.TimerTick mTimerTickDelegate;
    }
}