#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 = "";
        int 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 int parentId() const { return m_ParentId; }
        void parentId(int 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