#include "rive/animation/state_machine_layer.hpp"
#include "rive/importers/import_stack.hpp"
#include "rive/importers/state_machine_importer.hpp"
#include "rive/generated/animation/state_machine_base.hpp"
#include "rive/animation/any_state.hpp"
#include "rive/animation/entry_state.hpp"
#include "rive/animation/exit_state.hpp"

using namespace rive;

StateMachineLayer::~StateMachineLayer() {
    for (auto state : m_States) {
        delete state;
    }
}

StatusCode StateMachineLayer::onAddedDirty(CoreContext* context) {
    StatusCode code;
    for (auto state : m_States) {
        if ((code = state->onAddedDirty(context)) != StatusCode::Ok) {
            return code;
        }
        switch (state->coreType()) {
            case AnyState::typeKey:
                m_Any = state->as<AnyState>();
                break;
            case EntryState::typeKey:
                m_Entry = state->as<EntryState>();
                break;
            case ExitState::typeKey:
                m_Exit = state->as<ExitState>();
                break;
        }
    }
    if (m_Any == nullptr || m_Entry == nullptr || m_Exit == nullptr) {
        // The layer is corrupt, we must have all three of these states.
        return StatusCode::InvalidObject;
    }

    return StatusCode::Ok;
}

StatusCode StateMachineLayer::onAddedClean(CoreContext* context) {
    StatusCode code;
    for (auto state : m_States) {
        if ((code = state->onAddedClean(context)) != StatusCode::Ok) {
            return code;
        }
    }

    return StatusCode::Ok;
}

void StateMachineLayer::addState(LayerState* state) { m_States.push_back(state); }

StatusCode StateMachineLayer::import(ImportStack& importStack) {
    auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase::typeKey);
    if (stateMachineImporter == nullptr) {
        return StatusCode::MissingObject;
    }
    stateMachineImporter->addLayer(this);
    return Super::import(importStack);
}
