#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() != -1) {
                animationState->m_Animation =
                    m_Artboard->animation(animationState->animationId());
                if (animationState->m_Animation == nullptr) {
                    return StatusCode::MissingObject;
                }
            }
        }
        for (auto transition : state->m_Transitions) {
            // TODO: do we mean >= ???
            if ((size_t)transition->stateToId() > m_Layer->m_States.size()) {
                return StatusCode::InvalidObject;
            }
            transition->m_StateTo = m_Layer->m_States[transition->stateToId()];
        }
    }
    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;
}
