using Indotalent.ConfigBackEnd.Extensions; using Indotalent.Data.Entities; using Indotalent.Data.Enums; using Microsoft.EntityFrameworkCore; namespace Indotalent.Infrastructure.Database.Demo; public static class MedicalRecordSeeder { public static async Task GenerateDataAsync(AppDbContext context) { if (await context.MedicalRecord.AnyAsync()) return; var random = new Random(); var entityName = nameof(MedicalRecord); var patients = await context.Patient.ToListAsync(); var doctors = await context.Employee .Where(x => x.Name!.StartsWith("Dr.") || x.JobTitle!.Contains("Practitioner") || x.JobTitle!.Contains("Surgeon")) .ToListAsync(); var groups = await context.MedicalRecordGroup.ToListAsync(); var categories = await context.MedicalRecordCategory.ToListAsync(); if (!patients.Any() || !doctors.Any() || !groups.Any() || !categories.Any()) return; var soapSamples = new List<(string S, string O, string A, string P)> { ( "Patient reports persistent lower back pain for 2 weeks, exacerbated by morning activity.", "Tenderness noted in the lumbar spine region, decreased range of motion during trunk flexion.", "Lumbago with sciatica (ICD-10 M54.5).", "Start NSAID regimen, referral to Physical Therapy twice weekly, and activity modification." ), ( "Dry cough and low-grade fever for 72 hours. Patient denies dyspnea or chest pain.", "Lungs clear to auscultation bilaterally. Pharynx mildly erythematous. Temp 100.8 F.", "Acute Upper Respiratory Infection (ICD-10 J06.9).", "Rest, increased fluid intake, and over-the-counter antipyretics as needed." ), ( "Routine dental evaluation. Patient reports sensitivity to cold stimuli on lower left quadrant.", "Localized enamel wear on tooth #19. Gingival tissue appears within normal limits.", "Dentin hypersensitivity (ICD-10 K03.8).", "Applied fluoride varnish. Recommended use of potassium nitrate toothpaste." ), ( "Follow-up for essential hypertension. Patient reports compliance with medication, no headaches.", "S1, S2 audible, regular rate and rhythm. No peripheral edema noted.", "Essential Hypertension (ICD-10 I10).", "Continue current antihypertensive therapy. Reinforce DASH diet and low sodium intake." ), ( "Urgent care visit: inverted right ankle while running this morning.", "Edema and ecchymosis over the lateral malleolus. Guarded weight-bearing due to pain.", "Ankle sprain, grade 1 (ICD-10 S93.4).", "Follow RICE protocol (Rest, Ice, Compression, Elevation). Applied ACE bandage." ) }; var dateFinish = DateTime.Now; var dateStart = dateFinish.AddMonths(-12); foreach (var patient in patients) { int recordsPerPatient = random.Next(1, 4); for (int i = 0; i < recordsPerPatient; i++) { var randomDays = random.Next(0, (dateFinish - dateStart).Days); var recordDate = dateStart.AddDays(randomDays); var doctor = doctors[random.Next(doctors.Count)]; var soap = soapSamples[random.Next(soapSamples.Count)]; var autoNo = await context.GenerateAutoNumberAsync( entityName: entityName, prefixTemplate: $"MR/{{Year}}/{{Month}}/" ); var tempF = Math.Round(97.0 + (random.NextDouble() * 3.5), 1); var heightInches = random.Next(60, 76); var feet = heightInches / 12; var inches = heightInches % 12; var medicalRecord = new MedicalRecord { AutoNumber = autoNo, RecordDate = recordDate, PatientId = patient.Id, EmployeeId = doctor.Id, MedicalRecordGroupId = groups[random.Next(groups.Count)].Id, MedicalRecordCategoryId = categories[random.Next(categories.Count)].Id, Subjective = soap.S, Objective = soap.O, Assessment = soap.A, Planning = soap.P, BloodPressure = $"{random.Next(110, 135)}/{random.Next(70, 88)} mmHg", Temperature = $"{tempF} F", HeartRate = $"{random.Next(60, 100)} bpm", Weight = $"{random.Next(120, 230)} lbs", Height = $"{feet}'{inches}\"", Description = $"Clinical encounter documentation for {patient.Name}", Status = random.Next(1, 10) > 2 ? MedicalRecordStatus.Completed : MedicalRecordStatus.Examining }; await context.MedicalRecord.AddAsync(medicalRecord); } } await context.SaveChangesAsync(); } }