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