#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:
        int m_BlendModeValue = 3;
        int m_DrawableFlags = 0;

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

        inline int drawableFlags() const { return m_DrawableFlags; }
        void drawableFlags(int 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