// gpu_line_pipeline.hpp - Pipeline gráfico para dibujar líneas vectoriales
// © 2025 Orni Attack
//
// Las líneas se renderizan como quads (2 triángulos = 6 índices) ya extrudidos
// en CPU según el grosor pedido por línea. Vertex layout: position (vec2) + color (vec4).
// Primitive type: TRIANGLELIST. Sin depth test (juego 2D), blending alpha estándar.

#pragma once

#include <SDL3/SDL_gpu.h>

#include <cstdint>

namespace Rendering::GPU {

class GpuDevice;

// Vertex layout (debe coincidir con shaders/line.vert.glsl).
struct LineVertex {
        float x;
        float y;
        float r;
        float g;
        float b;
        float a;
};

// Uniform buffer del vertex shader (debe coincidir con UBO en line.vert.glsl).
struct LineUniforms {
        float viewport_width;
        float viewport_height;
        float padding_0;
        float padding_1;  // Alineamiento a 16 bytes
};

class GpuLinePipeline {
    public:
        GpuLinePipeline() = default;
        ~GpuLinePipeline();

        GpuLinePipeline(const GpuLinePipeline&) = delete;
        auto operator=(const GpuLinePipeline&) -> GpuLinePipeline& = delete;
        GpuLinePipeline(GpuLinePipeline&&) = delete;
        auto operator=(GpuLinePipeline&&) -> GpuLinePipeline& = delete;

        // target_format: formato del color target sobre el que renderizamos
        // (swapchain o offscreen). Por defecto coincide con el del swapchain
        // del device.
        [[nodiscard]] auto init(const GpuDevice& device,
                                SDL_GPUTextureFormat target_format) -> bool;
        void destroy();

        [[nodiscard]] auto get() const -> SDL_GPUGraphicsPipeline* { return pipeline_; }

    private:
        SDL_GPUDevice* owner_{nullptr};  // No-owning; el GpuDevice es el dueño
        SDL_GPUGraphicsPipeline* pipeline_{nullptr};
};

}  // namespace Rendering::GPU
