import { db } from "@/db";
import {
  providers,
  patients,
  appointments,
  inboxMessages,
  problems,
  medications,
  labResults,
  orders,
  careGoals,
  vitals,
  clinicalNotes,
  alerts,
} from "@/db/schema";
import { hash } from "bcryptjs";

export async function seedDatabase() {
  // Check if already seeded
  const existing = await db.select().from(providers).limit(1);
  if (existing.length > 0) return;

  const passwordHash = await hash("clevora2025", 10);

  // ── Seed Providers (Kenyan doctors) ──
  const [drWanjiku] = await db
    .insert(providers)
    .values([
      {
        email: "dr.wanjiku@clevora.co.ke",
        passwordHash,
        firstName: "Grace",
        lastName: "Wanjiku",
        specialty: "Internal Medicine",
        role: "physician",
        npi: "KE-MED-2024-001",
      },
      {
        email: "dr.ochieng@clevora.co.ke",
        passwordHash,
        firstName: "Peter",
        lastName: "Ochieng",
        specialty: "Family Medicine",
        role: "physician",
        npi: "KE-MED-2024-002",
      },
    ])
    .returning();

  // ── Seed Patients (Kenyan names and context) ──
  const patientData = [
    {
      mrn: "KNH-447182",
      firstName: "Mary",
      lastName: "Njeri",
      dateOfBirth: "1968-03-14",
      gender: "Female",
      phone: "+254 722 345 678",
      email: "mary.njeri@gmail.com",
      allergies: "Penicillin (Anaphylaxis), Sulfa (Rash)",
      codeStatus: "Full Code",
      insuranceName: "SHA (Social Health Authority)",
      insuranceStatus: "Verified",
      pcpId: drWanjiku.id,
      appStatus: "active",
      appLastLogin: new Date(Date.now() - 2 * 3600000),
      roomNumber: "Ward 4B-214",
    },
    {
      mrn: "KNH-552930",
      firstName: "John",
      lastName: "Kamau",
      dateOfBirth: "1955-08-22",
      gender: "Male",
      phone: "+254 733 456 789",
      email: "john.kamau@yahoo.com",
      allergies: "Aspirin (GI Bleed)",
      codeStatus: "Full Code",
      insuranceName: "Jubilee Health Insurance",
      insuranceStatus: "Verified",
      pcpId: drWanjiku.id,
      appStatus: "active",
      appLastLogin: new Date(Date.now() - 24 * 3600000),
      roomNumber: null,
    },
    {
      mrn: "KNH-663871",
      firstName: "Fatuma",
      lastName: "Hassan",
      dateOfBirth: "1972-11-05",
      gender: "Female",
      phone: "+254 711 567 890",
      email: "fatuma.hassan@hotmail.com",
      allergies: "None Known (NKDA)",
      codeStatus: "Full Code",
      insuranceName: "AAR Healthcare",
      insuranceStatus: "Verified",
      pcpId: drWanjiku.id,
      appStatus: "inactive",
      appLastLogin: new Date(Date.now() - 14 * 86400000),
      roomNumber: null,
    },
    {
      mrn: "KNH-774102",
      firstName: "David",
      lastName: "Otieno",
      dateOfBirth: "1990-06-18",
      gender: "Male",
      phone: "+254 720 678 901",
      email: "david.otieno@gmail.com",
      allergies: "Codeine (Nausea)",
      codeStatus: "Full Code",
      insuranceName: "Britam Health",
      insuranceStatus: "Verified",
      pcpId: drWanjiku.id,
      appStatus: "active",
      appLastLogin: new Date(Date.now() - 1 * 3600000),
      roomNumber: null,
    },
    {
      mrn: "KNH-885419",
      firstName: "Agnes",
      lastName: "Wambui",
      dateOfBirth: "1982-01-30",
      gender: "Female",
      phone: "+254 700 789 012",
      email: "agnes.wambui@gmail.com",
      allergies: "Latex",
      codeStatus: "Full Code",
      insuranceName: "SHA (Social Health Authority)",
      insuranceStatus: "Pending",
      pcpId: drWanjiku.id,
      appStatus: "not_enrolled",
      appLastLogin: null,
      roomNumber: null,
    },
    {
      mrn: "KNH-996738",
      firstName: "Joseph",
      lastName: "Mwangi",
      dateOfBirth: "1948-12-03",
      gender: "Male",
      phone: "+254 712 890 123",
      email: "joseph.mwangi@outlook.com",
      allergies: "Iodine Contrast (Hives)",
      codeStatus: "DNR/DNI",
      insuranceName: "NHIF Legacy",
      insuranceStatus: "Verified",
      pcpId: drWanjiku.id,
      appStatus: "active",
      appLastLogin: new Date(Date.now() - 48 * 3600000),
      roomNumber: "Ward 3E-108",
    },
  ];

  const insertedPatients = await db.insert(patients).values(patientData).returning();

  // ── Seed Appointments ──
  const today = new Date();
  const appointmentValues = [
    {
      patientId: insertedPatients[0].id,
      providerId: drWanjiku.id,
      scheduledAt: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 9, 0),
      duration: 30,
      visitType: "Follow-up",
      chiefComplaint: "Diabetes management - fatigue and increased thirst",
      status: "checked_in",
      noShowRisk: "Low" as const,
      isTelehealth: false,
    },
    {
      patientId: insertedPatients[1].id,
      providerId: drWanjiku.id,
      scheduledAt: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 9, 30),
      duration: 30,
      visitType: "Follow-up",
      chiefComplaint: "Hypertension review, medication adjustment",
      status: "waiting",
      noShowRisk: "Low" as const,
      isTelehealth: false,
    },
    {
      patientId: insertedPatients[2].id,
      providerId: drWanjiku.id,
      scheduledAt: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 10, 0),
      duration: 20,
      visitType: "Telehealth",
      chiefComplaint: "Anxiety follow-up, medication refill",
      status: "scheduled",
      noShowRisk: "High" as const,
      isTelehealth: true,
    },
    {
      patientId: insertedPatients[3].id,
      providerId: drWanjiku.id,
      scheduledAt: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 10, 30),
      duration: 45,
      visitType: "New Patient",
      chiefComplaint: "Chronic low back pain evaluation",
      status: "scheduled",
      noShowRisk: "Medium" as const,
      isTelehealth: false,
    },
    {
      patientId: insertedPatients[4].id,
      providerId: drWanjiku.id,
      scheduledAt: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 11, 30),
      duration: 30,
      visitType: "Annual Wellness",
      chiefComplaint: "Annual physical exam",
      status: "scheduled",
      noShowRisk: "Low" as const,
      isTelehealth: false,
    },
    {
      patientId: insertedPatients[5].id,
      providerId: drWanjiku.id,
      scheduledAt: new Date(today.getFullYear(), today.getMonth(), today.getDate(), 14, 0),
      duration: 30,
      visitType: "Follow-up",
      chiefComplaint: "CHF exacerbation, weight gain monitoring",
      status: "scheduled",
      noShowRisk: "Low" as const,
      isTelehealth: false,
    },
  ];

  await db.insert(appointments).values(appointmentValues);

  // ── Seed Inbox Messages ──
  await db.insert(inboxMessages).values([
    {
      providerId: drWanjiku.id,
      patientId: insertedPatients[0].id,
      category: "critical",
      priority: "critical",
      subject: "Critical Lab: HbA1c 10.2% - Mary Njeri",
      summary: "HbA1c has risen from 7.8% to 10.2% since last check. Immediate intervention recommended.",
      recommendedAction: "Review & Order",
      estimatedTime: "~2 minutes",
    },
    {
      providerId: drWanjiku.id,
      patientId: insertedPatients[5].id,
      category: "critical",
      priority: "critical",
      subject: "Deterioration Alert: Joseph Mwangi - Weight ↑2.3 kg in 3 days",
      summary: "RPM device data shows rapid weight gain consistent with fluid retention. BNP trending up.",
      recommendedAction: "Review & Order",
      estimatedTime: "~3 minutes",
    },
    {
      providerId: drWanjiku.id,
      patientId: insertedPatients[1].id,
      category: "urgent",
      priority: "urgent",
      subject: "Abnormal Result: Potassium 5.8 mEq/L - John Kamau",
      summary: "Potassium elevated above normal range. Patient on ACE inhibitor. Repeat lab recommended.",
      recommendedAction: "Review & Order",
      estimatedTime: "~1 minute",
    },
    {
      providerId: drWanjiku.id,
      patientId: insertedPatients[3].id,
      category: "routine",
      priority: "routine",
      subject: "Patient Message: David Otieno - Question about back exercises",
      summary: "Patient asking about recommended stretches and exercises before his appointment.",
      recommendedAction: "Reply",
      estimatedTime: "~30 seconds",
    },
    {
      providerId: drWanjiku.id,
      patientId: insertedPatients[2].id,
      category: "admin",
      priority: "routine",
      subject: "Unsigned Note: Fatuma Hassan - Visit 3 days ago",
      summary: "Telehealth visit note from 3 days ago remains unsigned. Action required within 72 hours.",
      recommendedAction: "Sign",
      estimatedTime: "~30 seconds",
    },
    {
      providerId: drWanjiku.id,
      patientId: insertedPatients[4].id,
      category: "patient_app",
      priority: "routine",
      subject: "Refill Request: Agnes Wambui - Sertraline 50mg",
      summary: "Patient submitted refill request via Clevora app. Last fill: 28 days ago. Adherence: 92%.",
      recommendedAction: "Approve",
      estimatedTime: "~15 seconds",
    },
  ]);

  // ── Seed Problems ──
  await db.insert(problems).values([
    { patientId: insertedPatients[0].id, name: "Type 2 Diabetes Mellitus", icdCode: "E11.65", status: "Active", controlStatus: "Uncontrolled", lastResult: "A1C: 10.2% (1 week ago)", patientReported: "Blood sugar running high, increased thirst", aiRecommendation: "Consider GLP-1 RA addition or insulin initiation" },
    { patientId: insertedPatients[0].id, name: "Essential Hypertension", icdCode: "I10", status: "Active", controlStatus: "Controlled", lastResult: "BP: 128/78 (last visit)", patientReported: "No complaints", aiRecommendation: "Continue current regimen" },
    { patientId: insertedPatients[0].id, name: "Hyperlipidemia", icdCode: "E78.5", status: "Active", controlStatus: "Stable", lastResult: "LDL: 2.5 mmol/L (2 months ago)", patientReported: null, aiRecommendation: "Recheck lipid panel at next visit" },
    { patientId: insertedPatients[1].id, name: "Essential Hypertension", icdCode: "I10", status: "Active", controlStatus: "Uncontrolled", lastResult: "BP: 158/94 (last visit)", patientReported: "Headaches in the morning", aiRecommendation: "Consider adding second agent" },
    { patientId: insertedPatients[1].id, name: "Chronic Kidney Disease, Stage 3a", icdCode: "N18.31", status: "Active", controlStatus: "Stable", lastResult: "eGFR: 52 (1 month ago)", patientReported: null, aiRecommendation: "Monitor renal function q3 months" },
    { patientId: insertedPatients[5].id, name: "Heart Failure with reduced EF", icdCode: "I50.22", status: "Active", controlStatus: "Worsening", lastResult: "BNP: 890 pg/mL (2 days ago)", patientReported: "More short of breath, swollen ankles", aiRecommendation: "Increase diuretic dose, cardiology consult at KNH" },
  ]);

  // ── Seed Medications ──
  await db.insert(medications).values([
    { patientId: insertedPatients[0].id, name: "Metformin", dose: "1000mg", route: "Oral", frequency: "Twice daily", prescriberId: drWanjiku.id, indication: "Type 2 Diabetes", adherenceRate: 78, fillStatus: "Filled" },
    { patientId: insertedPatients[0].id, name: "Lisinopril", dose: "20mg", route: "Oral", frequency: "Once daily", prescriberId: drWanjiku.id, indication: "Hypertension", adherenceRate: 92, fillStatus: "Filled" },
    { patientId: insertedPatients[0].id, name: "Atorvastatin", dose: "40mg", route: "Oral", frequency: "Once daily at bedtime", prescriberId: drWanjiku.id, indication: "Hyperlipidemia", adherenceRate: 85, fillStatus: "Filled" },
    { patientId: insertedPatients[1].id, name: "Amlodipine", dose: "10mg", route: "Oral", frequency: "Once daily", prescriberId: drWanjiku.id, indication: "Hypertension", adherenceRate: 88, fillStatus: "Filled" },
    { patientId: insertedPatients[1].id, name: "Losartan", dose: "100mg", route: "Oral", frequency: "Once daily", prescriberId: drWanjiku.id, indication: "Hypertension / CKD", adherenceRate: 90, fillStatus: "Filled" },
    { patientId: insertedPatients[5].id, name: "Furosemide", dose: "40mg", route: "Oral", frequency: "Twice daily", prescriberId: drWanjiku.id, indication: "Heart Failure", adherenceRate: 75, fillStatus: "Filled" },
    { patientId: insertedPatients[5].id, name: "Carvedilol", dose: "25mg", route: "Oral", frequency: "Twice daily", prescriberId: drWanjiku.id, indication: "Heart Failure", adherenceRate: 82, fillStatus: "Filled" },
    { patientId: insertedPatients[5].id, name: "Spironolactone", dose: "25mg", route: "Oral", frequency: "Once daily", prescriberId: drWanjiku.id, indication: "Heart Failure", adherenceRate: 70, fillStatus: "Overdue" },
  ]);

  // ── Seed Lab Results ──
  const now = Date.now();
  await db.insert(labResults).values([
    { patientId: insertedPatients[0].id, testName: "Hemoglobin A1c", value: "10.2", unit: "%", referenceRange: "4.0-5.6", status: "Critical", category: "Laboratory", resultDate: new Date(now - 7 * 86400000), aiInterpretation: "Significant rise from 7.8% three months ago. Indicates poor glycemic control. Consider intensification of diabetes management." },
    { patientId: insertedPatients[0].id, testName: "Hemoglobin A1c", value: "7.8", unit: "%", referenceRange: "4.0-5.6", status: "Abnormal", category: "Laboratory", resultDate: new Date(now - 97 * 86400000), aiInterpretation: "Above target but improving from prior value." },
    { patientId: insertedPatients[0].id, testName: "Hemoglobin A1c", value: "8.4", unit: "%", referenceRange: "4.0-5.6", status: "Abnormal", category: "Laboratory", resultDate: new Date(now - 187 * 86400000), aiInterpretation: "Elevated. Current regimen may be insufficient." },
    { patientId: insertedPatients[0].id, testName: "Fasting Glucose", value: "12.1", unit: "mmol/L", referenceRange: "3.9-5.6", status: "Critical", category: "Laboratory", resultDate: new Date(now - 7 * 86400000), aiInterpretation: "Significantly elevated fasting glucose consistent with A1c trend." },
    { patientId: insertedPatients[0].id, testName: "Creatinine", value: "80", unit: "μmol/L", referenceRange: "53-106", status: "Normal", category: "Laboratory", resultDate: new Date(now - 7 * 86400000), aiInterpretation: "Within normal limits. eGFR >60." },
    { patientId: insertedPatients[0].id, testName: "LDL Cholesterol", value: "2.5", unit: "mmol/L", referenceRange: "<2.6", status: "Normal", category: "Laboratory", resultDate: new Date(now - 60 * 86400000), aiInterpretation: "At goal on current statin therapy." },
    { patientId: insertedPatients[1].id, testName: "Potassium", value: "5.8", unit: "mEq/L", referenceRange: "3.5-5.0", status: "Critical", category: "Laboratory", resultDate: new Date(now - 1 * 86400000), aiInterpretation: "Elevated potassium. Patient is on losartan (ARB). Recommend repeat stat, ECG, and consider dose adjustment." },
    { patientId: insertedPatients[1].id, testName: "Creatinine", value: "141", unit: "μmol/L", referenceRange: "53-106", status: "Abnormal", category: "Laboratory", resultDate: new Date(now - 1 * 86400000), aiInterpretation: "Elevated consistent with known CKD Stage 3a. Stable from prior." },
    { patientId: insertedPatients[5].id, testName: "BNP", value: "890", unit: "pg/mL", referenceRange: "<100", status: "Critical", category: "Laboratory", resultDate: new Date(now - 2 * 86400000), aiInterpretation: "Markedly elevated. Consistent with acute decompensation of chronic heart failure. Prior BNP was 340." },
    { patientId: insertedPatients[5].id, testName: "BNP", value: "340", unit: "pg/mL", referenceRange: "<100", status: "Abnormal", category: "Laboratory", resultDate: new Date(now - 32 * 86400000), aiInterpretation: "Elevated but stable, consistent with compensated heart failure." },
  ]);

  // ── Seed Orders ──
  await db.insert(orders).values([
    { patientId: insertedPatients[0].id, providerId: drWanjiku.id, orderName: "Comprehensive Metabolic Panel", orderType: "Laboratory", status: "Resulted", priority: "Routine" },
    { patientId: insertedPatients[0].id, providerId: drWanjiku.id, orderName: "Hemoglobin A1c", orderType: "Laboratory", status: "Resulted", priority: "Routine" },
    { patientId: insertedPatients[0].id, providerId: drWanjiku.id, orderName: "Diabetic Eye Exam Referral - KNH Ophthalmology", orderType: "Referral", status: "Sent", priority: "Routine" },
    { patientId: insertedPatients[1].id, providerId: drWanjiku.id, orderName: "Repeat Potassium - STAT", orderType: "Laboratory", status: "Pending", priority: "Urgent" },
    { patientId: insertedPatients[1].id, providerId: drWanjiku.id, orderName: "ECG 12-Lead", orderType: "Procedure", status: "In Progress", priority: "Urgent" },
    { patientId: insertedPatients[5].id, providerId: drWanjiku.id, orderName: "Chest X-Ray PA/Lateral", orderType: "Imaging", status: "Completed", priority: "Routine" },
    { patientId: insertedPatients[5].id, providerId: drWanjiku.id, orderName: "Echocardiogram", orderType: "Imaging", status: "Pending", priority: "Urgent" },
    { patientId: insertedPatients[5].id, providerId: drWanjiku.id, orderName: "Cardiology Consult - KNH Heart Centre", orderType: "Referral", status: "Sent", priority: "Urgent" },
  ]);

  // ── Seed Care Goals ──
  await db.insert(careGoals).values([
    { patientId: insertedPatients[0].id, goalName: "Hemoglobin A1c", targetValue: "< 7.0", currentValue: "10.2", unit: "%", trend: "up", status: "Off Track" },
    { patientId: insertedPatients[0].id, goalName: "Systolic Blood Pressure", targetValue: "< 130", currentValue: "128", unit: "mmHg", trend: "stable", status: "At Goal" },
    { patientId: insertedPatients[0].id, goalName: "Weight", targetValue: "70", currentValue: "87", unit: "kg", trend: "down", status: "Improving" },
    { patientId: insertedPatients[0].id, goalName: "LDL Cholesterol", targetValue: "< 2.6", currentValue: "2.5", unit: "mmol/L", trend: "stable", status: "At Goal" },
    { patientId: insertedPatients[1].id, goalName: "Systolic Blood Pressure", targetValue: "< 130", currentValue: "158", unit: "mmHg", trend: "up", status: "Off Track" },
    { patientId: insertedPatients[5].id, goalName: "Daily Weight Monitoring", targetValue: "< 88", currentValue: "92", unit: "kg", trend: "up", status: "Off Track" },
    { patientId: insertedPatients[5].id, goalName: "Fluid Restriction", targetValue: "< 1.5L/day", currentValue: "2.1L", unit: "L", trend: "up", status: "Off Track" },
  ]);

  // ── Seed Vitals ──
  const vitalRecords = [];
  for (let i = 0; i < 14; i++) {
    const d = new Date(now - i * 86400000);
    vitalRecords.push(
      { patientId: insertedPatients[0].id, type: "blood_glucose", value: String(10 + Math.round(Math.random() * 3)), unit: "mmol/L", recordedAt: d, source: "device" },
      { patientId: insertedPatients[0].id, type: "systolic_bp", value: String(125 + Math.round(Math.random() * 10)), unit: "mmHg", recordedAt: d, source: "device" },
      { patientId: insertedPatients[0].id, type: "weight", value: String((87 + (i > 7 ? 1 : 0) - i * 0.1).toFixed(1)), unit: "kg", recordedAt: d, source: "device" },
    );
    vitalRecords.push(
      { patientId: insertedPatients[5].id, type: "weight", value: String((89 + i * 0.2).toFixed(1)), unit: "kg", recordedAt: d, source: "device" },
      { patientId: insertedPatients[5].id, type: "systolic_bp", value: String(130 + Math.round(Math.random() * 20)), unit: "mmHg", recordedAt: d, source: "device" },
    );
  }
  await db.insert(vitals).values(vitalRecords);

  // ── Seed Alerts ──
  await db.insert(alerts).values([
    { providerId: drWanjiku.id, patientId: insertedPatients[0].id, category: "Critical Results", title: "HbA1c 10.2% — Significant rise", description: "A1c rose from 7.8% to 10.2% in 3 months. Consider therapy intensification.", severity: "critical" },
    { providerId: drWanjiku.id, patientId: insertedPatients[5].id, category: "Deterioration Alert", title: "Weight gain 2.3 kg in 3 days — Joseph Mwangi", description: "Rapid weight gain in CHF patient. BNP trending upward. Consider diuretic adjustment.", severity: "critical" },
    { providerId: drWanjiku.id, patientId: insertedPatients[0].id, category: "Missed Medications", title: "Metformin adherence dropped to 78%", description: "Patient reports nausea with metformin. 5 missed doses in past 2 weeks.", severity: "high" },
    { providerId: drWanjiku.id, patientId: insertedPatients[1].id, category: "Critical Results", title: "Potassium 5.8 mEq/L — John Kamau", description: "Hyperkalemia in patient on ARB. ECG and repeat stat K+ recommended.", severity: "critical" },
    { providerId: drWanjiku.id, patientId: insertedPatients[2].id, category: "Overdue Follow-Up", title: "Fatuma Hassan — 14 days since last app login", description: "Patient has not engaged with app or scheduled follow-up. Anxiety f/u overdue.", severity: "medium" },
    { providerId: drWanjiku.id, patientId: insertedPatients[5].id, category: "Device Threshold", title: "SpO2 dropped to 91% — Joseph Mwangi", description: "Pulse oximetry below 92% threshold. Correlates with weight gain and elevated BNP.", severity: "high" },
  ]);

  // ── Seed Clinical Notes ──
  await db.insert(clinicalNotes).values([
    {
      patientId: insertedPatients[0].id,
      providerId: drWanjiku.id,
      noteType: "SOAP",
      content: `SUBJECTIVE:
Patient presents for diabetes follow-up. Reports increased fatigue and polydipsia over the past 3 weeks. Home glucose readings 10-13 mmol/L fasting (usual 7-9 mmol/L). Attributes worsening to increased stress at work and reduced exercise. Denies polyuria, blurred vision, or neuropathy symptoms.

OBJECTIVE:
Vitals: BP 128/78, HR 76, Temp 36.9°C, Weight 87 kg (down 1.5 kg)
General: Alert, NAD
CV: RRR, no murmurs
Extremities: No edema, intact pedal pulses
Neuro: Intact monofilament sensation bilaterally

ASSESSMENT:
1. Type 2 Diabetes - Uncontrolled, A1c rising
2. Hypertension - Controlled on current regimen
3. Hyperlipidemia - At goal

PLAN:
1. Diabetes: Consider adding GLP-1 RA. Recheck A1c in 3 months.
2. Continue lisinopril and atorvastatin
3. Referral to diabetes education program at Kenyatta National Hospital
4. F/U 3 months`,
      status: "Signed",
      visitDate: new Date(now - 90 * 86400000),
    },
  ]);
}
