#ifndef _RIVE_LINEAR_ANIMATION_INSTANCE_HPP_
#define _RIVE_LINEAR_ANIMATION_INSTANCE_HPP_
#include "rive/artboard.hpp"

namespace rive
{
	class LinearAnimation;

	class LinearAnimationInstance
	{
	private:
		const LinearAnimation* m_Animation = nullptr;
		float m_Time;
		float m_TotalTime;
		float m_LastTotalTime;
		float m_SpilledTime;
		int m_Direction;
		bool m_DidLoop;
		int m_LoopValue = -1;

	public:
		LinearAnimationInstance(const LinearAnimation* animation);

		// Advance the animation by the specified time. Returns true if the
		// animation will continue to animate after this advance.
		bool advance(float seconds);

		// Returns a pointer to the instance's animation
		const LinearAnimation* animation() const { return m_Animation; }

		// Returns the current point in time at which this instance has advance
		// to
		float time() const { return m_Time; }

		// Returns the direction that we are currently playing in
		float direction() const { return m_Direction; }

		// Update the direction of the animation instance, positive value for
		// forwards Negative for backwards
		void direction(int direction)
		{
			if (direction > 0)
			{
				m_Direction = 1;
			}
			else
			{
				m_Direction = -1;
			}
		}

		// Sets the animation's point in time.
		void time(float value);

		// Applies the animation instance to an artboard. The mix (a value
		// between 0 and 1) is the strength at which the animation is mixed with
		// other animations applied to the artboard.
		void apply(Artboard* artboard, float mix = 1.0f) const
		{
			m_Animation->apply(artboard, m_Time, mix);
		}

		// Set when the animation is advanced, true if the animation has stopped
		// (oneShot), reached the end (loop), or changed direction (pingPong)
		bool didLoop() const { return m_DidLoop; }

		float totalTime() const { return m_TotalTime; }
		float lastTotalTime() const { return m_LastTotalTime; }
		float spilledTime() const { return m_SpilledTime; }

		// Returns either the animation's default or overridden loop values
		Loop loop() { return (Loop)loopValue(); }
		int loopValue();
		// Override the animation's default loop
		void loopValue(int value);
	};
} // namespace rive
#endif