#include "viz/scatter_3d.h"

#include "imgui.h"
#include "implot3d.h"

namespace fn {

void scatter_3d(const char* title, const Scatter3DConfig& cfg) {
    if (!cfg.xs || !cfg.ys || !cfg.zs || cfg.n < 1) {
        ImGui::BeginGroup();
        ImGui::TextDisabled("%s", title ? title : "##scatter_3d");
        ImGui::TextWrapped("scatter_3d: necesita xs, ys, zs != nullptr y n >= 1 (recibido n=%d)",
                           cfg.n);
        ImGui::EndGroup();
        return;
    }

    if (ImPlot3D::BeginPlot(title, cfg.size)) {
        ImPlot3D::SetupAxes("x", "y", "z");

        // ImPlot3DSpec::MarkerSizes / MarkerFillColors esperan punteros no
        // const; los arrays de cfg vienen como const*. Como ImPlot3D solo los
        // lee, hacemos un const_cast acotado a esta llamada.
        ImPlot3DSpec spec;
        if (cfg.sizes)  spec.MarkerSizes      = const_cast<float*>(cfg.sizes);
        if (cfg.colors) spec.MarkerFillColors = const_cast<ImU32*>(cfg.colors);

        ImPlot3D::PlotScatter("##points", cfg.xs, cfg.ys, cfg.zs, cfg.n, spec);
        ImPlot3D::EndPlot();
    }
}

} // namespace fn
