namespace TeleWave.Domain.Broadcast; /// /// Подблок заставки (текст-вариант) внутри . Наследует от блока звук, /// стиль и шрифт, но задаёт собственный набор строк, фон и правило показа (). /// Позволяет иметь несколько текстов на одной музыке/оформлении, не дублируя блок. /// public class BumperTextVariant { private readonly List _lines = []; public Guid Id { get; private set; } public Guid BumperTemplateId { get; private set; } public int Position { get; private set; } public string Name { get; private set; } = string.Empty; public BumperTrigger Trigger { get; private set; } /// Источник картинки под текстом. public BumperBackground Background { get; private set; } /// Вес при выборе подблока на переходе (0 — не выбирается никогда). public int Weight { get; private set; } = DefaultWeight; public DateTimeOffset CreatedAt { get; private set; } public const int DefaultWeight = 1; /// Строки в порядке показа сверху вниз. public IReadOnlyList Lines => _lines; private BumperTextVariant() { } internal static BumperTextVariant Create( Guid bumperTemplateId, int position, string name, BumperTrigger trigger ) => new() { Id = Guid.NewGuid(), BumperTemplateId = bumperTemplateId, Position = position, Name = name, Trigger = trigger, Background = BumperBackground.NextPoster, Weight = DefaultWeight, CreatedAt = DateTimeOffset.UtcNow, }; public void Update(string name, BumperTrigger trigger, BumperBackground background, int weight) { Name = name; Trigger = trigger; Background = background; Weight = Math.Max(0, weight); } /// /// Заменяет набор строк целиком. Построчных команд намеренно нет: редактор всегда знает весь /// список, а порядок задаётся перетаскиванием — три команды вместо одной ничего бы не дали. /// public void SetLines(IEnumerable lines) { _lines.Clear(); var position = 0; foreach (var line in lines) _lines.Add(BumperLine.Create(position++, line.Style, line.Color, line.Text)); } /// Подходит ли подблок для перехода: — сменилось ли шоу. public bool Matches(bool isShowChange) => Trigger switch { BumperTrigger.OnShowChange => isShowChange, BumperTrigger.BetweenEpisodes => !isShowChange, _ => true, }; }