Engine.SimpleTimer = class
{
    constructor(time, callback, loop /* = false*/, useRealTime /* = false*/)
    {
		if (loop === undefined) loop = false;
		if (useRealTime === undefined) useRealTime = false;
		
		this.useRealTime = useRealTime;
		
        this.hasTime = false;
        this.t = 0;
        this.tSeconds = 0;
        this.active = false;
        this.onUpdate = null;
        this.onFinish = null;
        this.onSecondsChanged = null;
        this.timeScale = 1;
        this.ignoreFirstUpdate = true;
        this.duration = 0;
        this.loop = loop ? loop : false;
		
        this.pauseCount = 0;

		if (time !== undefined && callback !== undefined)
		{			
			this.start(time, callback, loop, this.useRealTime);
		}
    }

    get timeLeft() { return this.t; }
    get paused() { return this.pauseCount > 0;}

    start(time, callback, loop /* = false*/, useRealTime /* = false*/)
    {
        if (loop === undefined) loop = false;
		if (useRealTime === undefined) useRealTime = false;
		
		this.useRealTime = useRealTime;

        this.hasTime = true;
        this.loop = loop;
        this.onFinish = callback;
        this.duration = time;
        this.t = time;
        this.setTSeconds();

        Engine.EnterFrameManagerInstance.add(this, this.update, this.useRealTime);
        this.active = true;
        this.ignoreFirstUpdate = true;
    }

    setTSeconds()
    {
        var oldTSeconds = this.tSeconds;
        this.tSeconds = Math.max(0, Math.ceil(this.t));
        if (oldTSeconds != this.tSeconds && this.onSecondsChanged != null)
        {
            this.onSecondsChanged(this.tSeconds);
        }
    }

    stop()
    {
        if (!this.active) return;
        Engine.EnterFrameManagerInstance.remove(this);
        this.active = false;
        this.onFinish = null;
        this.onUpdate = null;
    }

    pause()
    {
        if (!this.active) return;
        this.pauseCount++;
        if (this.pauseCount == 1)
        {
            Engine.EnterFrameManagerInstance.remove(this);
        }
    }

    resume()
    {
        if (this.pauseCount == 0 || !this.hasTime) return;
        this.pauseCount--;
        if (this.pauseCount == 0)
        {
            Engine.EnterFrameManagerInstance.add(this, this.update, this.useRealTime);
        }
    }

    setTime(t)
    {
        this.t = t;
        this.setTSeconds();
    }

    addTime(a)
    {
        this.t += a;
        this.setTSeconds();
    }

    update(timeElapsed)
    {
        if (this.ignoreFirstUpdate)
        {
            this.ignoreFirstUpdate = false;
            return;
        }

        if (!this.active) return;
        if (this.paused) return;

        this.t -= (timeElapsed * this.timeScale);
        this.setTSeconds();

        if(this.onUpdate != null) this.onUpdate(this.duration - this.t);

        if (this.t <= 0)
        {
            var actualTime = this.duration - this.t;
            if (this.loop)
            {
                this.t += this.duration;
                this.setTSeconds();
            }
            else
            {
                this.t = 0;
                this.setTSeconds();

                this.active = false;
                Engine.EnterFrameManagerInstance.remove(this);
            }

            if (this.onFinish) this.onFinish();
        }
    }

}