#ifndef _RIVE_DRAWABLE_ASSET_BASE_HPP_
#define _RIVE_DRAWABLE_ASSET_BASE_HPP_
#include "rive/assets/file_asset.hpp"
#include "rive/core/field_types/core_double_type.hpp"
namespace rive
{
	class DrawableAssetBase : public FileAsset
	{
	protected:
		typedef FileAsset Super;

	public:
		static const uint16_t typeKey = 104;

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

		uint16_t coreType() const override { return typeKey; }

		static const uint16_t heightPropertyKey = 207;
		static const uint16_t widthPropertyKey = 208;

	private:
		float m_Height = 0.0f;
		float m_Width = 0.0f;
	public:
		inline float height() const { return m_Height; }
		void height(float value)
		{
			if (m_Height == value)
			{
				return;
			}
			m_Height = value;
			heightChanged();
		}

		inline float width() const { return m_Width; }
		void width(float value)
		{
			if (m_Width == value)
			{
				return;
			}
			m_Width = value;
			widthChanged();
		}

		void copy(const DrawableAssetBase& object)
		{
			m_Height = object.m_Height;
			m_Width = object.m_Width;
			FileAsset::copy(object);
		}

		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
		{
			switch (propertyKey)
			{
				case heightPropertyKey:
					m_Height = CoreDoubleType::deserialize(reader);
					return true;
				case widthPropertyKey:
					m_Width = CoreDoubleType::deserialize(reader);
					return true;
			}
			return FileAsset::deserialize(propertyKey, reader);
		}

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

#endif