#include "rive/layout/n_slicer.hpp"
#include "rive/layout/n_slicer_tile_mode.hpp"
#include "rive/shapes/image.hpp"
#include "rive/shapes/slice_mesh.hpp"
#include "rive/core_context.hpp"

using namespace rive;

NSlicer::NSlicer() { m_sliceMesh = std::make_unique<SliceMesh>(this); }

Image* NSlicer::image()
{
    if (parent())
    {
        return parent()->as<Image>();
    }
    return nullptr;
}

StatusCode NSlicer::onAddedDirty(CoreContext* context)
{
    StatusCode code = Super::onAddedDirty(context);
    if (code != StatusCode::Ok)
    {
        return code;
    }

    if (!parent()->is<Image>())
    {
        return StatusCode::MissingObject;
    }

#ifndef WITH_RIVE_EDITOR
    // Runtime-only; editor build registers via editorParentChanged.
    parent()->as<Image>()->setMesh(m_sliceMesh.get());
#endif
    return StatusCode::Ok;
}

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

void NSlicer::axisChanged() { addDirt(ComponentDirt::NSlicer); }

void NSlicer::update(ComponentDirt value)
{
    if (hasDirt(value, ComponentDirt::NSlicer) ||
        hasDirt(value, ComponentDirt::WorldTransform))
    {
        if (m_sliceMesh != nullptr)
        {
            m_sliceMesh->update();
        }
    }
    Super::update(value);
}
