#include "rive/shapes/paint/group_effect.hpp"
#include "rive/shapes/paint/target_effect.hpp"

using namespace rive;

void GroupEffect::updateEffect(PathProvider* pathProvider,
                               const ShapePaintPath* source,
                               const ShapePaint* shapePaint)
{
    auto path = source;
    for (auto& effect : *effects())
    {
        effect->updateEffect(pathProvider, path, shapePaint);
        auto newPath = effect->effectPath(pathProvider);
        if (newPath)
        {
            path = newPath;
        }
    }
}

void GroupEffect::invalidateEffects(StrokeEffect* invalidatingEffect)
{
    for (auto& targetEffect : m_targetEffects)
    {
        targetEffect->invalidateEffectFromLocal();
    }
    EffectsContainer::invalidateEffects(invalidatingEffect);
}

void GroupEffect::invalidateEffects() { invalidateEffects(nullptr); }

void GroupEffect::addTargetEffect(TargetEffect* targetEffect)
{
    m_targetEffects.push_back(targetEffect);
}

EffectsContainer* GroupEffect::parentPaint() { return nullptr; }

void GroupEffect::addPathProvider(PathProvider* component)
{
    StrokeEffect::addPathProvider(component);
    for (auto& effect : *effects())
    {
        effect->addPathProvider(component);
    }
}

void GroupEffect::addStrokeEffect(StrokeEffect* effect)
{
    EffectsContainer::addStrokeEffect(effect);
    for (auto& effectPath : m_effectPaths)
    {
        effect->addPathProvider(effectPath.first);
    }
}
void GroupEffect::invalidateEffect(PathProvider* component)
{
    StrokeEffect::invalidateEffect(component);
    for (auto& effect : *effects())
    {
        effect->invalidateEffect(component);
    }
}

void GroupEffect::buildDependencies()
{
    Super::buildDependencies();
    if (parent())
    {
        parent()->addDependent(this);
    }
}