// polygon_renderer.cpp - Implementació de renderitzat de polígons
// © 1999 Visente i Sergi (versió Pascal)
// © 2025 Port a C++20 amb SDL3
//
// ==============================================================================
// DEPRECATED: Use core/rendering/shape_renderer.cpp instead
// ==============================================================================

#include "core/rendering/polygon_renderer.hpp"

#include <array>
#include <cmath>

#include "core/defaults.hpp"
#include "core/rendering/line_renderer.hpp"

namespace Rendering {

void rota_tri(SDL_Renderer* renderer, const Triangle& tri, float angul, float velocitat, bool dibuixar) {
    // Rotar i dibuixar triangle (nau)
    // Conversió de coordenades polars a cartesianes amb rotació
    // Basat en el codi Pascal original: lines 271-284

    // Convertir cada punt polar a cartesià
    // x = (r + velocitat) * cos(angle_punt + angle_nau) + centre.x
    // y = (r + velocitat) * sin(angle_punt + angle_nau) + centre.y

    int x1 = static_cast<int>(std::round((tri.p1.r + velocitat) *
                 std::cos(tri.p1.angle + angul))) +
        tri.centre.x;

    int y1 = static_cast<int>(std::round((tri.p1.r + velocitat) *
                 std::sin(tri.p1.angle + angul))) +
        tri.centre.y;

    int x2 = static_cast<int>(std::round((tri.p2.r + velocitat) *
                 std::cos(tri.p2.angle + angul))) +
        tri.centre.x;

    int y2 = static_cast<int>(std::round((tri.p2.r + velocitat) *
                 std::sin(tri.p2.angle + angul))) +
        tri.centre.y;

    int x3 = static_cast<int>(std::round((tri.p3.r + velocitat) *
                 std::cos(tri.p3.angle + angul))) +
        tri.centre.x;

    int y3 = static_cast<int>(std::round((tri.p3.r + velocitat) *
                 std::sin(tri.p3.angle + angul))) +
        tri.centre.y;

    // Dibuixar les 3 línies que formen el triangle
    linea(renderer, x1, y1, x2, y2, dibuixar);
    linea(renderer, x1, y1, x3, y3, dibuixar);
    linea(renderer, x3, y3, x2, y2, dibuixar);
}

void rota_pol(SDL_Renderer* renderer, const Poligon& pol, float angul, bool dibuixar) {
    // Rotar i dibuixar polígon (enemics i bales)
    // Conversió de coordenades polars a cartesianes amb rotació
    // Basat en el codi Pascal original: lines 286-296

    // Array temporal per emmagatzemar punts convertits a cartesianes
    std::array<Punt, Defaults::Entities::MAX_IPUNTS> xy;

    // Convertir cada punt polar a cartesià
    for (uint8_t i = 0; i < pol.n; i++) {
        xy[i].x = static_cast<int>(std::round(
                      pol.ipuntx[i].r * std::cos(pol.ipuntx[i].angle + angul))) +
            pol.centre.x;

        xy[i].y = static_cast<int>(std::round(
                      pol.ipuntx[i].r * std::sin(pol.ipuntx[i].angle + angul))) +
            pol.centre.y;
    }

    // Dibuixar línies entre punts consecutius
    for (uint8_t i = 0; i < pol.n - 1; i++) {
        linea(renderer, xy[i].x, xy[i].y, xy[i + 1].x, xy[i + 1].y, dibuixar);
    }

    // Tancar el polígon (últim punt → primer punt)
    linea(renderer, xy[pol.n - 1].x, xy[pol.n - 1].y, xy[0].x, xy[0].y, dibuixar);
}

}  // namespace Rendering
