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

	public:
		static const uint16_t typeKey = 79;

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

		uint16_t coreType() const override { return typeKey; }

		static const uint16_t strengthPropertyKey = 172;

	private:
		float m_Strength = 1.0f;
	public:
		inline float strength() const { return m_Strength; }
		void strength(float value)
		{
			if (m_Strength == value)
			{
				return;
			}
			m_Strength = value;
			strengthChanged();
		}

		void copy(const ConstraintBase& object)
		{
			m_Strength = object.m_Strength;
			Component::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case strengthPropertyKey:
					m_Strength = CoreDoubleType::deserialize(reader);
					return true;
			}
			return Component::deserialize(propertyKey, reader);
		}

	protected:
		virtual void strengthChanged() {}
	};
} // namespace rive

#endif