#ifndef _RIVE_STAR_BASE_HPP_
#define _RIVE_STAR_BASE_HPP_
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/shapes/polygon.hpp"
namespace rive
{
	class StarBase : public Polygon
	{
	protected:
		typedef Polygon Super;

	public:
		static const uint16_t typeKey = 52;

		/// Helper to quickly determine if a core object extends another without
		/// RTTI at runtime.
		bool isTypeOf(uint16_t typeKey) const override
		{
			switch (typeKey)
			{
				case StarBase::typeKey:
				case PolygonBase::typeKey:
				case ParametricPathBase::typeKey:
				case PathBase::typeKey:
				case NodeBase::typeKey:
				case TransformComponentBase::typeKey:
				case WorldTransformComponentBase::typeKey:
				case ContainerComponentBase::typeKey:
				case ComponentBase::typeKey:
					return true;
				default:
					return false;
			}
		}

		uint16_t coreType() const override { return typeKey; }

		static const uint16_t innerRadiusPropertyKey = 127;

	private:
		float m_InnerRadius = 0.5f;
	public:
		inline float innerRadius() const { return m_InnerRadius; }
		void innerRadius(float value)
		{
			if (m_InnerRadius == value)
			{
				return;
			}
			m_InnerRadius = value;
			innerRadiusChanged();
		}

		Core* clone() const override;
		void copy(const StarBase& object)
		{
			m_InnerRadius = object.m_InnerRadius;
			Polygon::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case innerRadiusPropertyKey:
					m_InnerRadius = CoreDoubleType::deserialize(reader);
					return true;
			}
			return Polygon::deserialize(propertyKey, reader);
		}

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

#endif