#include "rive/artboard_component_list.hpp"
#include "rive/component.hpp"
#include "rive/constraints/layout_constraint.hpp"
#include "rive/layout_component.hpp"
#include "rive/layout/layout_node_provider.hpp"
#include "rive/layout/layout_participant.hpp"
#include "rive/nested_artboard_layout.hpp"
#include "rive/text/text.hpp"
#include "rive/shapes/image.hpp"
#include "rive/shapes/shape.hpp"
#include "rive/solo.hpp"

using namespace rive;

LayoutNodeProvider* LayoutNodeProvider::from(Component* component)
{
  if (component == nullptr)
  {
    return nullptr;
  }
  switch (component->coreType())
  {
    case LayoutComponent::typeKey:
      return component->as<LayoutComponent>();
    case NestedArtboardLayout::typeKey:
      return component->as<NestedArtboardLayout>();
    case ArtboardComponentListBase::typeKey:
      return component->as<ArtboardComponentList>();
    case TextBase::typeKey:
      // A migrated Text is no longer a provider itself; it
      // provides via its optional LayoutParticipant child.
      return component->as<Text>()->layoutParticipant();
    case ImageBase::typeKey:
      // A migrated Image is no longer a provider itself; it
      // provides via its optional LayoutParticipant child.
      return component->as<Image>()->layoutParticipant();
    case ShapeBase::typeKey:
      // A migrated Shape is no longer a provider itself; it
      // provides via its optional LayoutParticipant child.
      return component->as<Shape>()->layoutParticipant();
  }
  return nullptr;
}

void LayoutNodeProvider::addLayoutConstraint(LayoutConstraint* constraint)
{
  if (m_layoutConstraints == nullptr)
  {
    m_layoutConstraints = new std::vector<LayoutConstraint*>();
  }
  assert(
      std::find(
          m_layoutConstraints->begin(),
          m_layoutConstraints->end(),
          constraint) == m_layoutConstraints->end());
  m_layoutConstraints->push_back(constraint);
  constraint->addLayoutChild(this);
}