using TeleWave.Domain.Programming; namespace TeleWave.Application.Programming.Templates.Generate; /// Что делать с тем, что в сетке уже есть. public enum GridGenerationMode { /// Только незакрытые интервалы; ручные слоты не трогаются. FillGaps = 0, /// Снести все слоты шаблона и построить неделю заново. Rebuild = 1, } /// Куда ложится слот. Имена слоёв — в . public enum GridPlanLayer { Main = 0, Weekend = 1, } /// /// Будущий слот: то же, что , но без слоя и идентификаторов. Сравнивается /// по значению — на этом держится схлопывание одинаковых дней в один слот «каждый день». /// public sealed record PlannedSlot( GridPlanLayer Layer, int? Weekday, TimeOnly Start, int DurationMinutes, string Title, Daypart Daypart, SlotKind SlotKind, Guid? GroupId, string? GroupName, SlotBlockMode BlockMode, int BlockValue, SlotStrategy? Strategy, RepeatSource? RepeatSource, /// Жёсткий старт. Ставится в начале прайма: кино должно начинаться в объявленное время. bool IsAnchor ); /// /// Результат разбора: что будет создано, что снесено и о чём стоит знать заранее. Считается и для /// предпросмотра, и для самой генерации — одним и тем же кодом, поэтому показанное совпадает /// с созданным. /// /// Сколько минут недели генератор считал свободными. /// Сколько из них закрыто слотами плана. public sealed record GridPlan( GridProfile Profile, GridGenerationMode Mode, IReadOnlyList Slots, IReadOnlyList Notes, int SlotsToRemove, Guid? FallbackGroupId, string? FallbackGroupName, int FreeMinutes, int CoveredMinutes );