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 IConfigurationProvider _configProvider; // Define settings subdirectory private const string SettingsDirectory = "settings"; // Define standard config file names with cross-platform paths private readonly string _generalConfigFile = Path.Combine(SettingsDirectory, "general.json"); private readonly string _sonarrConfigFile = Path.Combine(SettingsDirectory, "sonarr.json"); private readonly string _radarrConfigFile = Path.Combine(SettingsDirectory, "radarr.json"); private readonly string _lidarrConfigFile = Path.Combine(SettingsDirectory, "lidarr.json"); private readonly string _contentBlockerConfigFile = Path.Combine(SettingsDirectory, "content_blocker.json"); private readonly string _queueCleanerConfigFile = Path.Combine(SettingsDirectory, "queue_cleaner.json"); private readonly string _downloadCleanerConfigFile = Path.Combine(SettingsDirectory, "download_cleaner.json"); private readonly string _downloadClientConfigFile = Path.Combine(SettingsDirectory, "download_client.json"); private readonly string _ignoredDownloadsConfigFile = Path.Combine(SettingsDirectory, "ignored_downloads.json"); private readonly string _notificationsConfigFile = Path.Combine(SettingsDirectory, "notifications.json"); public ConfigManager( ILogger logger, IConfigurationProvider 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(_generalConfigFile); } 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(_notificationsConfigFile); } 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(_generalConfigFile, 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(_notificationsConfigFile, 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(_generalConfigFile); } 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(_notificationsConfigFile); } public bool SaveGeneralConfig(GeneralConfig config) { try { config.Validate(); return _configProvider.WriteConfiguration(_generalConfigFile, 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(_notificationsConfigFile, config); } catch (Exception ex) { _logger.LogError(ex, "Notifications configuration save failed"); return false; } } }