#pragma once

#include <cstddef>

namespace fn::ds {

struct DrawdownResult {
    double max_dd      = 0.0;   // peak - trough
    double max_dd_pct  = 0.0;   // (peak - trough) / peak (si peak > 0)
    std::size_t peak_idx   = 0; // indice donde ocurre el peak antes del trough
    std::size_t trough_idx = 0; // indice del trough que crea el max_dd
};

// Calcula el max drawdown sobre una serie de balance/equity. Recorrido
// O(n). Equity[i] puede ser negativo (no valid para max_dd_pct, que se
// devuelve 0 si peak <= 0).
DrawdownResult drawdown_max(const double* equity, std::size_t n);

// Llena out[n] con el drawdown actual en cada punto: out[i] = peak_so_far - equity[i].
// Util para plotear underwater chart.
void drawdown_series(const double* equity, std::size_t n, double* out);

} // namespace fn::ds
