// line_renderer.cpp - Implementación de renderizado de líneas (SDL3 GPU)
// © 2026 JailDesigner

#include "core/rendering/line_renderer.hpp"

#include "core/defaults.hpp"

namespace Rendering {

    // Color global compartido para líneas sin paleta propia (HUD, debug, texto
    // genérico). Equivale al "color máximo" de la antigua oscilación CPU: verde
    // fósforo CRT. El pulso de brillo lo aplica ahora el shader de postpro.
    SDL_Color g_current_line_color = {100, 255, 100, 255};

    // Grosor global por defecto. Configurable via setLineThickness.
    float g_current_line_thickness = Defaults::Rendering::LINE_THICKNESS_DEFAULT;

    void linea(Renderer* renderer,
        int x1,
        int y1,
        int x2,
        int y2,
        float brightness,
        float thickness,
        SDL_Color color) {
        if (renderer == nullptr) {
            return;
        }

        // Coords lógicas (1280×720). El shader hace el mapeo a NDC; el viewport
        // del SDLManager hace el letterbox a píxeles físicos.
        const auto FX1 = static_cast<float>(x1);
        const auto FY1 = static_cast<float>(y1);
        const auto FX2 = static_cast<float>(x2);
        const auto FY2 = static_cast<float>(y2);

        // color.alpha==0 → usar color global (verde fósforo). alpha>0 → color directo.
        const SDL_Color SOURCE = (color.a > 0) ? color : g_current_line_color;
        const float R = (static_cast<float>(SOURCE.r) * brightness) / 255.0F;
        const float G = (static_cast<float>(SOURCE.g) * brightness) / 255.0F;
        const float B = (static_cast<float>(SOURCE.b) * brightness) / 255.0F;

        const float W = (thickness > 0.0F) ? thickness : g_current_line_thickness;

        renderer->pushLine(FX1, FY1, FX2, FY2, W, R, G, B, 1.0F);
    }

    void setLineColor(SDL_Color color) { g_current_line_color = color; }

    auto getLineColor() -> SDL_Color { return g_current_line_color; }

    void setLineThickness(float thickness) {
        if (thickness > 0.0F) {
            g_current_line_thickness = thickness;
        }
    }

    auto getLineThickness() -> float { return g_current_line_thickness; }

}  // namespace Rendering
