#ifndef _RIVE_NESTED_ANIMATION_BASE_HPP_
#define _RIVE_NESTED_ANIMATION_BASE_HPP_
#include "rive/container_component.hpp"
#include "rive/core/field_types/core_uint_type.hpp"
namespace rive {
    class NestedAnimationBase : public ContainerComponent {
    protected:
        typedef ContainerComponent Super;

    public:
        static const uint16_t typeKey = 93;

        /// Helper to quickly determine if a core object extends another without RTTI
        /// at runtime.
        bool isTypeOf(uint16_t typeKey) const override {
            switch (typeKey) {
                case NestedAnimationBase::typeKey:
                case ContainerComponentBase::typeKey:
                case ComponentBase::typeKey:
                    return true;
                default:
                    return false;
            }
        }

        uint16_t coreType() const override { return typeKey; }

        static const uint16_t animationIdPropertyKey = 198;

    private:
        uint32_t m_AnimationId = -1;

    public:
        inline uint32_t animationId() const { return m_AnimationId; }
        void animationId(uint32_t value) {
            if (m_AnimationId == value) {
                return;
            }
            m_AnimationId = value;
            animationIdChanged();
        }

        void copy(const NestedAnimationBase& object) {
            m_AnimationId = object.m_AnimationId;
            ContainerComponent::copy(object);
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case animationIdPropertyKey:
                    m_AnimationId = CoreUintType::deserialize(reader);
                    return true;
            }
            return ContainerComponent::deserialize(propertyKey, reader);
        }

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

#endif