using System;
using AsbCloudInfrastructure.Services.DetectOperations;
using AsbCloudInfrastructure.Services.DetectOperations.Detectors;
using Xunit;

namespace AsbCloudInfrastructure.Tests.Services.DetectedOperations.Detectors;

public class DetectorSlipsTimeTests
{
    private const int IdSlipsTime = 5011;

    private readonly DetectableTelemetry telemetry = new()
    {
        WellDepth = 300,
        Pressure = 15,
        HookWeight = 20,
        BlockPosition = 20,
        BitDepth = 151,
        AxialLoad = 19,
    };

    private readonly DetectorSlipsTime sut = new();

    [Fact]
    public void DetectOperation_by_change_block_position_and_axial_load_less_hook_weight_is_success()
    {
        //arrange
        var point0 = telemetry.Copy();

        var point1 = telemetry.Copy();
        point1.BlockPosition = 21;

        var telemetries = new[] { point0, point1 };

        //act
        var isDetectOperation = sut.TryDetect(0, telemetries, 0, telemetries.Length - 1, null, out var result);

        //assert
        Assert.True(isDetectOperation);
        Assert.NotNull(result);
        Assert.Equal(IdSlipsTime, result.Operation.IdCategory);
    }

    [Fact]
    public void DetectOperation_by_high_pressure_is_success()
    {
        //arrange
        var point0 = telemetry.Copy();

        var point1 = telemetry.Copy();
        point1.BlockPosition = 21;
        point1.AxialLoad = 30;
        point1.HookWeight = 20;
        point1.Pressure = 23;

        var telemetries = new[] { point0, point1 };

        //act
        var isDetectOperation = sut.TryDetect(0, telemetries, 0, telemetries.Length - 1, null, out var result);

        //assert
        Assert.True(isDetectOperation);
        Assert.NotNull(result);
        Assert.Equal(IdSlipsTime, result.Operation.IdCategory);
    }

    [Fact]
    public void ValidateOperation_with_duration_more_30_minutes_is_invalid()
    {
        //arrange
        var point0 = telemetry.Copy();

        var point1 = telemetry.Copy();
        point1.BlockPosition = 21;
        point1.DateTime = DateTimeOffset.UtcNow.AddMinutes(30);

        var telemetries = new[] { point0, point1 };

        //act
        var isDetectOperation = sut.TryDetect(0, telemetries, 0, telemetries.Length - 1, null, out var result);

        //assert
        Assert.False(isDetectOperation);
        Assert.NotNull(result);
        Assert.Equal(IdSlipsTime, result.Operation.IdCategory);
    }
}