#ifndef _RIVE_DRAWABLE_BASE_HPP_
#define _RIVE_DRAWABLE_BASE_HPP_
#include "rive/core/field_types/core_uint_type.hpp"
#include "rive/node.hpp"
namespace rive {
    class DrawableBase : public Node {
    protected:
        typedef Node Super;

    public:
        static const uint16_t typeKey = 13;

        /// Helper to quickly determine if a core object extends another without RTTI
        /// at runtime.
        bool isTypeOf(uint16_t typeKey) const override {
            switch (typeKey) {
                case DrawableBase::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 blendModeValuePropertyKey = 23;
        static const uint16_t drawableFlagsPropertyKey = 129;

    private:
        uint32_t m_BlendModeValue = 3;
        uint32_t m_DrawableFlags = 0;

    public:
        inline uint32_t blendModeValue() const { return m_BlendModeValue; }
        void blendModeValue(uint32_t value) {
            if (m_BlendModeValue == value) {
                return;
            }
            m_BlendModeValue = value;
            blendModeValueChanged();
        }

        inline uint32_t drawableFlags() const { return m_DrawableFlags; }
        void drawableFlags(uint32_t value) {
            if (m_DrawableFlags == value) {
                return;
            }
            m_DrawableFlags = value;
            drawableFlagsChanged();
        }

        void copy(const DrawableBase& object) {
            m_BlendModeValue = object.m_BlendModeValue;
            m_DrawableFlags = object.m_DrawableFlags;
            Node::copy(object);
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case blendModeValuePropertyKey:
                    m_BlendModeValue = CoreUintType::deserialize(reader);
                    return true;
                case drawableFlagsPropertyKey:
                    m_DrawableFlags = CoreUintType::deserialize(reader);
                    return true;
            }
            return Node::deserialize(propertyKey, reader);
        }

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

#endif