using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; namespace MaddoShared; /// /// Dynamically resolves the concrete IImageCreator implementation at call time /// based on current PicSettings.ImageCreatorProvider. /// On non-Windows platforms only ImageCreatorImageSharp is available. /// public class ImageCreatorMapper : IImageCreator { private readonly IServiceProvider _sp; private readonly PicSettings _settings; private readonly ILogger _logger; public ImageCreatorMapper(IServiceProvider sp, PicSettings settings, ILogger logger) { _sp = sp ?? throw new ArgumentNullException(nameof(sp)); _settings = settings ?? throw new ArgumentNullException(nameof(settings)); _logger = logger; } public Task CreateImageAsync(ImageState imgState, byte[]? logoData) { var provider = (_settings.ImageCreatorProvider ?? "Sharp").Trim(); _logger?.LogDebug("Resolving IImageCreator for provider '{Provider}'", provider); #if WINDOWS return provider.Equals("ALTERNATE", StringComparison.OrdinalIgnoreCase) ? ResolveAndCall(imgState, logoData) : ResolveAndCall(imgState, logoData); #else // GDI is not available on non-Windows — always use ImageSharp return ResolveAndCall(imgState, logoData); #endif } private Task ResolveAndCall(ImageState imgState, byte[]? logoData) where T : IImageCreator { var impl = (IImageCreator?)_sp.GetService(typeof(T)); if (impl is null) { _logger?.LogWarning("Requested image creator {Type} is not registered. Falling back to ImageCreatorImageSharp.", typeof(T).Name); impl = (IImageCreator?)_sp.GetService(typeof(ImageCreatorImageSharp)); } if (impl is null) throw new InvalidOperationException("No IImageCreator implementation is registered."); return impl.CreateImageAsync(imgState, logoData); } }