#pragma once

#include <cstddef>

namespace fn::ds {

// Estadistica descriptiva pura sobre arrays de double.
// Todas las funciones aceptan ptr + n; n=0 devuelve identidades sensatas.

double stats_sum  (const double* data, std::size_t n);
double stats_mean (const double* data, std::size_t n);
double stats_min  (const double* data, std::size_t n);
double stats_max  (const double* data, std::size_t n);

// Welford one-pass (numericamente estable). Variance muestral si sample=true
// (denominador n-1), poblacional si sample=false (denominador n).
double stats_variance(const double* data, std::size_t n, bool sample = true);
double stats_std     (const double* data, std::size_t n, bool sample = true);

// Quantile lineal (R type-7). p en [0, 1]. NO modifica data — internamente
// hace copia + sort. Para multiples quantiles del mismo dataset, ordenar
// una vez con stats_sort y usar stats_quantile_sorted.
double stats_quantile(const double* data, std::size_t n, double p);

// Variante para dataset ya ordenado ascendente.
double stats_quantile_sorted(const double* sorted, std::size_t n, double p);

// Percentile = quantile(p/100).
double stats_percentile(const double* data, std::size_t n, double pct);

// Helper: ordena ascendente in-place a un buffer destino dado.
// out debe tener al menos n elementos. Si out == data, ordena in-place.
void stats_sort(const double* data, std::size_t n, double* out);

} // namespace fn::ds
