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

namespace AsbCloudApp.Services;

/// <summary>
/// сервис данных тех. процесса
/// </summary>
/// <typeparam name="TDto"></typeparam>
public interface ITelemetryDataService<TDto> : ITelemetryDataEditorService where TDto : ITelemetryData
{

    /// <summary>
    /// получить данные тех. процесса
    /// </summary>
    /// <param name="idWell"></param>
    /// <param name="dateBegin"></param>
    /// <param name="intervalSec"></param>
    /// <param name="approxPointsCount">кол-во элементов до которых эти данные прореживаются</param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<IEnumerable<TDto>> GetByWellAsync(int idWell,
        DateTime dateBegin = default, double intervalSec = 600d,
        int approxPointsCount = 1024, CancellationToken token = default);

    /// <summary>
    /// Получить данные тех. процесса по скважине
    /// </summary>
    /// <param name="idWell"></param>
    /// <param name="request"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<IEnumerable<TDto>> GetByWellAsync(int idWell, TelemetryDataRequest request, CancellationToken token);

    /// <summary>
    /// Получение данных тех. процесса по телеметрии
    /// </summary>
    /// <param name="idTelemetry"></param>
    /// <param name="request"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<IEnumerable<TDto>> GetByTelemetryAsync(int idTelemetry, TelemetryDataRequest request, CancellationToken token);

    /// <summary>
    /// Период за который есть данные по скважине в рамках временного интервала
    /// </summary>
    /// <param name="idWell"></param>
    /// <param name="geDate"></param>
    /// <param name="leDate"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<DatesRangeDto?> GetRangeAsync(int idWell, DateTimeOffset geDate, DateTimeOffset? leDate, CancellationToken token);

    /// <summary>
    /// Период за который есть данные по скважине
    /// </summary>
    /// <param name="idWell"></param>
    /// <returns></returns>
    DatesRangeDto? GetRange(int idWell);

    /// <summary>
    /// добавить/изменить данные тех. процесса (используется панелью)
    /// </summary>
    /// <param name="uid"></param>
    /// <param name="dtos"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<int> UpdateDataAsync(string uid, IEnumerable<TDto> dtos, CancellationToken token);
}