#ifndef _RIVE_COMPONENT_BASE_HPP_
#define _RIVE_COMPONENT_BASE_HPP_
#include <string>
#include "rive/core.hpp"
#include "rive/core/field_types/core_string_type.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
namespace rive {
    class ComponentBase : public Core {
    protected:
        typedef Core Super;

    public:
        static const uint16_t typeKey = 10;

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

        uint16_t coreType() const override { return typeKey; }

        static const uint16_t namePropertyKey = 4;
        static const uint16_t parentIdPropertyKey = 5;

    private:
        std::string m_Name = "";
        uint32_t m_ParentId = 0;

    public:
        inline const std::string& name() const { return m_Name; }
        void name(std::string value) {
            if (m_Name == value) {
                return;
            }
            m_Name = value;
            nameChanged();
        }

        inline uint32_t parentId() const { return m_ParentId; }
        void parentId(uint32_t value) {
            if (m_ParentId == value) {
                return;
            }
            m_ParentId = value;
            parentIdChanged();
        }

        void copy(const ComponentBase& object) {
            m_Name = object.m_Name;
            m_ParentId = object.m_ParentId;
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case namePropertyKey:
                    m_Name = CoreStringType::deserialize(reader);
                    return true;
                case parentIdPropertyKey:
                    m_ParentId = CoreUintType::deserialize(reader);
                    return true;
            }
            return false;
        }

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

#endif