using AsbCloudDb.Model;
using System.Linq;

namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
#nullable enable
    class DetectorDrillingSlide : DetectorAbstract
    {
        public DetectorDrillingSlide() : base(3)
        {
            FragmentLength = 10;
        }

        protected override bool DetectStart(DetectableTelemetry[] telemetry, int position)
        {
            var firstItem = telemetry[position];
            var delta = firstItem.WellDepth - firstItem.BitDepth;
            if (delta is not null &&
                System.Math.Abs((float)delta) > 1d)
                return false;

            var fragment = telemetry[position..(position + FragmentLength)];

            const double minRop = 5; //м/час
            const double minRotorSpeed = 5; //об/мин
            const double ticksPerHour = 60 * 60 * 10_000_000d;

            var lineBlockPosition = new InterpolationLine(fragment.Select(d => (d.BlockPosition ?? 0d, d.DateTime.Ticks / ticksPerHour)));
            if (!lineBlockPosition.IsYDecreases(minRop))
                return false;

            var lineWellDepth = new InterpolationLine(fragment.Select(d => (d.WellDepth ?? 0d, d.DateTime.Ticks / ticksPerHour)));
            if (!lineWellDepth.IsYIncreases(minRop))
                return false;

            var lineRotorSpeed = new InterpolationLine(fragment.Select(d => (d.RotorSpeed ?? 0d, d.DateTime.Ticks / ticksPerHour)));
            if (!lineRotorSpeed.IsAverageYMoreThanBound(minRotorSpeed))
                return false;

            return true;
        }

        protected override bool DetectEnd(DetectableTelemetry[] telemetry, int position)
            => !DetectStart(telemetry, position);

        protected override void CalcValue(ref DetectedOperation result)
        {
            throw new System.NotImplementedException();
        }
    }
#nullable disable
}