using Microsoft.AspNetCore.Mvc;
using Persistence.Models;
using Persistence.Models.Requests;

namespace Persistence.API;

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

    /// <summary>
    /// Получение данных на текущую дату (с пагинацией)
    /// </summary>
    /// <param name="idDiscriminator"></param>
    /// <param name="filterRequest">параметры запроса фильтрации</param>
    /// <param name="paginationRequest">параметры запроса пагинации</param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<IActionResult> GetCurrent(Guid idDiscriminator, SectionPartRequest filterRequest, PaginationRequest paginationRequest, 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<IActionResult> 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<IActionResult> GetChangeLogForDate(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);

    /// <summary>
    /// Добавить одну запись 
    /// </summary>
    /// <param name="idDiscriminator"></param>
    /// <param name="dto"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<IActionResult> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token);

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

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

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

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

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

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