using Forwarder.Domain;
using Forwarder.Models;

namespace Forwarder.Repositories;

/// <summary>
/// Интерфейс репозитория для работы с маппингом идентификаторов объектов.
/// </summary>
public interface IAssetMapRepository
{
	/// <summary>
	/// Добавляет маппинг в репозиторий.
	/// </summary>
	/// <param name="abonent"> Абонент. </param>
	/// <param name="assetId"> Идентификатор объекта. </param>
	/// <param name="cancellationToken"> Токен отмены. </param>
	/// <returns>A <see cref="Task"/> representing the result of the asynchronous operation.</returns>
	Task<Result<AssetMap>> AddAsync(string abonent, Guid? assetId = null, CancellationToken cancellationToken = default);

	/// <summary>
	/// Получает маппинги со обязательными заполненными идентификаторами объектов по списку абонентов.
	/// Если маппинги не существуют, то создает их.
	/// </summary>
	/// <param name="abonentList">Список абонентов.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result<List<AssetMap>>> GetRequiredMapsAndCreateIsNewAsync(IEnumerable<string> abonentList, CancellationToken cancellationToken);

	/// <summary>
	/// Возвращает страницу таблицы с маппингами.
	/// </summary>
	/// <param name="request">Запрос.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result<ITableStateResponse<AssetMap>>> GetTable(ITableStateRequest request, CancellationToken cancellationToken);

	/// <summary>
	/// Возвращает страницу таблицы с маппингами.
	/// </summary>
	/// <param name="query">Запрос на выборку.</param>
	/// <param name="request">Запрос.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result<ITableStateResponse<AssetMap>>> GetTable(IQueryable<AssetMap> query, ITableStateRequest request, CancellationToken cancellationToken);

	/// <summary>
	/// Обновляет маппинг.
	/// </summary>
	/// <param name="id">Идентификатор.</param>
	/// <param name="assetId">Идентификатор объекта.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result> UpdateAsync(Guid id, Guid? assetId, CancellationToken cancellationToken);

	/// <summary>
	/// Обновляет статус онлайн.
	/// </summary>
	/// <param name="id">Идентификатор.</param>
	/// <param name="isOnline">Статус онлайн.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result> UpdateIsOnlineStatusAsync(
		Guid id,
		bool isOnline,
		CancellationToken cancellationToken);

	/// <summary>
	/// Возвращает маппинг по идентификатору.
	/// </summary>
	/// <param name="id">Идентификатор.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	Task<Result<AssetMap>> Get(Guid id, CancellationToken cancellationToken);

	/// <summary>
	/// Возвращает запрос на получение маппингов.
	/// </summary>
	IQueryable<AssetMap> GetQuery();

	/// <summary>
	/// Удаляет маппинг.
	/// </summary>
	/// <param name="id">Идентификатор.</param>
	/// <param name="cancellationToken">Токен отмены.</param>
	/// <returns>Результат удаления.</returns>
	/// <remarks>Если удаление прошло успешно, возвращает Result без значения.</remarks>
	Task<Result> DeleteAsync(Guid id, CancellationToken cancellationToken);
}
