#ifndef _RIVE_KEYED_PROPERTY_BASE_HPP_
#define _RIVE_KEYED_PROPERTY_BASE_HPP_
#include "rive/core.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
namespace rive {
    class KeyedPropertyBase : public Core {
    protected:
        typedef Core Super;

    public:
        static const uint16_t typeKey = 26;

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

        uint16_t coreType() const override { return typeKey; }

        static const uint16_t propertyKeyPropertyKey = 53;

    private:
        uint32_t m_PropertyKey = Core::invalidPropertyKey;

    public:
        inline uint32_t propertyKey() const { return m_PropertyKey; }
        void propertyKey(uint32_t value) {
            if (m_PropertyKey == value) {
                return;
            }
            m_PropertyKey = value;
            propertyKeyChanged();
        }

        Core* clone() const override;
        void copy(const KeyedPropertyBase& object) { m_PropertyKey = object.m_PropertyKey; }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case propertyKeyPropertyKey:
                    m_PropertyKey = CoreUintType::deserialize(reader);
                    return true;
            }
            return false;
        }

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

#endif