#include "rive/importers/state_machine_layer_importer.hpp"
#include "rive/importers/artboard_importer.hpp"
#include "rive/animation/state_machine_layer.hpp"
#include "rive/animation/animation_state.hpp"
#include "rive/animation/state_transition.hpp"
#include "rive/artboard.hpp"

using namespace rive;
StateMachineLayerImporter::StateMachineLayerImporter(StateMachineLayer* layer,
                                                     const Artboard* artboard) :
    m_Layer(layer), m_Artboard(artboard) {}
void StateMachineLayerImporter::addState(LayerState* state) { m_Layer->addState(state); }

StatusCode StateMachineLayerImporter::resolve() {

    for (auto state : m_Layer->m_States) {
        if (state->is<AnimationState>()) {
            auto animationState = state->as<AnimationState>();

            if (animationState->animationId() < m_Artboard->animationCount()) {
                animationState->m_Animation = m_Artboard->animation(animationState->animationId());
                if (animationState->m_Animation == nullptr) {
                    return StatusCode::MissingObject;
                }
            }
        }
        for (auto transition : state->m_Transitions) {
            if ((size_t)transition->stateToId() < m_Layer->m_States.size()) {
                transition->m_StateTo = m_Layer->m_States[transition->stateToId()];

            } else {
                return StatusCode::InvalidObject;
            }
        }
    }
    return StatusCode::Ok;
}

bool StateMachineLayerImporter::readNullObject() {
    // Add an 'empty' generic state that can be transitioned to/from but doesn't
    // effectively do anything. This allows us to deal with unexpected new state
    // types the runtime won't be able to understand. It'll still be able to
    // make use of the state but it won't do anything visually.
    addState(new LayerState());
    return true;
}
