using Common.Configuration; using Common.Configuration.Arr; using Common.Configuration.ContentBlocker; using Common.Configuration.DownloadCleaner; using Common.Configuration.DownloadClient; using Common.Configuration.General; using Common.Configuration.IgnoredDownloads; using Common.Configuration.Notification; using Common.Configuration.QueueCleaner; using Microsoft.Extensions.Logging; namespace Infrastructure.Configuration; 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 = "content_blocker.json"; private const string QueueCleanerConfigFile = "queue_cleaner.json"; private const string DownloadCleanerConfigFile = "download_cleaner.json"; private const string DownloadClientConfigFile = "download_client.json"; private const string IgnoredDownloadsConfigFile = "ignored_downloads.json"; private const string GeneralSettings = "general.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 GetGeneralConfigAsync() { return await _configProvider.ReadConfigurationAsync(GeneralSettings); } 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 async Task GetNotificationsConfigAsync() { return await _configProvider.ReadConfigurationAsync(GeneralSettings); } 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 SaveGeneralConfigAsync(GeneralConfig config) { try { config.Validate(); return _configProvider.WriteConfigurationAsync(GeneralSettings, config); } catch (Exception ex) { _logger.LogError(ex, "General configuration validation failed"); return Task.FromResult(false); } } 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); } } public Task SaveNotificationsConfigAsync(NotificationsConfig config) { try { return _configProvider.WriteConfigurationAsync(GeneralSettings, config); } catch (Exception ex) { _logger.LogError(ex, "Notifications 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 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 GeneralConfig? GetGeneralConfig() { return _configProvider.ReadConfiguration(GeneralSettings); } public SonarrConfig? GetSonarrConfig() { return _configProvider.ReadConfiguration(SonarrConfigFile); } public RadarrConfig? GetRadarrConfig() { return _configProvider.ReadConfiguration(RadarrConfigFile); } public LidarrConfig? GetLidarrConfig() { return _configProvider.ReadConfiguration(LidarrConfigFile); } public QueueCleanerConfig? GetQueueCleanerConfig() { return GetConfiguration(QueueCleanerConfigFile); } public ContentBlockerConfig? GetContentBlockerConfig() { return _configProvider.ReadConfiguration(ContentBlockerConfigFile); } public DownloadCleanerConfig? GetDownloadCleanerConfig() { return _configProvider.ReadConfiguration(DownloadCleanerConfigFile); } public DownloadClientConfig? GetDownloadClientConfig() { return _configProvider.ReadConfiguration(DownloadClientConfigFile); } public IgnoredDownloadsConfig? GetIgnoredDownloadsConfig() { return _configProvider.ReadConfiguration(IgnoredDownloadsConfigFile); } public NotificationsConfig? GetNotificationsConfig() { return _configProvider.ReadConfiguration(GeneralSettings); } public bool SaveGeneralConfig(GeneralConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(GeneralSettings, config); } catch (Exception ex) { _logger.LogError(ex, "General configuration validation failed"); return false; } } 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; } } public bool SaveNotificationsConfig(NotificationsConfig config) { try { return _configProvider.WriteConfiguration(GeneralSettings, config); } catch (Exception ex) { _logger.LogError(ex, "Notifications configuration save failed"); return false; } } }