using DD.Persistence.Models;

namespace DD.Persistence.Client.Clients.Interfaces;

/// <summary>
/// Клиент для работы с временными данными
/// </summary>
/// <typeparam name="TDto"></typeparam>
public interface ITimeSeriesClient<TDto> : IDisposable where TDto : class, ITimeSeriesAbstractDto
{
	/// <summary>
	/// Добавление записей
	/// </summary>
	/// <param name="dtos"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> AddRange(IEnumerable<TDto> dtos, CancellationToken token);

	/// <summary>
	/// Получить список объектов, удовлетворяющий диапазону дат
	/// </summary>
	/// <param name="dateBegin"></param>
	/// <param name="dateEnd"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<IEnumerable<TDto>> Get(DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);

	/// <summary>
	/// Получить диапазон дат, для которых есть данные в репозитории
	/// </summary>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<DatesRangeDto?> GetDatesRange(CancellationToken token);

	/// <summary>
	///  Получить список объектов с прореживанием, удовлетворяющий диапазону дат
	/// </summary>
	/// <param name="dateBegin"></param>
	/// <param name="intervalSec"></param>
	/// <param name="approxPointsCount"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<IEnumerable<TDto>> GetResampledData(DateTimeOffset dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default);
}