namespace TeleWave.Domain.Broadcast.Scheduling;
/// Шоу канала, подготовленное для планировщика: только готовые серии, с курсором.
public sealed record PlannerShow(
Guid ChannelShowId,
Guid ShowId,
int Weight,
BlockMode BlockMode,
int BlockValue,
IReadOnlyList EpisodeAssetIds,
int NextEpisodeIndex
);
/// Override в терминах планировщика: окно + режим + шоу с весами.
public sealed record PlannerOverride(
DateTimeOffset StartsAtUtc,
DateTimeOffset EndsAtUtc,
OverrideMode Mode,
IReadOnlyList Shows
);
public sealed record PlannerOverrideShow(Guid ShowId, int Weight);
///
/// Политика ТВ-заставок на переходах. Планировщик выбирает блок () по
/// стратегии и резервирует слот его длины (,
/// уже выровнена генератором на сегмент). Конкретный отрендеренный ассет подставляет оркестратор
/// по паре шоу + выбранному блоку.
///
public sealed record PlannerBumperConfig(
bool Enabled,
bool OnlyBetweenDifferentShows,
TimeSpan MinInterval,
BumperSelection Selection,
IReadOnlyList Templates
);
/// Блок заставки в терминах планировщика: id + длительность слота (кратна сегменту).
public sealed record PlannerBumperTemplate(Guid TemplateId, TimeSpan Duration);
/// Полный вход планировщика для одного прогона по каналу.
public sealed record PlannerInput(
Guid ChannelId,
AdInsertion AdInsertion,
int AdsPerBreak,
int NextAdIndex,
IReadOnlyList Shows,
IReadOnlyList AdPool,
IReadOnlyDictionary Durations,
IReadOnlyList Overrides,
DateTimeOffset StartTime,
DateTimeOffset HorizonEnd,
PlannerBumperConfig? Bumpers = null,
int NextBumperIndex = 0
);
///
/// Одна запланированная запись (ещё не доменная сущность). Для заставок ( ==
/// ) пуст — его подставит
/// оркестратор после рендера по паре ( → ) и выбранному
/// блоку ().
///
public sealed record PlannedEntry(
Guid MediaAssetId,
ScheduleEntryKind Kind,
DateTimeOffset StartsAtUtc,
DateTimeOffset EndsAtUtc,
Guid? ShowId,
int? EpisodeIndex,
Guid? FromShowId = null,
Guid? ToShowId = null,
Guid? BumperTemplateId = null
);
/// Результат прогона: новые записи + обновлённые курсоры (серий по каждому ChannelShow, рекламы, заставок).
public sealed record PlannerResult(
IReadOnlyList Entries,
IReadOnlyDictionary NextEpisodeIndexByChannelShow,
int NextAdIndex,
int NextBumperIndex
);