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