using Forwarder.Domain;
using Forwarder.Models;

namespace Forwarder.Repositories;

/// <summary>
/// Интерфейс репозитория для работы с сообщениями.
/// </summary>
public interface IMessageRepository
{
	/// <summary>
	/// Добавляет сообщение в репозиторий.
	/// </summary>
	/// <param name="message"> Сообщение. </param>
	/// <param name="cancellationToken"> Токен отмены. </param>
	/// <returns>A <see cref="Task"/> representing the result of the asynchronous operation.</returns>
	Task<Result> AddAsync(Message message, CancellationToken cancellationToken);

	/// <summary>
	/// Получает первые <paramref name="takeCount"/> сообщений из репозитория.
	/// </summary>
	/// <param name="takeCount">Размер пачки сообщений.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<List<Message>> GetFirstListAsync(int takeCount, CancellationToken cancellationToken);

	/// <summary>
	/// Удаляет сообщение из репозитория.
	/// </summary>
	/// <param name="message">Сообщение.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result> RemoveAsync(Message message, CancellationToken cancellationToken);

	/// <summary>
	/// Удаляет сообщения из репозитория.
	/// </summary>
	/// <param name="messageIdList">Список ID сообщений.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result> RemoveBatch(List<Guid> messageIdList, CancellationToken cancellationToken);
}
