#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);
}