#ifndef _RIVE_TENDON_BASE_HPP_
#define _RIVE_TENDON_BASE_HPP_
#include "rive/component.hpp"
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
namespace rive
{
	class TendonBase : public Component
	{
	protected:
		typedef Component Super;

	public:
		static const uint16_t typeKey = 44;

		/// Helper to quickly determine if a core object extends another without
		/// RTTI at runtime.
		bool isTypeOf(uint16_t typeKey) const override
		{
			switch (typeKey)
			{
				case TendonBase::typeKey:
				case ComponentBase::typeKey:
					return true;
				default:
					return false;
			}
		}

		uint16_t coreType() const override { return typeKey; }

		static const uint16_t boneIdPropertyKey = 95;
		static const uint16_t xxPropertyKey = 96;
		static const uint16_t yxPropertyKey = 97;
		static const uint16_t xyPropertyKey = 98;
		static const uint16_t yyPropertyKey = 99;
		static const uint16_t txPropertyKey = 100;
		static const uint16_t tyPropertyKey = 101;

	private:
		int m_BoneId = -1;
		float m_Xx = 1.0f;
		float m_Yx = 0.0f;
		float m_Xy = 0.0f;
		float m_Yy = 1.0f;
		float m_Tx = 0.0f;
		float m_Ty = 0.0f;
	public:
		inline int boneId() const { return m_BoneId; }
		void boneId(int value)
		{
			if (m_BoneId == value)
			{
				return;
			}
			m_BoneId = value;
			boneIdChanged();
		}

		inline float xx() const { return m_Xx; }
		void xx(float value)
		{
			if (m_Xx == value)
			{
				return;
			}
			m_Xx = value;
			xxChanged();
		}

		inline float yx() const { return m_Yx; }
		void yx(float value)
		{
			if (m_Yx == value)
			{
				return;
			}
			m_Yx = value;
			yxChanged();
		}

		inline float xy() const { return m_Xy; }
		void xy(float value)
		{
			if (m_Xy == value)
			{
				return;
			}
			m_Xy = value;
			xyChanged();
		}

		inline float yy() const { return m_Yy; }
		void yy(float value)
		{
			if (m_Yy == value)
			{
				return;
			}
			m_Yy = value;
			yyChanged();
		}

		inline float tx() const { return m_Tx; }
		void tx(float value)
		{
			if (m_Tx == value)
			{
				return;
			}
			m_Tx = value;
			txChanged();
		}

		inline float ty() const { return m_Ty; }
		void ty(float value)
		{
			if (m_Ty == value)
			{
				return;
			}
			m_Ty = value;
			tyChanged();
		}

		Core* clone() const override;
		void copy(const TendonBase& object)
		{
			m_BoneId = object.m_BoneId;
			m_Xx = object.m_Xx;
			m_Yx = object.m_Yx;
			m_Xy = object.m_Xy;
			m_Yy = object.m_Yy;
			m_Tx = object.m_Tx;
			m_Ty = object.m_Ty;
			Component::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case boneIdPropertyKey:
					m_BoneId = CoreUintType::deserialize(reader);
					return true;
				case xxPropertyKey:
					m_Xx = CoreDoubleType::deserialize(reader);
					return true;
				case yxPropertyKey:
					m_Yx = CoreDoubleType::deserialize(reader);
					return true;
				case xyPropertyKey:
					m_Xy = CoreDoubleType::deserialize(reader);
					return true;
				case yyPropertyKey:
					m_Yy = CoreDoubleType::deserialize(reader);
					return true;
				case txPropertyKey:
					m_Tx = CoreDoubleType::deserialize(reader);
					return true;
				case tyPropertyKey:
					m_Ty = CoreDoubleType::deserialize(reader);
					return true;
			}
			return Component::deserialize(propertyKey, reader);
		}

	protected:
		virtual void boneIdChanged() {}
		virtual void xxChanged() {}
		virtual void yxChanged() {}
		virtual void xyChanged() {}
		virtual void yyChanged() {}
		virtual void txChanged() {}
		virtual void tyChanged() {}
	};
} // namespace rive

#endif