using adas_core.Application.Exceptions; using adas_core.Application.Repositories.Interfaces; using adas_core.Application.Services.Interfaces; using adas_core.Domain.Enums; using adas_core.Domain.Models; using adas_core.Domain.Models.AppSettings; using adas_core.Domain.Models.MongoModels; using adas_core.Domain.Models.Pumps; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace adas_core.Application.Services; public class ConfigPumpsService( IConfigPumpsRepository configPumpsRepository, IOptions apiSettings, ILogger logger, IHttpContextAccessor httpContextAccessor, ILocalAuditService auditService) : IConfigPumpsService { private static ConfigPumps? _config; private static DateTime _nextRefresh = DateTime.MinValue; private readonly bool _configPumpsRequired = apiSettings.Value.ConfigPumpsRequired; private readonly string _key = apiSettings.Value.ConfigPumpsKey ?? "PV1"; private readonly int? _refreshTimeout = apiSettings.Value.ConfigObservation?.Refresh; public async Task Map(PumpObservation obs) { if (!_configPumpsRequired) return obs; var conf = !string.IsNullOrEmpty(obs.AlarmType.ToString()) ? await Get(obs.AlarmType.ToString() ?? string.Empty) : null; if (conf == null) return obs; return await MapConf(obs, conf); } public async Task?> GetAllPumpConfigs() { return await configPumpsRepository.GetAllConfigs(); } public async Task GetPumpConfigById(string id) { return await configPumpsRepository.FindById(id); } public async Task?> GetConfigItems(string id) { var result = await configPumpsRepository.FindById(id); return result?.Items; } public async Task UpdatePumpConfig(ConfigPumps pumpConfig) { var oldPumpConfig = configPumpsRepository.FindById(pumpConfig.Id); var newPumpConfig = await configPumpsRepository.UpdateConfig(pumpConfig) ?? throw new ConflictException(HttpEnum.ErrorMessage.ConflictUpdateFailed); await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, oldPumpConfig, newPumpConfig); return newPumpConfig; } public async Task InsertPumpConfig(ConfigPumps pumpConfig) { try { await configPumpsRepository.InsertOneAsync(pumpConfig); var newPumpConfig = await configPumpsRepository.FindById(pumpConfig.Id) ?? throw new ConflictException(HttpEnum.ErrorMessage.ConflictCreationFailed); await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, null, newPumpConfig); return newPumpConfig; } catch (Exception ex) { logger.LogError("ERROR inserting config_pumps: {key}. Exception: {exMessage} ", pumpConfig.Id, ex.Message); return null; } } public async Task DeletePumpConfig(ConfigPumps config) { try { var result = await configPumpsRepository.DeleteConfig(config); if (result) { logger.LogError("ERROR deleting config_pumps: {key}. ", config.Id); return false; } await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, config, null); return true; } catch (Exception ex) { logger.LogError("ERROR deleting config_pumps: {key}. Exception: {exMessage} ", config.Id, ex.Message); return false; } } public async Task RetentionActions(PumpObservation obs) { //TODO sacarlo de la configuración específica de Bombas var conf = await Get(obs); return conf is { RetentionPolicy: not null } ? new ObservatitonRetentionResult(conf.RetentionPolicy.Value, conf.RetentionPolicyValue) : new ObservatitonRetentionResult(RetentionPolicy.NoDelete, null); } private static Task MapConf(PumpObservation obs, ConfigPumpItem conf) { if (conf.UiConfiguration != null && conf.UiConfiguration.Count != 0) obs.UiConfiguration = conf.UiConfiguration; return Task.FromResult(obs); } private async Task Get(string alarmType) { if (!Enum.TryParse(alarmType, out PumpEnum.AlarmType alarmTypeParsed)) return null; var result = await GetConfig(); return result?.Items?.FirstOrDefault(i => i.AlarmType == alarmTypeParsed); } private async Task Get(PumpObservation pobs) { var config = await GetConfig(); return config?.Items?.FirstOrDefault(i => i.Type == pobs.MessageType); } public async Task?> Get() { var result = await GetConfig(); return result?.Items; } private async Task GetConfig() { try { if (_config != null && DateTime.Now <= _nextRefresh) return _config; _config = await configPumpsRepository.FindById(_key); _nextRefresh = _refreshTimeout.HasValue ? DateTime.Now.AddSeconds(_refreshTimeout.Value) : DateTime.MinValue; return _config; } catch (Exception ex) { logger.LogError("ERROR READ config_pumps: {key}. Exception: {exMessage} ", _key, ex.Message); return null; } } }