#include "rive/shapes/shape_paint_container.hpp"
#include "rive/artboard.hpp"
#include "rive/factory.hpp"
#include "rive/component.hpp"
#include "rive/layout_component.hpp"
#include "rive/foreground_layout_drawable.hpp"
#include "rive/shapes/paint/shape_paint.hpp"
#include "rive/shapes/shape.hpp"
#include "rive/text/text_style_background.hpp"
#include "rive/text/text_style_paint.hpp"
#include "rive/text/text_input_selected_text.hpp"
#include "rive/text/text_input_cursor.hpp"
#include "rive/text/text_input_selection.hpp"
#include "rive/text/text_input_text.hpp"

using namespace rive;

ShapePaintContainer* ShapePaintContainer::from(Component* component)
{
    switch (component->coreType())
    {
        case Artboard::typeKey:
            return component->as<Artboard>();
        case LayoutComponent::typeKey:
            return component->as<LayoutComponent>();
        case Shape::typeKey:
            return component->as<Shape>();
        case TextStylePaint::typeKey:
            return component->as<TextStylePaint>();
        case TextStyleBackground::typeKey:
            return component->as<TextStyleBackground>();
        case ForegroundLayoutDrawable::typeKey:
            return component->as<ForegroundLayoutDrawable>();
        case TextInputCursor::typeKey:
            return component->as<TextInputCursor>();
        case TextInputSelection::typeKey:
            return component->as<TextInputSelection>();
        case TextInputText::typeKey:
            return component->as<TextInputText>();
        case TextInputSelectedText::typeKey:
            return component->as<TextInputSelectedText>();
    }
    return nullptr;
}

void ShapePaintContainer::addPaint(ShapePaint* paint)
{
    m_ShapePaints.push_back(paint);
}

PathFlags ShapePaintContainer::pathFlags() const
{
    PathFlags space = m_pathFlags;
    for (auto paint : m_ShapePaints)
    {
        space |= paint->pathFlags();
    }
    return space;
}

void ShapePaintContainer::invalidateStrokeEffects()
{
    for (auto paint : m_ShapePaints)
    {
        if (paint->is<ShapePaint>())
        {
            paint->as<ShapePaint>()->invalidateEffects();
        }
    }
}

void ShapePaintContainer::propagateOpacity(float opacity)
{
    for (auto shapePaint : m_ShapePaints)
    {
        shapePaint->renderOpacity(opacity);
    }
}
