using AsbCloudDb.Model;

namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
#nullable enable
    internal class DetectorRotor : DetectorAbstract
    {
        public DetectorRotor()
            : base(2) { }

        protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
        {
            var point0 = telemetry[position];
            var delta = point0.WellDepth - point0.BitDepth;
            if (delta > 0.03d)
                return false;

            if (point0.Pressure < 25)
                return false;

            if (point0.RotorSpeed < 5)
                return false;

            var point1 = telemetry[position + 1];
            if (point1.WellDepth - point0.WellDepth <= 0.003)
                return false;

            return true;
        }

        protected override int DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
        {
            var point0 = telemetry[position];
            var delta = point0.WellDepth - point0.BitDepth;
            if (delta > 0.03d)
                return IdReasonOfEnd_DeltaDepthIsHi;

            if (point0.Pressure < 25)
                return IdReasonOfEnd_PressureIsLo;

            var lineRotorSpeed = MakeInterpolationLine(d => d.RotorSpeed, telemetry, position, 60);

            if (lineRotorSpeed.IsAverageYLessThan(10))
                return IdReasonOfEnd_AvgRotorSpeedIsLo;

            if (!DeviatesFromBegin(telemetry, t => t.WellDepth, position, 150, 0.003))
                return IdReasonOfEnd_WellDepthDeviates;

            return IdReasonOfEnd_NotDetected;
        }

        protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end)
            => IsValidByWellDepthIncreasing(telemetry, begin, end);

        protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end)
            => CalcRop(telemetry, begin, end);
    }

#nullable disable
}