#pragma once
#include <string>
#include <vector>
#include "gfx/dag_types.h"

namespace fn::gfx {

// Compila un pipeline DAG a GLSL 330 core completo (listo para gl_shader::compile_fragment).
// El preamble de gl_shader ya declara #version, fragColor, u_time, u_resolution, u_mouse.
// Este compilador emite uniform vec4 u_params[64], las funciones node_<i> y void main().
// Si el pipeline esta vacio, emite un fragment que pinta gris oscuro.
std::string compile_dag_to_glsl(const std::vector<DagStep>& pipeline);

// Devuelve el indice base (vec4) en u_params[] que ocupa cada nodo del pipeline.
// Cada nodo ocupa ceil(param_count / 4) vec4s consecutivos. Nodos con 0 params ocupan 0.
// El compilador y dag_uniforms_apply usan el mismo layout.
std::vector<int> dag_param_layout(const std::vector<DagStep>& pipeline);

// Variante de compile_dag_to_glsl que sustituye `uniform vec4 u_params[64]`
// por un `const vec4 u_params[N] = vec4[N](...)` con los valores actuales del
// pipeline empaquetados, y `uniform int u_preview_target` por
// `const int u_preview_target = -1`. El resultado es un fragment shader
// autocontenido: no depende de ningun uniform externo y se puede pegar tal cual
// en el editor Code para reproducir el DAG actual.
std::string compile_dag_to_glsl_baked(const std::vector<DagStep>& pipeline);

} // namespace fn::gfx
