using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Core.Scheduling.YamlScheduling.Models; using Microsoft.Extensions.Logging; namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers; public class YamlPlayoutGraphicsOffHandler(IGraphicsElementRepository graphicsElementRepository) : IYamlPlayoutHandler { private readonly Dictionary> _graphicsElementCache = new(); public bool Reset => false; public async Task Handle( YamlPlayoutContext context, YamlPlayoutInstruction instruction, PlayoutBuildMode mode, Func executeSequence, ILogger logger, CancellationToken cancellationToken) { if (instruction is not YamlPlayoutGraphicsOffInstruction graphicsOff) { return false; } if (string.IsNullOrWhiteSpace(graphicsOff.GraphicsOff)) { context.ClearGraphicsElements(); } else { foreach (var ge in await GetGraphicsElementByPath(graphicsOff.GraphicsOff)) { context.RemoveGraphicsElement(ge.Id); } } return true; } private async Task> GetGraphicsElementByPath(string path) { if (_graphicsElementCache.TryGetValue(path, out var cachedGraphicsElement)) { foreach (GraphicsElement graphicsElement in cachedGraphicsElement) { return graphicsElement; } } else { Option maybeGraphicsElement = await graphicsElementRepository.GetGraphicsElementByPath(path); _graphicsElementCache.Add(path, maybeGraphicsElement); foreach (GraphicsElement graphicsElement in maybeGraphicsElement) { return graphicsElement; } } return Option.None; } }