#ifndef _RIVE_DRAWABLE_BASE_HPP_
#define _RIVE_DRAWABLE_BASE_HPP_
#include "rive/core/field_types/core_uint_type.hpp"
#include "rive/node.hpp"
namespace rive
{
	class DrawableBase : public Node
	{
	protected:
		typedef Node Super;

	public:
		static const uint16_t typeKey = 13;

		/// Helper to quickly determine if a core object extends another without
		/// RTTI at runtime.
		bool isTypeOf(uint16_t typeKey) const override
		{
			switch (typeKey)
			{
				case DrawableBase::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 blendModeValuePropertyKey = 23;
		static const uint16_t drawableFlagsPropertyKey = 129;

	private:
		int m_BlendModeValue = 3;
		int m_DrawableFlags = 0;
	public:
		inline int blendModeValue() const { return m_BlendModeValue; }
		void blendModeValue(int value)
		{
			if (m_BlendModeValue == value)
			{
				return;
			}
			m_BlendModeValue = value;
			blendModeValueChanged();
		}

		inline int drawableFlags() const { return m_DrawableFlags; }
		void drawableFlags(int value)
		{
			if (m_DrawableFlags == value)
			{
				return;
			}
			m_DrawableFlags = value;
			drawableFlagsChanged();
		}

		void copy(const DrawableBase& object)
		{
			m_BlendModeValue = object.m_BlendModeValue;
			m_DrawableFlags = object.m_DrawableFlags;
			Node::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case blendModeValuePropertyKey:
					m_BlendModeValue = CoreUintType::deserialize(reader);
					return true;
				case drawableFlagsPropertyKey:
					m_DrawableFlags = CoreUintType::deserialize(reader);
					return true;
			}
			return Node::deserialize(propertyKey, reader);
		}

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

#endif