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

namespace Persistence.API;

/// <summary>
/// Интерфейс для работы с API журнала изменений
/// </summary>
public interface IChangeLogApi<TDto, TChangeLogDto>
    where TDto : class, new()
    where TChangeLogDto : ChangeLogDto<TDto>
{
    /// <summary>
    /// Получение исторических данных на текущую дату
    /// </summary>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<ActionResult<IEnumerable<TDto>>> GetChangeLogCurrent(CancellationToken token);

    /// <summary>
    /// Получение исторических данных на определенную дату
    /// </summary>
    /// <param name="historyMoment"></param>
    /// <param name="token"></param>
    /// <returns></returns>
    Task<ActionResult<IEnumerable<TChangeLogDto>>> GetChangeLogForDate(DateTimeOffset historyMoment, CancellationToken token);

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

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

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

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

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

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