#pragma once

#include "imgui.h"

namespace fn {

// Configuracion para surface_plot_3d.
//
// `z` es la malla de alturas en row-major: z[j * nx + i] es la altura en
// (x_i, y_j). Las coordenadas X / Y se generan automaticamente entre
// [x_min, x_max] y [y_min, y_max] (lineales, mismo nx / ny que `z`).
//
// `size.x = -1` extiende el plot a todo el ancho disponible. `size.y` define
// la altura en pixeles (default 400).
struct SurfacePlot3DConfig {
    const float* z = nullptr;   // length = nx * ny, row-major
    int nx = 0;
    int ny = 0;
    float x_min = 0.f;
    float x_max = 1.f;
    float y_min = 0.f;
    float y_max = 1.f;
    const char* x_label = "x";
    const char* y_label = "y";
    const char* z_label = "z";
    ImVec2 size = ImVec2(-1.f, 400.f);
    bool show_colormap = true;
};

// Renderiza una superficie 3D usando ImPlot3D::PlotSurface.
//
// Llamar dentro de un frame ImGui activo (p.ej. dentro de la lambda render
// pasada a fn::run_app). Si `cfg.z == nullptr` o nx / ny < 2 la funcion
// renderiza un mensaje informativo en lugar del plot.
void surface_plot_3d(const char* title, const SurfacePlot3DConfig& cfg);

} // namespace fn
