#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
