#include "rive/importers/layer_state_importer.hpp"
#include "rive/animation/state_transition.hpp"
#include "rive/animation/layer_state.hpp"
#include "rive/animation/blend_state.hpp"
#include "rive/animation/blend_state_transition.hpp"

using namespace rive;

LayerStateImporter::LayerStateImporter(LayerState* state) : m_State(state) {}
void LayerStateImporter::addTransition(StateTransition* transition) {
    m_State->addTransition(transition);
}

bool LayerStateImporter::addBlendAnimation(BlendAnimation* animation) {
    if (!m_State->is<BlendState>()) {
        return false;
    }
    auto blendState = m_State->as<BlendState>();

    blendState->addAnimation(animation);
    return true;
}

StatusCode LayerStateImporter::resolve() {
    if (m_State->is<BlendState>()) {
        auto blendState = m_State->as<BlendState>();
        for (auto transition : blendState->m_Transitions) {
            if (!transition->is<BlendStateTransition>()) {
                continue;
            }

            auto blendStateTransition = transition->as<BlendStateTransition>();
            size_t exitId = blendStateTransition->exitBlendAnimationId();
            if (exitId < blendState->m_Animations.size()) {
                blendStateTransition->m_ExitBlendAnimation = blendState->m_Animations[exitId];
            }
        }
    }
    return StatusCode::Ok;
}
