using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace AsbCloudApp.Data.ProcessMaps;

/// <summary>
/// Секция скважины - план
/// </summary>
public class WellSectionPlanDto : ItemInfoDto,
	IId,
	IWellRelated,
	IValidatableObject
{
	/// <inheritdoc/>
	public int Id { get; set; }

    /// <inheritdoc/>
    [Required]
	public int IdWell { get; set; }

	/// <summary>
	/// Тип секции
	/// </summary>
	[Required(ErrorMessage = "Поле обязательно для заполнение")]
	[Range(1, int.MaxValue)]
	public int IdSectionType { get; set; }

	/// <summary>
	/// Начальная глубина бурения, м
	/// </summary>
	[Required(ErrorMessage = "Поле обязательно для заполнение")]
	[Range(0, 10000, ErrorMessage = "Допустимое значение от 0 до 10000")]
	public double DepthStart { get; set; }

	/// <summary>
	/// Конечная глубина бурения, м
	/// </summary>
	[Required(ErrorMessage = "Поле обязательно для заполнение")]
	[Range(0, 10000, ErrorMessage = "Допустимое значение от 0 до 10000")]
	public double DepthEnd { get; set; }

	/// <summary>
	/// Внешний диаметр
	/// </summary>
	[Range(1, 10000, ErrorMessage = "Допустимое значение от 1 до 10000")]
	public double? OuterDiameter { get; set; }

	/// <summary>
	/// Внутренний диаметр
	/// </summary>
	[Range(1, 10000, ErrorMessage = "Допустимое значение от 1 до 10000")]
	public double? InnerDiameter { get; set; }

	/// <inheritdoc />
	public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
	{
		if (!OuterDiameter.HasValue && !InnerDiameter.HasValue)
			yield break;

		if (!OuterDiameter.HasValue)
			yield return new ValidationResult("Поле обязательно для заполнение", new[] { nameof(OuterDiameter) });

		if (!InnerDiameter.HasValue)
			yield return new ValidationResult("Поле обязательно для заполнение", new[] { nameof(InnerDiameter) });

		if (OuterDiameter <= InnerDiameter)
			yield return new ValidationResult("Внешний диаметр не должен быть больше или равен внутреннему",
				new[] { nameof(OuterDiameter) });
	}
}