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

namespace AsbCloudInfrastructure.Background
{
#nullable enable
    /// <summary>
    /// Класс разовой работы.
    /// Разовая работа приоритетнее периодической.
    /// </summary>
    public class WorkBase
    {
        /// <summary>
        /// Идентификатор работы. Должен быть уникальным. Используется в логах и передается в колбэки.
        /// </summary>
        public string Id { get; private set; }

        /// <summary>
        /// Делегат работы.
        /// <para>
        /// Параметры:
        ///   <list type="number">
        ///     <item>
        ///         <term>string</term>
        ///         <description>Id Идентификатор работы</description>
        ///     </item>
        ///     <item>
        ///         <term>IServiceProvider</term>
        ///         <description>Поставщик сервисов</description>
        ///     </item>
        ///     <item>
        ///         <term>CancellationToken</term>
        ///         <description>Токен отмены задачи</description>
        ///     </item>
        ///   </list>
        /// </para>
        /// </summary>
        internal Func<string, IServiceProvider, CancellationToken, Task> ActionAsync { get; set; }

        /// <summary>
        /// Делегат обработки ошибки.
        /// Не должен выполняться долго.
        /// </summary>
        public Func<string, Exception, CancellationToken, Task>? OnErrorAsync { get; set; }

        /// <summary>
        /// максимально допустимое время выполнения работы
        /// </summary>
        public TimeSpan Timeout { get; set; } = TimeSpan.FromMinutes(1);

        /// <summary>
        /// Фактическое время успешного выполнения работы
        /// </summary>
        public TimeSpan? ExecutionTime { get; internal set; }

        /// <summary>
        /// Время последнего запуска
        /// </summary>
        public DateTime LastStart { get; set; }

        public WorkBase(string id, Func<string, IServiceProvider, CancellationToken, Task> actionAsync)
        {
            Id = id;
            ActionAsync = actionAsync;
        }
    }
#nullable disable
}