using AsbCloudApp.Data.DetectedOperation;
using AsbCloudDb.Model;
using System;
using System.Collections.Generic;

namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{

    /// <summary>
    /// Промывка
    /// </summary>
    public class DetectorFlashing : DetectorAbstract
    {

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

        protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperationDto? previousOperation)
        {

            var currentPoint = telemetry[position];
            if (currentPoint.Pressure < 10)
                return false;

            var delta = currentPoint.WellDepth - currentPoint.BitDepth;
            if (delta < 0.01d)
                return false;

            if (currentPoint.RotorSpeed > 8)
                return false;

            var nextIndexPoint = telemetry.Length <= position ? position : position + 1;
            var nextPoint = telemetry[nextIndexPoint];
            if (Math.Abs(currentPoint.WellDepth - nextPoint.WellDepth) > 0)
                return false;

            if (currentPoint.BitDepth < 150)
                return false;

            return true;

        }

        protected override int DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperationDto? previousOperation)
        {
            var currentPoint = telemetry[position];

            if (currentPoint.Pressure < 10)
                return IdReasonOfEnd_PressureIsLo;
            if ((currentPoint.WellDepth - currentPoint.BitDepth) < 0.01d)
                return IdReasonOfEnd_DeltaWellDepthAndBithDepthIsLo;
            if (currentPoint.RotorSpeed > 8)
                return IdReasonOfEnd_RotorSpeedIsHi;
            if (currentPoint.BitDepth < 150)
                return IdReasonOfEnd_BithDepthIsLo;
            return IdReasonOfEnd_NotDetected;
        }

        protected override (int IdCategory, IDictionary<string, object> ExtraData) GetSpecificInformation(DetectableTelemetry[] telemetry,
            int begin,
            int end)
        {
            return (WellOperationCategory.IdFlashing, new Dictionary<string, object>());
        }
    }
}