using System.Collections.Generic;

namespace AsbCloudInfrastructure.Services.DetectOperations;


public class InterpolationLine
{
    private readonly double xSum;
    private readonly double ySum;
    private readonly double xySum;
    private readonly double x2Sum;
    private readonly int count;

    public InterpolationLine(IEnumerable<(double Y, double X)> rawData)
    {
        var iterator = rawData.GetEnumerator();
        while (iterator.MoveNext())
        {
            xSum += iterator.Current.X;
            ySum += iterator.Current.Y;
            xySum += iterator.Current.X * iterator.Current.Y;
            x2Sum += iterator.Current.X * iterator.Current.X;
            count++;
        }
    }

    /// <summary>
    /// tan(alpha)
    /// </summary>
    public double A =>
        (xSum * ySum - count * xySum) /
        (xSum * xSum - count * x2Sum);

    /// <summary>
    /// y offset
    /// </summary>
    public double B =>
        (xSum * xySum - x2Sum * ySum) /
        (xSum * xSum - count * x2Sum);

    public bool IsYNotChanges(double upperBound = 0d, double lowerBound = 0d) =>
            A < upperBound && A > lowerBound;

    public bool IsYIncreases(double bound = 0d) =>
        A > bound;

    public bool IsYDecreases(double bound = 0d) =>
        A < bound;

    public bool IsAverageYLessThan(double bound) =>
            (ySum / count) < bound;

    public bool IsAverageYGreaterThan(double bound) =>
            (ySum / count) >= bound;
}