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

namespace AsbCloudInfrastructure.Services.Analysis
{
    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++;
            }
        }

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

        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 IsAverageYLessThanBound(double bound) =>
                (ySum / count) < bound;

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