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

using namespace rive;

Star::Star() {}

void Star::innerRadiusChanged() { markPathDirty(); }

std::size_t Star::vertexCount() { return points() * 2; }

void Star::buildPolygon() {
    auto halfWidth = width() / 2;
    auto halfHeight = height() / 2;
    auto innerHalfWidth = width() * innerRadius() / 2;
    auto innerHalfHeight = height() * innerRadius() / 2;
    auto ox = -originX() * width() + halfWidth;
    auto oy = -originY() * height() + halfHeight;

    std::size_t length = vertexCount();
    auto angle = -math::PI / 2;
    auto inc = 2 * math::PI / length;

    for (std::size_t i = 0; i < length; i += 2) {
        {
            StraightVertex& vertex = m_PolygonVertices[i];
            vertex.x(ox + cos(angle) * halfWidth);
            vertex.y(oy + sin(angle) * halfHeight);
            vertex.radius(cornerRadius());
            angle += inc;
        }
        {
            StraightVertex& vertex = m_PolygonVertices[i + 1];
            vertex.x(ox + cos(angle) * innerHalfWidth);
            vertex.y(oy + sin(angle) * innerHalfHeight);
            vertex.radius(cornerRadius());
            angle += inc;
        }
    }
}

void Star::update(ComponentDirt value) { Super::update(value); }
