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

std::unique_ptr<StateInstance> LayerState::makeInstance(
    ArtboardInstance* instance) const
{
  return std::make_unique<SystemStateInstance>(this, instance);
}