#include "rive/animation/layer_state.hpp"
#include "rive/animation/transition_bool_condition.hpp"
#include "rive/importers/import_stack.hpp"
#include "rive/importers/state_machine_layer_importer.hpp"
#include "rive/generated/animation/state_machine_layer_base.hpp"
#include "rive/animation/state_transition.hpp"
#include "rive/animation/system_state_instance.hpp"

using namespace rive;

LayerState::~LayerState()
{
    for (auto transition : m_Transitions)
    {
        delete transition;
    }
}

StatusCode LayerState::onAddedDirty(CoreContext* context)
{
    StatusCode code;
    for (auto transition : m_Transitions)
    {
        if ((code = transition->onAddedDirty(context)) != StatusCode::Ok)
        {
            return code;
        }
    }
    return StatusCode::Ok;
}

StatusCode LayerState::onAddedClean(CoreContext* context)
{
    StatusCode code;
    for (auto transition : m_Transitions)
    {
        if ((code = transition->onAddedClean(context)) != StatusCode::Ok)
        {
            return code;
        }
    }
    return StatusCode::Ok;
}

StatusCode LayerState::import(ImportStack& importStack)
{
    auto layerImporter = importStack.latest<StateMachineLayerImporter>(
        StateMachineLayerBase::typeKey);
    if (layerImporter == nullptr)
    {
        return StatusCode::MissingObject;
    }
    layerImporter->addState(this);
    return Super::import(importStack);
}

void LayerState::addTransition(StateTransition* transition)
{
    m_Transitions.push_back(transition);
}

StateInstance* LayerState::makeInstance() const
{
    return new SystemStateInstance(this);
}