#pragma once

#include <string>

namespace fn::gfx {

// GpuCaps recopila capacidades OpenGL y CUDA del contexto activo.
// Todos los campos de cadena estan vacios ("") si el dato no esta disponible.
struct GpuCaps {
    // OpenGL — requieren contexto GL activo antes de llamar gpu_check_caps.
    std::string gl_vendor;    // glGetString(GL_VENDOR)   ej. "NVIDIA Corporation"
    std::string gl_renderer;  // glGetString(GL_RENDERER) ej. "NVIDIA GeForce RTX 3080/PCIe/SSE2"
    std::string gl_version;   // glGetString(GL_VERSION)  ej. "4.6.0 NVIDIA 550.54.15"

    // Compute shader limits (GL_MAX_COMPUTE_WORK_GROUP_COUNT/SIZE)
    // Indice 0=X 1=Y 2=Z. Valor 0 si compute shaders no disponibles.
    int max_compute_workgroup_count[3] = {0, 0, 0};
    int max_compute_workgroup_size[3]  = {0, 0, 0};

    bool has_compute_shader  = false; // GL_VERSION >= 4.3 o extension ARB_compute_shader
    bool has_storage_buffer  = false; // GL_VERSION >= 4.3 o extension ARB_shader_storage_buffer_object

    // CUDA — vacio si CUDA runtime no detectado en compile time.
    // Formato: "12.4" (major.minor) o "" si no disponible.
    std::string cuda_runtime_version;
};

// gpu_check_caps rellena out con las capacidades del contexto OpenGL activo.
//
// REQUISITO: debe llamarse despues de inicializar el contexto GL y, en Windows,
// despues de fn::gfx::gl_loader_init(). Si se llama sin contexto activo el
// comportamiento es indefinido (glGetString devuelve nullptr).
//
// Retorna true si se pudo leer al menos el vendor GL (contexto activo).
// Retorna false si gl_vendor queda vacio (contexto no activo o driver defectuoso).
bool gpu_check_caps(GpuCaps& out);

} // namespace fn::gfx
