#ifndef _RIVE_COMPONENT_HPP_
#define _RIVE_COMPONENT_HPP_
#include "rive/component_dirt.hpp"
#include "rive/generated/component_base.hpp"

#include <vector>

namespace rive
{
    class ContainerComponent;
    class Artboard;

    class Component : public ComponentBase
    {
        friend class Artboard;

    private:
        ContainerComponent* m_Parent = nullptr;
        std::vector<Component*> m_Dependents;

        unsigned int m_GraphOrder;
        Artboard* m_Artboard = nullptr;

    protected:
        ComponentDirt m_Dirt = ComponentDirt::Filthy;

    public:
        inline Artboard* artboard() const { return m_Artboard; }
        StatusCode onAddedDirty(CoreContext* context) override;
        inline ContainerComponent* parent() const { return m_Parent; }
        const std::vector<Component*>& dependents() const
        {
            return m_Dependents;
        }
        void addDependent(Component* component);

        // TODO: re-evaluate when more of the lib is complete...
        // These could be pure virtual but we define them empty here to avoid
        // having to implement them in a bunch of concrete classes that
        // currently don't use this logic.
        virtual void buildDependencies() {}
        virtual void onDirty(ComponentDirt dirt) {}
        virtual void update(ComponentDirt value) {}

        unsigned int graphOrder() const { return m_GraphOrder; }
        bool addDirt(ComponentDirt value, bool recurse = false);
        inline bool hasDirt(ComponentDirt flag) const
        {
            return (m_Dirt & flag) == flag;
        }
        static inline bool hasDirt(ComponentDirt value, ComponentDirt flag)
        {
            return (value & flag) != ComponentDirt::None;
        }

        StatusCode import(ImportStack& importStack) override;
    };
} // namespace rive

#endif
