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