using PARR.Core.Services.NextRunServices.Models;

namespace PARR.Core.Services.NextRunServices.Subservices
{
    internal interface ITemplateDistributor
    {
        /// <summary>
        /// Распределить шаблоны
        /// </summary>
        /// <param name="startDate">Дата начала, в любом часовом поясе</param>
        /// <param name="duration"></param>
        /// <param name="referenceDate"></param>
        /// <param name="offset"></param>
        /// <param name="allTemplates"></param>
        /// <param name="excludeWeekends"></param>
        /// <returns></returns>
        Task<List<TemplateNextRunResultDto>> DistributeTemplatesAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, TimeSpan? offset, List<TemplateNextRunDto> allTemplates, bool excludeWeekends);

        /// <summary>
        /// Метод проверяет, актуален ли текущий NextRun шаблона, если не актуален, возвращает актуальное значение 
        /// При проверке загружаются шаблоны из БД! Если хотим рассчитывать nextRun для НЕСКОЛЬКИХ шаблонов, то следует рассчитать nextRun для одного шаблона, сохранить в БД, затем рассчитать для следующего
        /// </summary>
        /// <param name="startDate">Дата начала, в любом часовом поясе</param>
        /// <param name="duration"></param>
        /// <param name="referenceDate"></param>
        /// <param name="offset"></param>
        /// <param name="targetTemplate"></param>
        /// <param name="allTemplates"></param>
        /// <param name="excludeWeekends"></param>
        /// <param name="isNew"></param>
        /// <returns></returns>
        Task<TemplateNextRunResultDto> GetNextRunForTemplateAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, TimeSpan? offset, TemplateNextRunDto targetTemplate, List<TemplateNextRunDto> allTemplates, bool excludeWeekends, bool isNew);

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

        /// <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);
    }
}
