using DD.Persistence.Models;
using DD.Persistence.Models.Requests;

namespace DD.Persistence.Client.Clients.Interfaces;

/// <summary>
/// Клиент для работы с записями ChangeLog
/// </summary>
public interface IChangeLogClient : IDisposable
{
	/// <summary>
	/// Добавить одну запись
	/// </summary>
	/// <param name="idDiscriminator"></param>
	/// <param name="dto"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token);

	/// <summary>
	/// Добавить несколько записей
	/// </summary>
	/// <param name="idDiscriminator"></param>
	/// <param name="dtos"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);

	/// <summary>
	/// Импорт с заменой: удаление старых строк и добавление новых
	/// </summary>
	/// <param name="idDiscriminator"></param>
	/// <param name="dtos"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);

	/// <summary>
	/// Удалить одну запись
	/// </summary>
	/// <param name="id"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> Delete(Guid id, CancellationToken token);

	/// <summary>
	/// Удалить несколько записей
	/// </summary>
	/// <param name="ids"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> DeleteRange(IEnumerable<Guid> ids, CancellationToken token);

	/// <summary>
	/// Получение актуальных данных на определенную дату (с пагинацией)
	/// </summary>
	/// <param name="idDiscriminator"></param>
	/// <param name="moment"></param>
	/// <param name="filterRequest"></param>
	/// <param name="paginationRequest"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<PaginationContainer<DataWithWellDepthAndSectionDto>> GetByDate(Guid idDiscriminator, DateTimeOffset moment, SectionPartRequest filterRequest, PaginationRequest paginationRequest, CancellationToken token);

	/// <summary>
	/// Получение исторических данных за определенный период времени
	/// </summary>
	/// <param name="idDiscriminator"></param>
	/// <param name="dateBegin"></param>
	/// <param name="dateEnd"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<IEnumerable<ChangeLogDto>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);

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

	/// <summary>
	/// Обновить одну запись
	/// </summary>
	/// <param name="dto"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token);

	/// <summary>
	/// Обновить несколько записей
	/// </summary>
	/// <param name="dtos"></param>
	/// <param name="token"></param>
	/// <returns></returns>
	Task<int> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);
}