#pragma once
#include <functional>
#include <string>
#include "gfx/gl_framebuffer.h"
#include "gfx/gl_shader.h"
#include "gfx/fullscreen_quad.h"

namespace fn::gfx {

struct ShaderCanvas {
    Framebuffer fb;
    Quad quad;
    unsigned int program = 0;
    bool initialized = false;
};

// Inicializa recursos GL (idempotente).
void canvas_init(ShaderCanvas& c);

// Sustituye el programa activo (borra el anterior). Acepta program=0 para pantalla en negro.
void canvas_set_program(ShaderCanvas& c, unsigned int program);

// Renderiza el shader al FBO y dibuja la textura resultante como contenido del panel ImGui.
// Llamar DENTRO de un ImGui::Begin/End. Ocupa GetContentRegionAvail().
// uniforms_fn se invoca tras glUseProgram y antes de quad_draw, recibe el program ID.
void canvas_render(ShaderCanvas& c, float time_seconds,
                   const std::function<void(unsigned int program)>& uniforms_fn = {});

void canvas_destroy(ShaderCanvas& c);

} // namespace fn::gfx
