using System.Text.Json; using Microsoft.EntityFrameworkCore; using StackExchange.Redis; public static class DataSeeder { public static async Task SeedAsync(AppDbContext db, IConnectionMultiplexer redis) { if (await db.Patients.AnyAsync()) return; // Two patients var patient1 = new Patient { Id = Guid.NewGuid(), Mrn = "MRN-000001", FirstName = "Jane", LastName = "Smith", DateOfBirth = new DateOnly(1975, 4, 12), Gender = "F", CreatedAt = DateTimeOffset.UtcNow }; var patient2 = new Patient { Id = Guid.NewGuid(), Mrn = "MRN-000002", FirstName = "Robert", LastName = "Chen", DateOfBirth = new DateOnly(1962, 9, 3), Gender = "M", CreatedAt = DateTimeOffset.UtcNow }; db.Patients.AddRange(patient1, patient2); // One active inpatient encounter per patient var encounter1 = new Encounter { Id = Guid.NewGuid(), PatientId = patient1.Id, EncounterType = EncounterType.Inpatient, Status = EncounterStatus.Active, Department = "ICU", AttendingPhysician = "Dr. Osei", AdmittedAt = DateTimeOffset.UtcNow.AddHours(-6), CreatedAt = DateTimeOffset.UtcNow.AddHours(-6) }; var encounter2 = new Encounter { Id = Guid.NewGuid(), PatientId = patient2.Id, EncounterType = EncounterType.Inpatient, Status = EncounterStatus.Active, Department = "General Medicine", AttendingPhysician = "Dr. Patel", AdmittedAt = DateTimeOffset.UtcNow.AddHours(-12), CreatedAt = DateTimeOffset.UtcNow.AddHours(-12) }; db.Encounters.AddRange(encounter1, encounter2); // Four alert thresholds var thresholds = new List { new() { Id = Guid.NewGuid(), ObservationCode = "HEART_RATE", DisplayName = "Heart Rate", Unit = "bpm", CriticalLow = 30, WarningLow = 50, WarningHigh = 100, CriticalHigh = 150, CreatedAt = DateTimeOffset.UtcNow }, new() { Id = Guid.NewGuid(), ObservationCode = "TEMP_C", DisplayName = "Body Temperature", Unit = "°C", CriticalLow = 35.0m, WarningLow = 36.0m, WarningHigh = 38.3m, CriticalHigh = 40.0m, CreatedAt = DateTimeOffset.UtcNow }, new() { Id = Guid.NewGuid(), ObservationCode = "POTASSIUM_MEQ_L", DisplayName = "Serum Potassium", Unit = "mEq/L", CriticalLow = 2.5m, WarningLow = 3.5m, WarningHigh = 5.0m, CriticalHigh = 6.5m, CreatedAt = DateTimeOffset.UtcNow }, new() { Id = Guid.NewGuid(), ObservationCode = "SPO2", DisplayName = "Oxygen Saturation", Unit = "%", CriticalLow = 88, WarningLow = 92, WarningHigh = null, CriticalHigh = null, CreatedAt = DateTimeOffset.UtcNow } }; db.AlertThresholds.AddRange(thresholds); // Observations spanning normal, warning, and critical ranges for encounter1 var now = DateTimeOffset.UtcNow; var observations = new List { // Normal heart rate new() { Id = Guid.NewGuid(), EncounterId = encounter1.Id, ObservationCode = "HEART_RATE", Value = 78, Unit = "bpm", Source = ObservationSource.Device, RecordedAt = now.AddMinutes(-30), CreatedAt = now.AddMinutes(-30) }, // Warning heart rate new() { Id = Guid.NewGuid(), EncounterId = encounter1.Id, ObservationCode = "HEART_RATE", Value = 104, Unit = "bpm", Source = ObservationSource.Device, RecordedAt = now.AddMinutes(-15), CreatedAt = now.AddMinutes(-15) }, // Critical potassium (low) new() { Id = Guid.NewGuid(), EncounterId = encounter1.Id, ObservationCode = "POTASSIUM_MEQ_L", Value = 2.3m, Unit = "mEq/L", Source = ObservationSource.Lab, RecordedAt = now.AddMinutes(-10), CreatedAt = now.AddMinutes(-10) }, // Normal SpO2 new() { Id = Guid.NewGuid(), EncounterId = encounter1.Id, ObservationCode = "SPO2", Value = 97, Unit = "%", Source = ObservationSource.Device, RecordedAt = now.AddMinutes(-5), CreatedAt = now.AddMinutes(-5) }, // Normal temp for encounter2 new() { Id = Guid.NewGuid(), EncounterId = encounter2.Id, ObservationCode = "TEMP_C", Value = 37.1m, Unit = "°C", Source = ObservationSource.Manual, RecordedAt = now.AddMinutes(-20), CreatedAt = now.AddMinutes(-20) } }; db.Observations.AddRange(observations); await db.SaveChangesAsync(); // Populate Redis cache with the seeded thresholds var cache = redis.GetDatabase(); foreach (var t in thresholds) { var json = JsonSerializer.Serialize(new { t.ObservationCode, t.CriticalLow, t.WarningLow, t.WarningHigh, t.CriticalHigh }); await cache.StringSetAsync($"threshold:{t.ObservationCode}", json); } } }