#ifndef _RIVE_DISTANCE_CONSTRAINT_BASE_HPP_
#define _RIVE_DISTANCE_CONSTRAINT_BASE_HPP_
#include "rive/constraints/targeted_constraint.hpp"
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
namespace rive
{
	class DistanceConstraintBase : public TargetedConstraint
	{
	protected:
		typedef TargetedConstraint Super;

	public:
		static const uint16_t typeKey = 82;

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

		uint16_t coreType() const override { return typeKey; }

		static const uint16_t distancePropertyKey = 177;
		static const uint16_t modeValuePropertyKey = 178;

	private:
		float m_Distance = 100.0f;
		int m_ModeValue = 0;
	public:
		inline float distance() const { return m_Distance; }
		void distance(float value)
		{
			if (m_Distance == value)
			{
				return;
			}
			m_Distance = value;
			distanceChanged();
		}

		inline int modeValue() const { return m_ModeValue; }
		void modeValue(int value)
		{
			if (m_ModeValue == value)
			{
				return;
			}
			m_ModeValue = value;
			modeValueChanged();
		}

		Core* clone() const override;
		void copy(const DistanceConstraintBase& object)
		{
			m_Distance = object.m_Distance;
			m_ModeValue = object.m_ModeValue;
			TargetedConstraint::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case distancePropertyKey:
					m_Distance = CoreDoubleType::deserialize(reader);
					return true;
				case modeValuePropertyKey:
					m_ModeValue = CoreUintType::deserialize(reader);
					return true;
			}
			return TargetedConstraint::deserialize(propertyKey, reader);
		}

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

#endif