#include "rive/animation/transition_trigger_condition.hpp"
#include "rive/animation/state_machine_input_instance.hpp"
#include "rive/animation/state_machine_trigger.hpp"
#include "rive/animation/transition_condition_op.hpp"

using namespace rive;

bool TransitionTriggerCondition::validateInputType(
    const StateMachineInput* input) const
{
  // A null input is valid as the StateMachine can attempt to limp along if we
  // introduce new input types that old conditions are expected to handle in
  // newer runtimes. The older runtimes will just evaluate them to true.
  return input == nullptr || input->is<StateMachineTrigger>();
}

bool TransitionTriggerCondition::evaluate(
    const StateMachineInstance* stateMachineInstance,
    StateMachineLayerInstance* layerInstance) const
{

  auto inputInstance = stateMachineInstance->input(inputId());
  if (inputInstance == nullptr)
  {
    return true;
  }
  auto triggerInput = static_cast<const SMITrigger*>(inputInstance);

  if (triggerInput->m_fired && !triggerInput->isUsedInLayer(layerInstance))
  {
    return true;
  }
  return false;
}

void TransitionTriggerCondition::useInLayer(
    const StateMachineInstance* stateMachineInstance,
    StateMachineLayerInstance* layerInstance) const
{

  auto inputInstance = stateMachineInstance->input(inputId());
  if (inputInstance == nullptr)
  {
    return;
  }
  auto triggerInput = static_cast<const SMITrigger*>(inputInstance);
  triggerInput->useInLayer(layerInstance);
}
