#ifndef _RIVE_NODE_BASE_HPP_
#define _RIVE_NODE_BASE_HPP_
#include "rive/core/field_types/core_double_type.hpp"
#include "rive/transform_component.hpp"
namespace rive
{
    class NodeBase : public TransformComponent
    {
    protected:
        typedef TransformComponent Super;

    public:
        static const uint16_t typeKey = 2;

        /// Helper to quickly determine if a core object extends another without
        /// RTTI at runtime.
        bool isTypeOf(uint16_t typeKey) const override
        {
            switch (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 xPropertyKey = 13;
        static const uint16_t yPropertyKey = 14;

    private:
        float m_X = 0.0f;
        float m_Y = 0.0f;

    public:
        inline float x() const override { return m_X; }
        void x(float value)
        {
            if (m_X == value)
            {
                return;
            }
            m_X = value;
            xChanged();
        }

        inline float y() const override { return m_Y; }
        void y(float value)
        {
            if (m_Y == value)
            {
                return;
            }
            m_Y = value;
            yChanged();
        }

        Core* clone() const override;
        void copy(const NodeBase& object)
        {
            m_X = object.m_X;
            m_Y = object.m_Y;
            TransformComponent::copy(object);
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
        {
            switch (propertyKey)
            {
                case xPropertyKey:
                    m_X = CoreDoubleType::deserialize(reader);
                    return true;
                case yPropertyKey:
                    m_Y = CoreDoubleType::deserialize(reader);
                    return true;
            }
            return TransformComponent::deserialize(propertyKey, reader);
        }

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

#endif