using Microsoft.Extensions.Logging;
using PARR.Core.Common.Interfaces;
using PARR.Core.Repositories.Interfaces.TaskRepositories;
using PARR.Core.Services.Workload.Implementations;
using PARR.Domain.Entities.TaskEntities;
using PARR.Domain.Enums;

namespace PARR.Core.Services.TaskServices.Handlers
{
    /// <summary>
    /// Обработчик задачи формирования отчета по загруженности (формирование КЭШ).
    /// Формируется КЭШ шаблонов с ЗО и РГ
    /// </summary>
    public class WorkloadReportHandler : BaseTaskHandler
    {
        private readonly WorkloadCacheService workloadCacheService;

        public WorkloadReportHandler(
            ITaskRepository taskRepository,
            ITaskErrorRepository taskErrorRepository,
            ILogger<WorkloadReportHandler> logger,
            WorkloadCacheService workloadCacheService)
            : base(taskRepository, taskErrorRepository, logger)
        {
            this.workloadCacheService = workloadCacheService;
        }

        public override TaskTypeEnum SupportedType => TaskTypeEnum.Workload;

        protected override async Task<HandlerResult> ExecuteInternalAsync(TaskItem task)
        {
            logger.LogInformation("Генерация КЭШ для workload, taskId: {TaskId}", task.Id);

            // 1. Десериализуем Payload
            //var payload = string.IsNullOrEmpty(task.Payload)
            //   ? new ReportPayload()
            //   : JsonSerializer.Deserialize<ReportPayload>(task.Payload);

            // тут логика построения отчета


            // Создаём прогресс-репортер
            var progress = new ProgressAsync<int>(async percent =>
            {
                await UpdateProgressAsync(task.Id, percent);
                logger.LogDebug("Процент выполнения: {Percent}%", percent);
            });


            await workloadCacheService.DeleteWorkloadCacheAsync();
            await workloadCacheService.DeleteTemplateCacheAsync();
            await workloadCacheService.CreateTemplateCacheAsync(progress);

            //await System.Threading.Tasks.Task.CompletedTask;

            return HandlerResult.Success();

            //return HandlerResult.Failure("Тут капец какая ошибка! Просто жуть", new Exception("А это я создал эксепшен!!!"));
        }

        protected override Task OnSuccessAsync(TaskItem task, HandlerResult result)
        {
            // Пример хука: отправка уведомления после успеха
            return base.OnSuccessAsync(task, result);
        }
    }
}
