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