using RobotNet10.CustomConfiguration.Events; using RobotNet10.CustomConfiguration.Models; namespace RobotNet10.CustomConfiguration.Services; /// /// Implementation của IConfigManager /// Service cho quản lý và truy vấn configuration variables /// public class ConfigManager : IConfigManager, IDisposable { private readonly IConfigService _configService; // ========================================== // EVENTS // ========================================== public event EventHandler? ConfigChanged; /// /// Constructor - Subscribe vào ConfigChanged event từ IConfigService /// public ConfigManager(IConfigService configService) { _configService = configService ?? throw new ArgumentNullException(nameof(configService)); // Forward events from IConfigService to IConfigManager _configService.ConfigChanged += OnConfigServiceChanged; } /// /// Forward ConfigChanged event from IConfigService to IConfigManager subscribers /// private void OnConfigServiceChanged(object? sender, ConfigChangedEventArgs args) { ConfigChanged?.Invoke(this, args); } // ========================================== // CONFIG TYPE OPERATIONS // ========================================== public async Task GetConfigByTypeAsync(string configType) { return await _configService.GetConfigByTypeAsync(configType); } public async Task ConfigTypeExistsAsync(string configType) { return await _configService.ConfigTypeExistsAsync(configType); } // ========================================== // VARIABLE EXISTENCE CHECK // ========================================== public async Task VariableExistsAsync(string configType, string variableName) { var config = await _configService.GetConfigByTypeAsync(configType); if (config == null) return false; return config.Variables.Any(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase)); } public async Task VariableExistsAsync(Guid configId, string variableName) { var config = await _configService.GetConfigByIdAsync(configId); if (config == null) return false; return config.Variables.Any(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase)); } // ========================================== // GET VARIABLE VALUE // ========================================== public async Task GetVariableValueAsync(string configType, string variableName) { var variable = await GetVariableAsync(configType, variableName); return variable?.Value; } public async Task GetVariableValueAsync(Guid configId, string variableName) { var variable = await GetVariableAsync(configId, variableName); return variable?.Value; } // ========================================== // GET VARIABLE(S) // ========================================== public async Task GetVariableAsync(string configType, string variableName) { var config = await _configService.GetConfigByTypeAsync(configType); if (config == null) return null; return config.Variables.FirstOrDefault(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase)); } public async Task> GetVariablesAsync(string configType) { var config = await _configService.GetConfigByTypeAsync(configType); return config?.Variables ?? []; } public async Task GetVariableAsync(Guid configId, string variableName) { var config = await _configService.GetConfigByIdAsync(configId); if (config == null) return null; return config.Variables.FirstOrDefault(v => v.Name.Equals(variableName, StringComparison.OrdinalIgnoreCase)); } public async Task> GetVariablesAsync(Guid configId) { var config = await _configService.GetConfigByIdAsync(configId); return config?.Variables ?? []; } // ========================================== // GET VARIABLE TYPE // ========================================== public async Task GetVariableTypeAsync(string configType, string variableName) { var variable = await GetVariableAsync(configType, variableName); return variable != null ? ConvertTypeToString(variable.Type) : null; } public async Task GetVariableTypeAsync(Guid configId, string variableName) { var variable = await GetVariableAsync(configId, variableName); return variable != null ? ConvertTypeToString(variable.Type) : null; } // ========================================== // EVENT TRIGGERS // ========================================== /// /// Trigger ConfigChanged event /// Method này có thể được gọi từ bên ngoài hoặc từ các service khác khi có thay đổi /// public void OnConfigChanged(string configType, Guid configId, ConfigChangeType changeType, string? variableName = null) { var args = new ConfigChangedEventArgs { ConfigType = configType, ConfigId = configId, ChangeType = changeType, VariableName = variableName }; ConfigChanged?.Invoke(this, args); } // ========================================== // DISPOSE // ========================================== public void Dispose() { _configService.ConfigChanged -= OnConfigServiceChanged; GC.SuppressFinalize(this); } // ========================================== // HELPER METHODS // ========================================== /// /// Convert ConfigVariableType enum thành string /// private static string ConvertTypeToString(ConfigVariableType type) { return type switch { ConfigVariableType.String => "string", ConfigVariableType.Int => "int", ConfigVariableType.Double => "double", ConfigVariableType.Bool => "bool", ConfigVariableType.Object => "object", ConfigVariableType.Array => "array", ConfigVariableType.Enum => "enum", _ => throw new ArgumentException($"Unknown variable type: {type}") }; } }