using PARR.Core.Services.NextRunServices.Models;
using PARR.Domain.Entities.Job;
using PARR.Domain.Enums;

namespace PARR.Core.Services.NextRunServices
{
    public interface INextRunService
    {
        /// <summary>
        /// Распределить шаблоны в группе работ (получить список распределенных шаблонов с актуальными nextRun)
        /// </summary>
        /// <param name="jobGroupId">ИД группы работ</param>
        /// <param name="templateStatusType">Статус шаблона, если не передать, берутся все шаблоны группы</param>
        /// <returns>Список TemplateId с NextRun и NextRunOld</returns>
        Task<List<TemplateNextRunResultDto>?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId, TemplateStatusTypeEnum? templateStatusType);


        /// <summary>
        /// Получить nextRun для вновь создаваемого шаблона, которого еще нет в БД
        /// </summary>
        /// <param name="jobGroupId">ИД группы работ</param>
        /// <param name="workGroupName">Рабочая группа, не маска</param>
        /// <param name="responseAreaName">Зона ответственности, не маска</param>
        /// <returns>NextRun или null, если null - то ошибка</returns>
        Task<DateTimeOffset?> GetNextRunForNewTemplateAsync(Guid jobGroupId, string workGroupName, string responseAreaName);


        /// <summary>
        /// Получить nextRun по id существующего в БД шаблона
        /// </summary>
        /// <param name="templateId">ИД шаблона</param>
        /// <param name="isNew">При перемещении шаблона в новую для него работу, ставить isNew=true</param>
        /// <returns>NextRun или null, если null - то ошибка</returns>
        Task<DateTimeOffset?> GetNextRunForTemplateAsync(Guid templateId, bool isNew);

        /// <summary>
        /// Получить часовой пояс УЗ ЕСПП
        /// </summary>
        /// <returns></returns>
        TimeSpan GetEsppAccountOffset();

        /// <summary>
        /// Получить продолжительность в днях
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        int GetDurationDays(JobGroupDistributionConfig config);

        /// <summary>
        /// Получить список рабочих дней в диапазоне, исключая выходные и праздники.
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="excludeWeekends">Исключить выходные и праздники</param>
        /// <returns></returns>
        Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends);

        /// <summary>
        /// Получить список выходных дней
        /// </summary>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        Task<HashSet<DateOnly>> GetWeekendsAsync(DateOnly startDate, DateOnly endDate);
    }
}
