#include "rive/layout/layout_sizing_style.hpp"
#include "rive/layout/grid_track.hpp"
#include "rive/layout/layout_enums.hpp"
#ifdef WITH_RIVE_LAYOUT
// YGStyle is only forward declared in the headers; the setters below need it.
#include "rive/layout/layout_data.hpp"
#endif

using namespace rive;

#ifdef WITH_RIVE_LAYOUT
YGDisplay LayoutSizingStyle::display()
{
  return YGDisplay(displayValue()) == YGDisplayNone ? YGDisplayNone
                                                    : YGDisplayFlex;
}

YGUnit LayoutSizingStyle::maxWidthUnits()
{
  return YGUnit(maxWidthUnitsValue());
}

YGUnit LayoutSizingStyle::maxHeightUnits()
{
  return YGUnit(maxHeightUnitsValue());
}

YGUnit LayoutSizingStyle::minWidthUnits()
{
  return YGUnit(minWidthUnitsValue());
}

YGUnit LayoutSizingStyle::minHeightUnits()
{
  return YGUnit(minHeightUnitsValue());
}

void LayoutSizingStyle::applyBaseStyle(
    YGStyle& style,
    const LayoutSyncContext& context)
{
  style.display() = display();

  style.minDimensions()[YGDimensionWidth] = YGValue{
      minWidth(),
      minWidthUnits()};
  style.minDimensions()[YGDimensionHeight] = YGValue{
      minHeight(),
      minHeightUnits()};
  style.maxDimensions()[YGDimensionWidth] = YGValue{
      maxWidth(),
      maxWidthUnits()};
  style.maxDimensions()[YGDimensionHeight] = YGValue{
      maxHeight(),
      maxHeightUnits()};
}

// How this item sits in a grid or stack cell.
void LayoutSizingStyle::applyItemStyle(
    YGStyle& style,
    const LayoutSyncContext& context)
{
  if (context.parentIsStack)
  {
    GridTrack::syncStackItemCell(style);
  }
  GridTrack::syncItemJustifySelf(
      style,
      justifySelfValue(),
      context.parentIsStack,
      context.inlineHugs,
      context.containerJustifyItems);
  // Fill stretches the inline axis over the container's default justify.
  if (context.parentIsGrid && context.widthFills)
  {
    style.setJustifySelf(YGJustifyStretch);
  }
}
#endif
