#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;

protected:
    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