#ifndef _RIVE_DEPENDENCY_HELPER_HPP_
#define _RIVE_DEPENDENCY_HELPER_HPP_

#include "rive/component_dirt.hpp"

namespace rive
{
class Component;
// class DependencyRoot
// {
// public:
//     virtual void onComponentDirty(Component* component) {};
// };

template <typename T, typename U> class DependencyHelper
{
    std::vector<U*> m_Dependents;
    T* m_dependecyRoot;

public:
    void dependecyRoot(T* value) { m_dependecyRoot = value; }
    DependencyHelper(T* value) : m_dependecyRoot(value) {}
    DependencyHelper() {}
    void addDependent(U* component)
    {
        // Make it's not already a dependent.
        if (std::find(m_Dependents.begin(), m_Dependents.end(), component) !=
            m_Dependents.end())
        {
            return;
        }
        m_Dependents.push_back(component);
    }
    void removeDependent(U* component)
    {
        m_Dependents.erase(
            std::remove(m_Dependents.begin(), m_Dependents.end(), component),
            m_Dependents.end());
    }
    void addDirt(ComponentDirt value)
    {
        for (auto d : m_Dependents)
        {
            d->addDirt(value, true);
        }
    }

    void onComponentDirty(U* component)
    {
        m_dependecyRoot->onComponentDirty(component);
    }

    const std::vector<U*>& dependents() const { return m_Dependents; }
};
} // namespace rive
#endif
