// gpu_device.hpp - Wrapper de SDL_GPUDevice
// © 2026 JailDesigner
//
// Ownership del SDL_GPUDevice i del claim del window. Backend per plataforma:
// Vulkan (Linux, Windows) i Metal (macOS). Sense DirectX.
//
// Els shaders s'embedien al binari (no es carreguen de disc): SPIR-V via
// headers generats per CMake a `gpu/spv/*.h`, i MSL a mà a `gpu/msl/*.msl.h`.
// La creació dels SDL_GPUShader la fan els pipelines via shader_factory.hpp.
//
// Ús:
//   GpuDevice device;
//   if (!device.init(window)) return -1;       // claim del window
//   ... pipelines setup ...
//   device.destroy();                          // unclaim + destroy device

#pragma once

#include <SDL3/SDL.h>
#include <SDL3/SDL_gpu.h>

namespace Rendering::GPU {

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

        // No copia / move (RAII propietari del device).
        GpuDevice(const GpuDevice&) = delete;
        auto operator=(const GpuDevice&) -> GpuDevice& = delete;
        GpuDevice(GpuDevice&&) = delete;
        auto operator=(GpuDevice&&) -> GpuDevice& = delete;

        // Crea el device i claim el window. Selecciona MSL en macOS, SPIR-V
        // en la resta. Retorna false si no hi ha backend suportat o si el
        // driver no permet el claim.
        [[nodiscard]] auto init(SDL_Window* window) -> bool;
        void destroy();

        [[nodiscard]] auto get() const -> SDL_GPUDevice* { return device_; }
        [[nodiscard]] auto window() const -> SDL_Window* { return window_; }
        [[nodiscard]] auto swapchainFormat() const -> SDL_GPUTextureFormat { return swapchain_format_; }

       private:
        SDL_GPUDevice* device_{nullptr};
        SDL_Window* window_{nullptr};
        SDL_GPUTextureFormat swapchain_format_{SDL_GPU_TEXTUREFORMAT_INVALID};
    };

}  // namespace Rendering::GPU
