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

namespace AsbCloudApp.Requests;

/// <summary>
/// Запрос получения ГГД
/// </summary>
public class WellOperationRequestBase : RequestBase
{
    /// <summary>
    /// Больше или равно дате начала операции
    /// </summary>
    public DateTimeOffset? GeDate { get; set; }

    /// <summary>
    /// Меньше или равно дате окончания операции
    /// </summary>
    public DateTimeOffset? LeDate { get; set; }

    /// <summary>
    /// Больше или равно глубины скважины на начало операции. 
    /// </summary>
    public double? GeDepth { get; set; }

    /// <summary>
    /// Меньше или равно глубины скважины на конец операции.
    /// </summary>
    public double? LeDepth { get; set; }

    /// <summary>
    /// Идентификаторы категорий операции
    /// </summary>
    public IEnumerable<int>? OperationCategoryIds { get; set; }

    /// <summary>
    /// Тип операций
    /// <list type="bullet">
    /// <item>0 - плановая операция</item>
    /// <item>1 - фактическая операция</item>
    /// </list>
    /// </summary>
    public int? OperationType { get; set; }

    /// <summary>
    /// Идентификаторы конструкций секции
    /// </summary>
    public IEnumerable<int>? SectionTypeIds { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public WellOperationRequestBase()
    {
        
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="request"></param>
    public WellOperationRequestBase(WellOperationRequestBase request)
    {
        GeDepth = request.GeDepth;
        LeDepth = request.LeDepth;
        GeDate = request.GeDate;
        LeDate = request.LeDate;

        OperationCategoryIds = request.OperationCategoryIds;
        OperationType = request.OperationType;
        SectionTypeIds = request.SectionTypeIds;

        Skip = request.Skip;
        Take = request.Take;
        SortFields = request.SortFields;
    }
}

/// <summary>
/// Запрос получения ГГД с идентификаторами скважин
/// </summary>
public class WellOperationRequest : WellOperationRequestBase
{
    /// <inheritdoc />
    public WellOperationRequest(IEnumerable<int> idsWell)
    {
        IdsWell = idsWell;
    }

    /// <inheritdoc />
    public WellOperationRequest(WellOperationRequestBase request, IEnumerable<int> idsWell)
        : base(request)
    {
        IdsWell = idsWell;
    }

    /// <summary>
    /// Идентификаторы скважин
    /// </summary>
    [Required]
    [Length(1, 100)]
    public IEnumerable<int> IdsWell { get; }
}

/// <summary>
/// Запрос получения ГГД с идентификаторами скважин
/// </summary>
public class WellOperationRepositoryRequest
{
    /// <summary>
    /// Идентификаторы скважин
    /// </summary>
    [Required]
    [Length(1, 100)]
    public IEnumerable<int> IdsWell { get; }

    /// <summary>
    /// Меньше или равно дате окончания операции
    /// </summary>
    public DateTimeOffset? LeDate { get; set; }

    /// <summary>
    /// Меньше или равно глубины скважины на конец операции.
    /// </summary>
    public double? LeDepth { get; set; }

    /// <summary>
    /// Тип операций
    /// <list type="bullet">
    /// <item>0 - плановая операция</item>
    /// <item>1 - фактическая операция</item>
    /// </list>
    /// </summary>
    public int? OperationType { get; set; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="request"></param>
    public WellOperationRepositoryRequest(WellOperationRequest request)
    {
        IdsWell = request.IdsWell;
        LeDate = request.LeDate;
        LeDepth = request.LeDepth;
        OperationType = request.OperationType;
    }
}