#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
