using Microsoft.Extensions.Options; public class MedicationCorrelationHelper { private readonly IMedicationService _medicationService; private readonly MedicationCorrelationOptions _options; public MedicationCorrelationHelper( IMedicationService medicationService, IOptions options) { _medicationService = medicationService; _options = options.Value; } /// /// Appends medication context to alert details if a correlated administration /// exists within the lookback window. Returns the original details if none found. /// public async Task TryAnnotateDetailsAsync( Guid encounterId, string observationCode, string details, CancellationToken ct = default) { var recent = await _medicationService.GetRecentForEncounterAsync( encounterId, observationCode, _options.CorrelationWindowMinutes); if (recent.Count == 0) return details; // Use the most recent correlated administration var med = recent[0]; var minutesAgo = (int)(DateTimeOffset.UtcNow - med.AdministeredAt).TotalMinutes; return $"{details} — note: {med.DrugName} {med.Dose}{med.DoseUnit} " + $"({med.Route}) administered {minutesAgo} min ago"; } public async Task TryGetContextAsync( Guid encounterId, string observationCode, CancellationToken ct = default) { var recent = await _medicationService.GetRecentForEncounterAsync( encounterId, observationCode, _options.CorrelationWindowMinutes); if (recent.Count == 0) return null; var med = recent[0]; return new MedicationContext { DrugName = med.DrugName, Dose = $"{med.Dose}{med.DoseUnit}", Route = med.Route, AdministeredAt = med.AdministeredAt, RelevanceNote = BuildRelevanceNote(med.DrugName, observationCode) }; } private string? BuildRelevanceNote(string drugName, string observationCode) { var drug = drugName.ToLowerInvariant(); return observationCode switch { "TEMP_C" when drug is "acetaminophen" or "ibuprofen" => "Antipyretic — may affect temperature trend", "HEART_RATE" or "SYSTOLIC_BP" or "DIASTOLIC_BP" when _options.DrugVitalMappings.TryGetValue(drug, out var codes) && codes.Contains(observationCode, StringComparer.OrdinalIgnoreCase) => "Cardiovascular agent — may affect blood pressure or heart rate", "RESP_RATE" or "SPO2" => "Sedative/opioid — may affect respiratory parameters", "GLUCOSE_MG_DL" => "Glucose management — may affect blood sugar", _ => null }; } }