#pragma once

#include <SDL3/SDL.h>

#include <string>

namespace Rendering {

/**
 * @brief Interfaz abstracta para backends de renderizado con shaders
 *
 * Esta interfaz define el contrato que todos los backends de shaders
 * deben cumplir (OpenGL, Metal, Vulkan, etc.)
 */
class ShaderBackend {
    public:
        virtual ~ShaderBackend() = default;

        /**
         * @brief Inicializa el backend de shaders
         * @param window Ventana SDL
         * @param texture Textura de backbuffer a la que aplicar shaders
         * @param vertex_source Código fuente del vertex shader
         * @param fragment_source Código fuente del fragment shader
         * @return true si la inicialización fue exitosa
         */
        virtual auto init(SDL_Window* window,
            SDL_Texture* texture,
            const std::string& vertex_source,
            const std::string& fragment_source) -> bool = 0;

        /**
         * @brief Renderiza la textura con los shaders aplicados
         */
        virtual void render() = 0;

        /**
         * @brief Establece el tamaño de la textura como parámetro del shader
         * @param width Ancho de la textura
         * @param height Alto de la textura
         */
        virtual void setTextureSize(float width, float height) = 0;

        /**
         * @brief Limpia y libera recursos del backend
         */
        virtual void cleanup() = 0;

        /**
         * @brief Verifica si el backend está usando aceleración por hardware
         * @return true si usa aceleración (OpenGL/Metal/Vulkan)
         */
        [[nodiscard]] virtual auto isHardwareAccelerated() const -> bool = 0;
};

}  // namespace Rendering
