#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);
}
