using System;
using AsbCloudInfrastructure.Services.DetectOperations.Detectors;
using AsbCloudWebApi.Tests.Builders;
using Xunit;

namespace AsbCloudWebApi.Tests.Services.DetectedOperations.Detectors;

public class DetectorSlipsTimeTests
{
	private const int IdSlipsTime = 5011;

	private readonly DetectableTelemetryBuilder telemetryBuilder = new();

	private readonly DetectorSlipsTime sut = new();

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

		var point1 = telemetryBuilder
			.WithBlockPosition(21)
			.Build();

		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 = telemetryBuilder
			.Build();

		var point1 = telemetryBuilder
			.WithBlockPosition(21)
			.WithAxialLoad(30)
			.WithHookWeight(20)
			.WithPressure(23)
			.Build();

		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_bit_depth_before_150_meters_is_invalid()
	{
		//arrange
		var point0 = telemetryBuilder
			.WithBitDepth(149)
			.Build();

		var point1 = telemetryBuilder
			.WithBitDepth(149)
			.WithBlockPosition(21)
			.Build();

		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);
	}

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

		var point1 = telemetryBuilder
			.WithDateTime(DateTimeOffset.UtcNow.AddMinutes(30))
			.WithBlockPosition(21)
			.Build();

		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);
	}
}