using AsbCloudApp.Data;
using AsbCloudApp.Data.Subsystems;
using AsbCloudApp.Requests;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudApp.Services.Subsystems
{
    /// <summary>
    /// Получение инфо о наработке подсистем
    /// </summary>
    public interface ISubsystemOperationTimeService
    {
        /// <summary>
        /// Статистика о наработке подсистем
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<SubsystemStatDto>?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token);       

        /// <summary>
        /// Удаление наработки по подсистемам.
        /// Если удаляется конец, то фоновый сервис подсчета наработки восстановит эти данные.
        /// Может потребоваться для запуска повторного расчета по новому алгоритму.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token);

        /// <summary>
        /// Интервалы работы подсистем
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<SubsystemOperationTimeDto>?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);

        /// <summary>
        /// Временной диапазон за который есть статистика работы подсистем
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<DatesRangeDto?> GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);

        /// <summary>
        /// Получение статистики по наработке подсистем по активным скважинам
        /// </summary>
        /// <param name="idCompany"></param>
        /// <param name="gtDate"></param>
        /// <param name="ltDate"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<SubsystemActiveWellStatDto>> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token);

        /// <summary>
        /// Получение статистики по наработке подсистем по активным скважинам
        /// </summary>
        /// <param name="wellIds"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<SubsystemActiveWellStatDto>> GetStatByActiveWells(IEnumerable<int> wellIds, CancellationToken token);
        
        /// <summary>
        /// Получение периода, за который будет расчитываться статистика
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<DateTime>> GetStatDateRangeAsync(SubsystemOperationTimeRequest request, CancellationToken token);
    }
}