using Common.Configuration; using Common.Enums; using Infrastructure.Verticals.DownloadClient.Deluge; using Infrastructure.Verticals.DownloadClient.QBittorrent; using Infrastructure.Verticals.DownloadClient.Transmission; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace Infrastructure.Verticals.DownloadClient; /// /// Factory responsible for creating download client service instances /// public sealed class DownloadServiceFactory { private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; public DownloadServiceFactory( IServiceProvider serviceProvider, ILogger logger) { _serviceProvider = serviceProvider; _logger = logger; } // /// // /// Creates a download service using the specified client ID // /// // /// The client ID to create a service for // /// An implementation of IDownloadService or null if the client is not available // public IDownloadService? GetDownloadService(Guid clientId) // { // var config = _configManager.GetConfiguration(); // var clientConfig = config.GetClientConfig(clientId); // // if (clientConfig == null) // { // _logger.LogWarning("No download client configuration found for ID {clientId}", clientId); // return null; // } // // if (!clientConfig.Enabled) // { // _logger.LogWarning("Download client {clientId} is disabled", clientId); // return null; // } // // return GetDownloadService(clientConfig); // } /// /// Creates a download service using the specified client configuration /// /// The client configuration to use /// An implementation of IDownloadService or null if the client is not available public IDownloadService GetDownloadService(DownloadClientConfig downloadClientConfig) { if (!downloadClientConfig.Enabled) { _logger.LogWarning("Download client {clientId} is disabled, but a service was requested", downloadClientConfig.Id); } return downloadClientConfig.TypeName switch { DownloadClientTypeName.QBittorrent => CreateClientService(downloadClientConfig), DownloadClientTypeName.Deluge => CreateClientService(downloadClientConfig), DownloadClientTypeName.Transmission => CreateClientService(downloadClientConfig), _ => throw new NotSupportedException($"Download client type {downloadClientConfig.TypeName} is not supported") }; } /// /// Creates a download client service for a specific client type /// /// The type of download service to create /// The client configuration /// An implementation of IDownloadService private T CreateClientService(DownloadClientConfig downloadClientConfig) where T : IDownloadService { var service = _serviceProvider.GetRequiredService(); service.Initialize(downloadClientConfig); return service; } }