using System.Collections.Generic;
using AsbCloudApp.Data;
using AsbCloudApp.Requests;
using AsbCloudApp.Services;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudApp.Repositories;

/// <summary>
/// Репозиторий для уведомлений
/// </summary>
public interface INotificationRepository : ICrudRepository<NotificationDto>
{
	/// <summary>
	/// Получение уведомлений по параметрам
	/// </summary>
	/// <param name="idUser"></param>
	/// <param name="request"></param>
	/// <param name="cancellationToken"></param>
	/// <returns></returns>
	Task<PaginationContainer<NotificationDto>> GetNotificationsAsync(int idUser,
		NotificationRequest request,
		CancellationToken cancellationToken);

	/// <summary>
	/// Получение всех уведомлений
	/// </summary>
	/// <param name="idUser"></param>
	/// <param name="isSent"></param>
	/// <param name="idTransportType"></param>
	/// <param name="cancellationToken"></param>
	/// <returns></returns>
	Task<IEnumerable<NotificationDto>> GetAllAsync(int? idUser, bool? isSent, int? idTransportType, 
		CancellationToken cancellationToken);

	/// <summary>
	/// Обновление уведомлений
	/// </summary>
	/// <param name="notifications"></param>
	/// <param name="cancellationToken"></param>
	/// <returns></returns>
	Task<int> UpdateRangeAsync(IEnumerable<NotificationDto> notifications, CancellationToken cancellationToken);
	
	/// <summary>
	/// Удаление уведомлений по параметрам
	/// </summary>
	/// <param name="request"></param>
	/// <param name="cancellationToken"></param>
	/// <returns></returns>
	Task<int> DeleteAsync(NotificationDeleteRequest request, 
		CancellationToken cancellationToken);

    /// <summary>
    /// Получение количества непрочтенных уведомлений
    /// </summary>
    /// <param name="idUser"></param>
	/// <param name="idTransportType"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<int> GetUnreadCountAsync(int idUser, int idTransportType, CancellationToken cancellationToken);
}