using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace FinLib.Risk;

public static class ValueAtRisk
{
    public static double Historical(IEnumerable<double> values, double confidence)
    {
        unsafe {
            var valueArr = values.ToArray();
            fixed (double* ptrOne = valueArr) {
                var ret = NativeMethods.historical_value_at_risk(ptrOne, (UIntPtr)valueArr.Length, confidence);

                return *ret;
            }
        }
    }

    public static double VarCovar(IEnumerable<double> values, double confidence)
    {
        unsafe {
            var valueArr = values.ToArray();
            fixed (double* ptrOne = valueArr) {
                var ret = NativeMethods.varcovar_value_at_risk(ptrOne, (UIntPtr)valueArr.Length, confidence);

                return *ret;
            }
        }
    }

    public static double ScaleValueAtRisk(double initialValue, nint timeCycles) => NativeMethods.scale_value_at_risk(initialValue, timeCycles);
}