#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