using Common.Configuration; using Common.Configuration.Arr; using Common.Configuration.ContentBlocker; using Common.Configuration.DownloadCleaner; using Common.Configuration.DownloadClient; using Common.Configuration.IgnoredDownloads; using Common.Configuration.QueueCleaner; using Microsoft.Extensions.Logging; namespace Infrastructure.Configuration; /// /// Provides configuration management for various components with thread-safe file access. /// public interface IConfigManager { // Configuration files - Async methods Task GetConfigurationAsync(string configFileName) where T : class, new(); Task SaveConfigurationAsync(string configFileName, T config) where T : class; Task UpdateConfigurationPropertyAsync(string configFileName, string propertyPath, T value); Task MergeConfigurationAsync(string configFileName, T newValues) where T : class; Task DeleteConfigurationAsync(string configFileName); IEnumerable ListConfigurationFiles(); // Configuration files - Sync methods T? GetConfiguration(string configFileName) where T : class, new(); bool SaveConfiguration(string configFileName, T config) where T : class; bool UpdateConfigurationProperty(string configFileName, string propertyPath, T value); bool MergeConfiguration(string configFileName, T newValues) where T : class; bool DeleteConfiguration(string configFileName); // Specific configuration types - Async methods Task GetSonarrConfigAsync(); Task GetRadarrConfigAsync(); Task GetLidarrConfigAsync(); Task GetContentBlockerConfigAsync(); Task GetQueueCleanerConfigAsync(); Task GetDownloadCleanerConfigAsync(); Task GetDownloadClientConfigAsync(); Task GetIgnoredDownloadsConfigAsync(); Task SaveSonarrConfigAsync(SonarrConfig config); Task SaveRadarrConfigAsync(RadarrConfig config); Task SaveLidarrConfigAsync(LidarrConfig config); Task SaveContentBlockerConfigAsync(ContentBlockerConfig config); Task SaveQueueCleanerConfigAsync(QueueCleanerConfig config); Task SaveDownloadCleanerConfigAsync(DownloadCleanerConfig config); Task SaveDownloadClientConfigAsync(DownloadClientConfig config); Task SaveIgnoredDownloadsConfigAsync(IgnoredDownloadsConfig config); // Specific configuration types - Sync methods SonarrConfig? GetSonarrConfig(); RadarrConfig? GetRadarrConfig(); LidarrConfig? GetLidarrConfig(); ContentBlockerConfig? GetContentBlockerConfig(); QueueCleanerConfig? GetQueueCleanerConfig(); DownloadCleanerConfig? GetDownloadCleanerConfig(); DownloadClientConfig? GetDownloadClientConfig(); IgnoredDownloadsConfig? GetIgnoredDownloadsConfig(); bool SaveSonarrConfig(SonarrConfig config); bool SaveRadarrConfig(RadarrConfig config); bool SaveLidarrConfig(LidarrConfig config); bool SaveContentBlockerConfig(ContentBlockerConfig config); bool SaveQueueCleanerConfig(QueueCleanerConfig config); bool SaveDownloadCleanerConfig(DownloadCleanerConfig config); bool SaveDownloadClientConfig(DownloadClientConfig config); bool SaveIgnoredDownloadsConfig(IgnoredDownloadsConfig config); } public class ConfigManager : IConfigManager { private readonly ILogger _logger; private readonly JsonConfigurationProvider _configProvider; // Define standard config file names private const string SonarrConfigFile = "sonarr.json"; private const string RadarrConfigFile = "radarr.json"; private const string LidarrConfigFile = "lidarr.json"; private const string ContentBlockerConfigFile = "contentblocker.json"; private const string QueueCleanerConfigFile = "queuecleaner.json"; private const string DownloadCleanerConfigFile = "downloadcleaner.json"; private const string DownloadClientConfigFile = "downloadclient.json"; private const string IgnoredDownloadsConfigFile = "ignoreddownloads.json"; public ConfigManager( ILogger logger, JsonConfigurationProvider configProvider) { _logger = logger; _configProvider = configProvider; } // Generic configuration methods public Task GetConfigurationAsync(string configFileName) where T : class, new() { return _configProvider.ReadConfigurationAsync(configFileName); } public Task SaveConfigurationAsync(string configFileName, T config) where T : class { // Validate if it's an IConfig if (config is IConfig configurable) { try { configurable.Validate(); } catch (Exception ex) { _logger.LogError(ex, "Configuration validation failed for {fileName}", configFileName); return Task.FromResult(false); } } return _configProvider.WriteConfigurationAsync(configFileName, config); } public Task UpdateConfigurationPropertyAsync(string configFileName, string propertyPath, T value) { return _configProvider.UpdateConfigurationPropertyAsync(configFileName, propertyPath, value); } public Task MergeConfigurationAsync(string configFileName, T newValues) where T : class { return _configProvider.MergeConfigurationAsync(configFileName, newValues); } public Task DeleteConfigurationAsync(string configFileName) { return _configProvider.DeleteConfigurationAsync(configFileName); } public IEnumerable ListConfigurationFiles() { return _configProvider.ListConfigurationFiles(); } // Specific configuration type methods public async Task GetSonarrConfigAsync() { return await _configProvider.ReadConfigurationAsync(SonarrConfigFile); } public async Task GetRadarrConfigAsync() { return await _configProvider.ReadConfigurationAsync(RadarrConfigFile); } public async Task GetLidarrConfigAsync() { return await _configProvider.ReadConfigurationAsync(LidarrConfigFile); } public async Task GetContentBlockerConfigAsync() { return await _configProvider.ReadConfigurationAsync(ContentBlockerConfigFile); } public ContentBlockerConfig? GetContentBlockerConfig() { return _configProvider.ReadConfiguration(ContentBlockerConfigFile); } public async Task GetQueueCleanerConfigAsync() { return await _configProvider.ReadConfigurationAsync(QueueCleanerConfigFile); } public async Task GetDownloadCleanerConfigAsync() { return await _configProvider.ReadConfigurationAsync(DownloadCleanerConfigFile); } public async Task GetDownloadClientConfigAsync() { return await _configProvider.ReadConfigurationAsync(DownloadClientConfigFile); } public async Task GetIgnoredDownloadsConfigAsync() { return await _configProvider.ReadConfigurationAsync(IgnoredDownloadsConfigFile); } public Task SaveSonarrConfigAsync(SonarrConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(SonarrConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Sonarr configuration validation failed"); return Task.FromResult(false); } } public Task SaveRadarrConfigAsync(RadarrConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(RadarrConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Radarr configuration validation failed"); return Task.FromResult(false); } } public Task SaveLidarrConfigAsync(LidarrConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(LidarrConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Lidarr configuration validation failed"); return Task.FromResult(false); } } public Task SaveContentBlockerConfigAsync(ContentBlockerConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(ContentBlockerConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "ContentBlocker configuration validation failed"); return Task.FromResult(false); } } public Task SaveQueueCleanerConfigAsync(QueueCleanerConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(QueueCleanerConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "QueueCleaner configuration validation failed"); return Task.FromResult(false); } } public Task SaveDownloadCleanerConfigAsync(DownloadCleanerConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(DownloadCleanerConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "DownloadCleaner configuration validation failed"); return Task.FromResult(false); } } public Task SaveDownloadClientConfigAsync(DownloadClientConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(DownloadClientConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "DownloadClient configuration validation failed"); return Task.FromResult(false); } } public Task SaveIgnoredDownloadsConfigAsync(IgnoredDownloadsConfig config) { try { return _configProvider.WriteConfigurationAsync(IgnoredDownloadsConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "IgnoredDownloads configuration save failed"); return Task.FromResult(false); } } // Generic synchronous configuration methods public T? GetConfiguration(string fileName) where T : class, new() { return _configProvider.ReadConfiguration(fileName); } public QueueCleanerConfig? GetQueueCleanerConfig() { return GetConfiguration("queue-cleaner.json"); } public bool SaveConfiguration(string configFileName, T config) where T : class { // Validate if it's an IConfig if (config is IConfig configurable) { try { configurable.Validate(); } catch (Exception ex) { _logger.LogError(ex, "Configuration validation failed for {fileName}", configFileName); return false; } } return _configProvider.WriteConfiguration(configFileName, config); } public bool UpdateConfigurationProperty(string configFileName, string propertyPath, T value) { return _configProvider.UpdateConfigurationProperty(configFileName, propertyPath, value); } public bool MergeConfiguration(string configFileName, T newValues) where T : class { return _configProvider.MergeConfiguration(configFileName, newValues); } public bool DeleteConfiguration(string configFileName) { return _configProvider.DeleteConfiguration(configFileName); } // Specific synchronous configuration methods for typed configs public SonarrConfig? GetSonarrConfig() { return _configProvider.ReadConfiguration(SonarrConfigFile); } public RadarrConfig? GetRadarrConfig() { return _configProvider.ReadConfiguration(RadarrConfigFile); } public LidarrConfig? GetLidarrConfig() { return _configProvider.ReadConfiguration(LidarrConfigFile); } public DownloadCleanerConfig? GetDownloadCleanerConfig() { return _configProvider.ReadConfiguration(DownloadCleanerConfigFile); } public DownloadClientConfig? GetDownloadClientConfig() { return _configProvider.ReadConfiguration(DownloadClientConfigFile); } public IgnoredDownloadsConfig? GetIgnoredDownloadsConfig() { return _configProvider.ReadConfiguration(IgnoredDownloadsConfigFile); } public bool SaveSonarrConfig(SonarrConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(SonarrConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Sonarr configuration validation failed"); return false; } } public bool SaveRadarrConfig(RadarrConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(RadarrConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Radarr configuration validation failed"); return false; } } public bool SaveLidarrConfig(LidarrConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(LidarrConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Lidarr configuration validation failed"); return false; } } public bool SaveContentBlockerConfig(ContentBlockerConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(ContentBlockerConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "ContentBlocker configuration validation failed"); return false; } } public bool SaveQueueCleanerConfig(QueueCleanerConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(QueueCleanerConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "QueueCleaner configuration validation failed"); return false; } } public bool SaveDownloadCleanerConfig(DownloadCleanerConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(DownloadCleanerConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "DownloadCleaner configuration validation failed"); return false; } } public bool SaveDownloadClientConfig(DownloadClientConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(DownloadClientConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "DownloadClient configuration validation failed"); return false; } } public bool SaveIgnoredDownloadsConfig(IgnoredDownloadsConfig config) { try { return _configProvider.WriteConfiguration(IgnoredDownloadsConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "IgnoredDownloads configuration save failed"); return false; } } }