using System;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudApp.Services
{
    /// <summary>
    /// Сервис выстраивает очередь из фоновых задач. Ограничивает количество одновременно выполняющихся задач.
    /// </summary>
    public interface IBackgroundWorkerService
    {
        /// <summary>
        /// Проверка, есть ли задача в очереди
        /// </summary>
        /// <param name="id">идентификатор задачи</param>
        /// <returns></returns>
        bool Contains(string id);

        /// <summary>
        /// Добавляет в очередь задач новую задачу
        /// </summary>
        /// <param name="id">идентификатор задачи</param>
        /// <param name="func">делегат</param>
        /// <returns>id задачи в очереди</returns>
        string Enqueue(string id, Func<string, CancellationToken, Task> func);

        /// <summary>
        /// Добавляет в очередь задач новую задачу
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        string Enqueue(Func<string, CancellationToken, Task> func);

        /// <summary>
        /// Добавляет в очередь задач новую задачу
        /// </summary>
        /// <param name="id">идентификатор задачи</param>
        /// <param name="func"></param>
        /// <param name="onError"></param>
        /// <returns></returns>
        string Enqueue(string id, Func<string, CancellationToken, Task> func, Func<string, Exception, CancellationToken, Task> onError);

        /// <summary>
        /// Пробуем удалить задачу по идентификатору
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        bool TryRemove(string id);
    }
}