#include "rive/shapes/polygon.hpp"
#include "rive/shapes/star.hpp"
#include "rive/shapes/straight_vertex.hpp"
#include "rive/math/math_types.hpp"
#include <cmath>

using namespace rive;

Polygon::Polygon() {}

Polygon::~Polygon() {}

void Polygon::cornerRadiusChanged() { markPathDirty(); }

void Polygon::pointsChanged() { markPathDirty(); }

std::size_t Polygon::vertexCount() { return points(); }

void Polygon::buildPolygon()
{
  auto halfWidth = width() / 2;
  auto halfHeight = height() / 2;

  auto ox = -originX() * width() + halfWidth;
  auto oy = -originY() * height() + halfHeight;

  auto angle = -math::PI / 2;
  auto inc = 2 * math::PI / points();

  for (StraightVertex& vertex : m_PolygonVertices)
  {
    vertex.x(ox + cos(angle) * halfWidth);
    vertex.y(oy + sin(angle) * halfHeight);
    vertex.radius(cornerRadius());
    angle += inc;
  }
}

void Polygon::update(ComponentDirt value)
{
  if (hasDirt(value, ComponentDirt::Path))
  {
    if (m_PolygonVertices.size() != vertexCount())
    {
      m_PolygonVertices.resize(vertexCount());
      m_Vertices.clear();
      for (StraightVertex& vertex : m_PolygonVertices)
      {
        m_Vertices.push_back(&vertex);
      }
    }
    buildPolygon();
  }
  Super::update(value);
}
