namespace TeleWave.Domain.Library; /// /// Переиспользуемое шоу в общей библиотеке: сериал (упорядоченные серии) либо полнометражка. /// Серии идут строго в порядке ; курсор показа на канале хранится /// отдельно на связке канал↔шоу (см. Broadcast/ChannelShow). /// public class Show { private readonly List _episodes = new(); public Guid Id { get; private set; } public string Name { get; private set; } = string.Empty; public string? Description { get; private set; } public ShowKind Kind { get; private set; } public DateTimeOffset CreatedAt { get; private set; } /// Серии шоу (backing-field для EF). Порядок показа — по ; /// потребители сортируют явно (см. загрузчик планировщика). public IReadOnlyList Episodes => _episodes; private Show() { } public static Show Create(string name, ShowKind kind, string? description = null) => new() { Id = Guid.NewGuid(), Name = name, Kind = kind, Description = description, CreatedAt = DateTimeOffset.UtcNow, }; public void Rename(string name, string? description) { Name = name; Description = description; } /// Добавляет серию в конец. Для допустима ровно одна серия. public ShowEpisode AddEpisode(Guid mediaAssetId) { var nextPosition = _episodes.Count == 0 ? 0 : _episodes.Max(e => e.Position) + 1; var episode = ShowEpisode.Create(Id, mediaAssetId, nextPosition); _episodes.Add(episode); return episode; } public bool RemoveEpisode(Guid episodeId) { var episode = _episodes.FirstOrDefault(e => e.Id == episodeId); if (episode is null) return false; _episodes.Remove(episode); return true; } public bool CanAddEpisode => Kind != ShowKind.Single || _episodes.Count == 0; }