#include "rive/animation/nested_bool.hpp"
#include "rive/animation/nested_state_machine.hpp"
#include "rive/animation/state_machine_input_instance.hpp"
#include "rive/container_component.hpp"

using namespace rive;
class StateMachineInstance;

// Use the NestedBoolBase m_NestedValue on initialization but then it won't
// be used anymore and interface directly with the nested input value.
void NestedBool::applyValue()
{
  auto inputInstance = input();
  if (inputInstance != nullptr)
  {
    auto boolInput = static_cast<SMIBool*>(inputInstance);
    if (boolInput != nullptr)
    {
      boolInput->value(NestedBoolBase::nestedValue());
    }
  }
}

void NestedBool::nestedValue(bool value)
{
  auto inputInstance = input();
  if (inputInstance != nullptr)
  {
    auto boolInput = static_cast<SMIBool*>(inputInstance);
    if (boolInput != nullptr && boolInput->value() != value)
    {
      boolInput->value(value);
    }
  }
}

bool NestedBool::nestedValue() const
{
  auto inputInstance = input();
  if (inputInstance != nullptr)
  {
    auto boolInput = static_cast<SMIBool*>(inputInstance);
    if (boolInput != nullptr)
    {
      return boolInput->value();
    }
  }
  return false;
}