// Seed — peuple la base avec les comptes initiaux et données de développement
// Usage : npx prisma db seed  (idempotent — rejouable sans créer de doublons)

import {
  PrismaClient,
  Sexe,
  StatutVisite,
  StatutOrdonnance,
  StatutSuivi,
  SourceExamen,
  StatutExamen,
} from '@prisma/client';
// ClinicConfig est chargée dans BLOC 7
// StatutOrdonnance contient maintenant : active, en_preparation, annulee, remise
import bcrypt from 'bcrypt';

// Grille tarifaire réelle de la clinique (examens biologiques, HLSA Bafoussam).
// Remplace l'ancien catalogue générique (radio, écho, ECG...). prixFCFA à 0 =
// prix non communiqué sur la grille papier, à compléter plus tard.
const TYPES_EXAMENS: { nom: string; prixFCFA: number }[] = [
  { nom: 'NFS', prixFCFA: 5000 },
  { nom: 'Ionogramme (4 éléments)', prixFCFA: 11400 },
  { nom: 'Ionogramme (6 éléments)', prixFCFA: 17800 },
  { nom: 'Calcium', prixFCFA: 3900 },
  { nom: 'Magnésium', prixFCFA: 3200 },
  { nom: 'Phosphore', prixFCFA: 3700 },
  { nom: 'Glycémie à jeun', prixFCFA: 10000 },
  { nom: 'Urémie', prixFCFA: 3000 },
  { nom: 'Créatinine', prixFCFA: 3000 },
  { nom: 'Bilan lipidique', prixFCFA: 12800 },
  { nom: 'Chimie urinaire', prixFCFA: 0 },
  { nom: 'ECBU', prixFCFA: 12000 },
  { nom: 'Gamma GT', prixFCFA: 3700 },
  { nom: 'SGOT(AST) ; SGPT(ALT)', prixFCFA: 7400 },
  { nom: 'HbA1C', prixFCFA: 11000 },
  { nom: 'PSA totale', prixFCFA: 10500 },
  { nom: 'Microalbuminurie de 24h', prixFCFA: 0 },
  { nom: 'Goutte épaisse (GE)', prixFCFA: 1500 },
  { nom: 'Widal', prixFCFA: 3600 },
  { nom: 'CRP', prixFCFA: 6000 },
  { nom: 'VS', prixFCFA: 1350 },
  { nom: 'Sérologie moderne (SM)', prixFCFA: 0 },
  { nom: 'TPHA / VDRL', prixFCFA: 5000 },
  { nom: 'Chlamydia', prixFCFA: 16800 },
  { nom: 'Hépatite B (AgHBS)', prixFCFA: 6500 },
  { nom: 'Hépatite C (AcHCV)', prixFCFA: 6500 },
  { nom: 'TSHus', prixFCFA: 12000 },
  { nom: 'T4 libre', prixFCFA: 12000 },
  { nom: 'Cortisolémie de 8h', prixFCFA: 0 },
  { nom: 'FSH', prixFCFA: 12000 },
  { nom: 'LH', prixFCFA: 12000 },
  { nom: 'Oestradiol', prixFCFA: 12000 },
  { nom: 'Testostérone total', prixFCFA: 12000 },
  { nom: 'PRL', prixFCFA: 0 },
];

const prisma = new PrismaClient();

const SALT_ROUNDS = 12;

// Mots de passe fournis via variables d'environnement (jamais en dur dans le code)
const utilisateurs = [
  {
    email: 'admin@cliniqflow.cm',
    nom: 'Admin',
    prenom: 'Système',
    motDePasse: process.env.SEED_ADMIN_PASSWORD,
    role: 'admin' as const,
  },
  {
    email: 'reception@cliniqflow.cm',
    nom: 'Mballa',
    prenom: 'Cécile',
    motDePasse: process.env.SEED_RECEPTION_PASSWORD,
    role: 'reception' as const,
  },
  {
    email: 'infirmier@cliniqflow.cm',
    nom: 'Nkomo',
    prenom: 'Paul',
    motDePasse: process.env.SEED_INFIRMIER_PASSWORD,
    role: 'infirmier' as const,
  },
  {
    email: 'medecin@cliniqflow.cm',
    nom: 'Tagne',
    prenom: 'Jean-Pierre',
    motDePasse: process.env.SEED_MEDECIN_PASSWORD,
    role: 'medecin' as const,
  },
  {
    email: 'pharmacie@cliniqflow.cm',
    nom: 'Fogue',
    prenom: 'Isabelle',
    motDePasse: process.env.SEED_PHARMACIEN_PASSWORD,
    role: 'pharmacien' as const,
  },
  {
    email: 'laborantin@cliniqflow.cm',
    nom: 'Mvogo',
    prenom: 'Éric',
    motDePasse: process.env.SEED_LABORANTIN_PASSWORD,
    role: 'laborantin' as const,
  },
  {
    email: 'caisse@cliniqflow.cm',
    nom: 'Ateba',
    prenom: 'Solange',
    motDePasse: process.env.SEED_CAISSE_PASSWORD,
    role: 'caisse' as const,
  },
];

async function main() {
  console.log('Seeding CliniqFlow...\n');

  for (const u of utilisateurs) {
    if (!u.motDePasse) {
      console.warn(`[${u.role.padEnd(11)}] ${u.email} — SEED_${u.role.toUpperCase()}_PASSWORD non défini, compte ignoré.`);
      continue;
    }

    const hash = await bcrypt.hash(u.motDePasse, SALT_ROUNDS);

    const user = await prisma.user.upsert({
      where: { email: u.email },
      update: {},
      create: {
        email: u.email,
        nom: u.nom,
        prenom: u.prenom,
        motDePasse: hash,
        role: u.role,
        actif: true,
      },
    });

    console.log(`[${u.role.padEnd(11)}] ${user.email} — compte créé`);
  }

  // ── Types d'examens (BLOC 3) ─────────────────────────────���──────────────────
  console.log('\nTypes d\'examens…');
  for (const { nom, prixFCFA } of TYPES_EXAMENS) {
    await prisma.examenType.upsert({
      where: { nom },
      update: { prixFCFA, actif: true },
      create: { nom, prixFCFA },
    });
  }
  // Désactive l'ancien catalogue générique (radio, écho, ECG...) — on ne garde
  // que la liste biologique. Pas de suppression : des ExamenVisite historiques
  // peuvent encore y référer (contrainte de clé étrangère).
  const nomsActuels = TYPES_EXAMENS.map((t) => t.nom);
  const { count: nbDesactives } = await prisma.examenType.updateMany({
    where: { nom: { notIn: nomsActuels }, actif: true },
    data: { actif: false },
  });
  console.log(`  ${TYPES_EXAMENS.length} types d'examens chargés (${nbDesactives} anciens désactivés)`);

  // ── Patients de développement (BLOC 2) ────────────────────────────────��─────
  console.log('\nPatients de développement…');

  const patientsDevData = [
    {
      id: 'aaaaaaaa-0001-4000-8000-000000000001',
      nom: 'Kamga',
      prenom: 'Martin',
      dateNaissance: new Date('1978-06-20'),
      sexe: Sexe.M,
      telephone: '699001001',
      adresse: 'Quartier Biyem-Assi, Yaoundé',
    },
    {
      id: 'aaaaaaaa-0002-4000-8000-000000000002',
      nom: 'Nguema',
      prenom: 'Sylvie',
      dateNaissance: new Date('1992-11-03'),
      sexe: Sexe.F,
      telephone: '677002002',
      numeroCni: 'CM12345678',
    },
    {
      id: 'aaaaaaaa-0003-4000-8000-000000000003',
      nom: 'Biya',
      prenom: 'Thomas',
      dateNaissance: new Date('1965-02-14'),
      sexe: Sexe.M,
      telephone: '655003003',
    },
  ];

  for (const p of patientsDevData) {
    await prisma.patient.upsert({
      where: { id: p.id },
      update: {},
      create: p,
    });
    console.log(`  Patient : ${p.nom} ${p.prenom}`);
  }

  // ── Visite de développement — en attente infirmier (BLOC 2) ──────────────────
  console.log('\nVisite de développement…');

  const receptionUser = await prisma.user.findUnique({
    where: { email: 'reception@cliniqflow.cm' },
  });

  if (receptionUser) {
    await prisma.visite.upsert({
      where: { id: 'bbbbbbbb-0001-4000-8000-000000000001' },
      update: {},
      create: {
        id: 'bbbbbbbb-0001-4000-8000-000000000001',
        patientId: 'aaaaaaaa-0001-4000-8000-000000000001',
        motif: 'Consultation générale',
        statut: StatutVisite.en_attente_infirmier,
        ouvertPar: receptionUser.id,
      },
    });
    console.log('  Visite : Kamga Martin → en_attente_infirmier');
  }

  // ── Visite BLOC 4 — en attente médecin avec constantes ───────────────────────
  console.log('\nVisite médecin de développement…');

  const infirmierUser = await prisma.user.findUnique({
    where: { email: 'infirmier@cliniqflow.cm' },
  });

  if (receptionUser && infirmierUser) {
    const visiteExistante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0002-4000-8000-000000000002' },
    });

    if (!visiteExistante) {
      const visite2 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0002-4000-8000-000000000002',
          patientId: 'aaaaaaaa-0002-4000-8000-000000000002',
          motif: 'Douleurs abdominales',
          statut: StatutVisite.en_attente_medecin,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite2.id,
          poids: 58,
          taille: 163,
          tensionSystolique: 118,
          tensionDiastolique: 76,
          temperature: 37.8, // légère fièvre → avertissement
          frequenceCardiaque: 88,
          notesLibres: 'Patiente se plaint de douleurs en bas à droite',
        },
      });

      console.log('  Visite : Nguema Sylvie → en_attente_medecin (avec constantes)');
    } else {
      console.log('  Visite médecin : déjà existante, ignorée');
    }
  }

  // ── Visite BLOC 4 — en_attente_pharmacie avec consultation + ordonnance ────────
  console.log('\nVisite pharmacie de développement…');

  const medecinUser = await prisma.user.findUnique({
    where: { email: 'medecin@cliniqflow.cm' },
  });

  if (receptionUser && medecinUser) {
    const visite3Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0003-4000-8000-000000000003' },
    });

    if (!visite3Existante) {
      const visite3 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0003-4000-8000-000000000003',
          patientId: 'aaaaaaaa-0003-4000-8000-000000000003',
          motif: 'Fièvre persistante',
          statut: StatutVisite.en_attente_pharmacie,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite3.id,
          poids: 74,
          taille: 178,
          tensionSystolique: 125,
          tensionDiastolique: 82,
          temperature: 38.9,
          frequenceCardiaque: 95,
          notesLibres: 'Fièvre depuis 3 jours, patient fatigué',
        },
      });

      const consultation3 = await prisma.consultation.create({
        data: {
          visiteId: visite3.id,
          medecinId: medecinUser.id,
          diagnostic: 'Paludisme simple',
          notesConfidentielles: 'Patient sous traitement antihypertenseur — vérifier interactions',
        },
      });

      await prisma.ordonnance.create({
        data: {
          visiteId: visite3.id,
          consultationId: consultation3.id,
          statut: StatutOrdonnance.active,
          lignes: {
            create: [
              {
                nom: 'Artémether-Luméfantrine (Coartem)',
                dosage: '80mg/480mg',
                frequence: '2x/jour',
                duree: '3 jours',
                instructions: 'Prendre avec un aliment gras',
              },
              {
                nom: 'Paracétamol',
                dosage: '1g',
                frequence: '3x/jour',
                duree: '3 jours',
                instructions: 'En cas de fièvre > 38.5°C',
              },
            ],
          },
        },
      });

      console.log('  Visite : Biya Thomas → en_attente_pharmacie (avec consultation + ordonnance)');
    } else {
      console.log('  Visite pharmacie : déjà existante, ignorée');
    }
  }

  // ── Pathologies + suivis de développement (BLOC 5) ─────────────────────────
  console.log('\nPathologies et suivis de développement…');

  if (medecinUser) {
    // Pathologies pour Kamga Martin
    for (const nom of ['Hypertension artérielle', 'Diabète type 2']) {
      const existante = await prisma.pathologie.findFirst({
        where: { patientId: 'aaaaaaaa-0001-4000-8000-000000000001', nom },
      });
      if (!existante) {
        await prisma.pathologie.create({
          data: {
            patientId: 'aaaaaaaa-0001-4000-8000-000000000001',
            nom,
            note: nom === 'Hypertension artérielle' ? 'Sous Amlodipine 5mg' : 'Glycémie à surveiller',
          },
        });
      }
    }
    console.log('  Pathologies Kamga Martin : HTA + Diabète type 2');

    // Suivi à venir dans 3 jours pour Kamga Martin (alerte visible)
    const dans3Jours = new Date();
    dans3Jours.setDate(dans3Jours.getDate() + 3);

    const suiviExistant = await prisma.suivi.findFirst({
      where: {
        patientId: 'aaaaaaaa-0001-4000-8000-000000000001',
        statut: StatutSuivi.programme,
      },
    });
    if (!suiviExistant) {
      await prisma.suivi.create({
        data: {
          patientId: 'aaaaaaaa-0001-4000-8000-000000000001',
          medecinId: medecinUser.id,
          datePrevue: dans3Jours,
          motif: 'Contrôle tensionnel et glycémique',
          statut: StatutSuivi.programme,
        },
      });
      console.log('  Suivi Kamga Martin : contrôle dans 3 jours (alerte visible)');
    }

    // Suivi en retard (date dépassée) pour Nguema Sylvie
    const hierMoins5 = new Date();
    hierMoins5.setDate(hierMoins5.getDate() - 5);

    const suiviRetardExistant = await prisma.suivi.findFirst({
      where: {
        patientId: 'aaaaaaaa-0002-4000-8000-000000000002',
        statut: StatutSuivi.programme,
      },
    });
    if (!suiviRetardExistant) {
      await prisma.suivi.create({
        data: {
          patientId: 'aaaaaaaa-0002-4000-8000-000000000002',
          medecinId: medecinUser.id,
          datePrevue: hierMoins5,
          motif: 'Suivi post-appendicite',
          statut: StatutSuivi.programme,
        },
      });
      console.log('  Suivi Nguema Sylvie : en retard de 5 jours (visible dans alertes)');
    }
  }

  // ── Visite BLOC 6 — terminée avec reçu (exemple complet du cycle pharmacie) ──
  console.log('\nVisite pharmacie complète (BLOC 6)…');

  const pharmacieUser = await prisma.user.findUnique({
    where: { email: 'pharmacie@cliniqflow.cm' },
  });

  if (receptionUser && medecinUser && pharmacieUser) {
    // Patient 4 : Bello Adama
    await prisma.patient.upsert({
      where: { id: 'aaaaaaaa-0004-4000-8000-000000000004' },
      update: {},
      create: {
        id: 'aaaaaaaa-0004-4000-8000-000000000004',
        nom: 'Bello',
        prenom: 'Adama',
        dateNaissance: new Date('1988-09-15'),
        sexe: Sexe.M,
        telephone: '699004004',
        adresse: 'Quartier Tsinga, Yaoundé',
      },
    });
    console.log('  Patient : Bello Adama');

    const visite4Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0004-4000-8000-000000000004' },
    });

    if (!visite4Existante) {
      const visite4 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0004-4000-8000-000000000004',
          patientId: 'aaaaaaaa-0004-4000-8000-000000000004',
          motif: 'Toux persistante',
          statut: StatutVisite.terminee,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite4.id,
          poids: 82,
          taille: 174,
          tensionSystolique: 128,
          tensionDiastolique: 84,
          temperature: 37.2,
          frequenceCardiaque: 82,
        },
      });

      const consultation4 = await prisma.consultation.create({
        data: {
          visiteId: visite4.id,
          medecinId: medecinUser.id,
          diagnostic: 'Infection respiratoire haute',
        },
      });

      const ordonnance4 = await prisma.ordonnance.create({
        data: {
          visiteId: visite4.id,
          consultationId: consultation4.id,
          statut: StatutOrdonnance.remise,
          lignes: {
            create: [
              {
                nom: 'Amoxicilline',
                dosage: '500mg',
                frequence: '3x/jour',
                duree: '7 jours',
              },
              {
                nom: 'Bromhexine sirop',
                dosage: '10ml',
                frequence: '3x/jour',
                duree: '5 jours',
              },
            ],
          },
        },
        include: { lignes: true },
      });

      // Reçu avec prix pour cet exemple
      await prisma.recu.create({
        data: {
          ordonnanceId: ordonnance4.id,
          total: 6500,
          lignesPrix: {
            create: [
              {
                ligneId: ordonnance4.lignes[0].id,
                prixUnitaire: 3500,
                quantite: 1,
              },
              {
                ligneId: ordonnance4.lignes[1].id,
                prixUnitaire: 3000,
                quantite: 1,
              },
            ],
          },
        },
      });

      console.log('  Visite : Bello Adama → terminee (avec reçu de 6500 FCFA)');
    } else {
      console.log('  Visite BLOC 6 : déjà existante, ignorée');
    }
  }

  // ── BLOC 11 — Visite en_consultation (médecin en train de consulter) ─────────
  console.log('\nVisite en_consultation (BLOC 11)…');

  if (receptionUser && medecinUser) {
    // Patient 5 : Ateba Sophie
    await prisma.patient.upsert({
      where: { id: 'aaaaaaaa-0005-4000-8000-000000000005' },
      update: {},
      create: {
        id: 'aaaaaaaa-0005-4000-8000-000000000005',
        nom: 'Ateba',
        prenom: 'Sophie',
        dateNaissance: new Date('1995-04-22'),
        sexe: Sexe.F,
        telephone: '677005005',
        adresse: 'Quartier Nlongkak, Yaoundé',
      },
    });
    console.log('  Patient : Ateba Sophie');

    const visite5Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0005-4000-8000-000000000005' },
    });

    if (!visite5Existante) {
      const visite5 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0005-4000-8000-000000000005',
          patientId: 'aaaaaaaa-0005-4000-8000-000000000005',
          motif: 'Maux de tête persistants',
          statut: StatutVisite.en_consultation,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite5.id,
          poids: 62,
          taille: 165,
          tensionSystolique: 130,
          tensionDiastolique: 85,
          temperature: 37.5,
          frequenceCardiaque: 78,
          notesLibres: 'Céphalées depuis 2 jours, légère tension',
        },
      });

      console.log('  Visite : Ateba Sophie → en_consultation (chez le médecin)');
    } else {
      console.log('  Visite en_consultation : déjà existante, ignorée');
    }

    // Patient 6 : Fouda Cyrille — 2e patient en attente médecin
    await prisma.patient.upsert({
      where: { id: 'aaaaaaaa-0006-4000-8000-000000000006' },
      update: {},
      create: {
        id: 'aaaaaaaa-0006-4000-8000-000000000006',
        nom: 'Fouda',
        prenom: 'Cyrille',
        dateNaissance: new Date('1980-12-01'),
        sexe: Sexe.M,
        telephone: '699006006',
      },
    });
    console.log('  Patient : Fouda Cyrille');

    const visite6Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0006-4000-8000-000000000006' },
    });

    if (!visite6Existante) {
      const visite6 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0006-4000-8000-000000000006',
          patientId: 'aaaaaaaa-0006-4000-8000-000000000006',
          motif: 'Douleurs lombaires',
          statut: StatutVisite.en_attente_medecin,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite6.id,
          poids: 88,
          taille: 180,
          tensionSystolique: 120,
          tensionDiastolique: 78,
          temperature: 37.1,
          frequenceCardiaque: 72,
          notesLibres: 'Douleurs irradiant dans la jambe droite',
        },
      });

      console.log('  Visite : Fouda Cyrille → en_attente_medecin (2e dans la file)');
    } else {
      console.log('  Visite 6 : déjà existante, ignorée');
    }
  }

  // ── BLOC 12 — Examens avec résultats laborantin ──────────────────────────────
  console.log('\nExamens laborantin (BLOC 12)…');

  const laborantinUser = await prisma.user.findUnique({
    where: { email: 'laborantin@cliniqflow.cm' },
  });

  if (infirmierUser) {
    // Examen prescrit par l'infirmier — en attente du laborantin
    const examen1Existant = await prisma.examenVisite.findFirst({
      where: {
        visiteId: 'bbbbbbbb-0001-4000-8000-000000000001',
        nomLibre: 'Numération formule sanguine (NFS)',
      },
    });
    if (!examen1Existant) {
      await prisma.examenVisite.create({
        data: {
          visiteId: 'bbbbbbbb-0001-4000-8000-000000000001',
          nomLibre: 'Numération formule sanguine (NFS)',
          source: SourceExamen.interne_clinique,
          statut: StatutExamen.demande,
          prescritParId: infirmierUser.id,
          note: 'Vérifier globules blancs et rouges',
        },
      });
      console.log('  Examen Kamga Martin : NFS demandée (statut: demande)');
    }
  }

  if (infirmierUser) {
    // Examen en cours de traitement
    const examen2Existant = await prisma.examenVisite.findFirst({
      where: {
        visiteId: 'bbbbbbbb-0002-4000-8000-000000000002',
        nomLibre: 'Test paludisme (TDR)',
      },
    });
    if (!examen2Existant) {
      await prisma.examenVisite.create({
        data: {
          visiteId: 'bbbbbbbb-0002-4000-8000-000000000002',
          nomLibre: 'Test paludisme (TDR)',
          source: SourceExamen.interne_clinique,
          statut: StatutExamen.en_cours,
          prescritParId: infirmierUser.id,
        },
      });
      console.log('  Examen Nguema Sylvie : TDR (statut: en_cours)');
    }
  }

  // Examen apporté par le patient — résultat direct
  if (receptionUser) {
    const examen3Existant = await prisma.examenVisite.findFirst({
      where: {
        visiteId: 'bbbbbbbb-0003-4000-8000-000000000003',
        source: SourceExamen.apporte_par_patient,
      },
    });
    if (!examen3Existant) {
      await prisma.examenVisite.create({
        data: {
          visiteId: 'bbbbbbbb-0003-4000-8000-000000000003',
          nomLibre: 'Bilan hépatique',
          source: SourceExamen.apporte_par_patient,
          statut: StatutExamen.resultat_disponible,
          prescritParId: receptionUser.id,
          resultatTexte:
            'ASAT: 35 U/L (normal), ALAT: 42 U/L (légèrement élevé), Bilirubine totale: 12 μmol/L',
          noteLaborantin: laborantinUser
            ? 'Résultat fourni par le patient depuis le laboratoire Pasteur'
            : 'Résultat fourni par le patient',
        },
      });
      console.log('  Examen Biya Thomas : Bilan hépatique (apporté, statut: resultat_disponible)');
    }
  }

  // ── Configuration clinique (BLOC 7) ─────────────────────────────────────────
  console.log('\nConfiguration clinique (BLOC 7)…');

  await prisma.clinicConfig.upsert({
    where: { id: 'config-singleton-00000001' },
    update: {},
    create: {
      id: 'config-singleton-00000001',
      nomClinique: 'American Medical Center',
      adresse: 'Avenue Kennedy, Yaoundé, Cameroun',
      ville: 'Yaoundé',
      telephone: '+237 222 000 000',
      medecinChef: 'Dr Jean-Pierre Tagne',
      prixConsultationFCFA: 5000,
    },
  });
  console.log('  Config clinique créée (prix consultation: 5000 FCFA)');

  // ── BLOC 16 — Paiements consultation & examens ──────────────────────────────
  console.log('\nPaiements facturation (BLOC 16)…');

  if (infirmierUser) {
    // Paiement consultation impayé pour Biya Thomas (visite 3 — en_attente_pharmacie)
    const paiementConsult3 = await prisma.paiementConsultation.findUnique({
      where: { visiteId: 'bbbbbbbb-0003-4000-8000-000000000003' },
    });
    if (!paiementConsult3) {
      await prisma.paiementConsultation.create({
        data: {
          visiteId: 'bbbbbbbb-0003-4000-8000-000000000003',
          montantFCFA: 5000,
          statut: 'impaye',
          saisiParId: infirmierUser.id,
        },
      });
      console.log('  Paiement consultation Biya Thomas : 5000 FCFA (impayé)');
    }

    // Paiement consultation payé pour Bello Adama (visite 4 — terminée)
    const paiementConsult4 = await prisma.paiementConsultation.findUnique({
      where: { visiteId: 'bbbbbbbb-0004-4000-8000-000000000004' },
    });
    if (!paiementConsult4) {
      const adminUser = await prisma.user.findUnique({ where: { email: 'admin@cliniqflow.cm' } });
      await prisma.paiementConsultation.create({
        data: {
          visiteId: 'bbbbbbbb-0004-4000-8000-000000000004',
          montantFCFA: 5000,
          statut: 'paye',
          modePaiement: 'especes',
          saisiParId: infirmierUser.id,
          encaisseParId: adminUser?.id ?? null,
        },
      });
      console.log('  Paiement consultation Bello Adama : 5000 FCFA (payé espèces)');
    }
  }

  // Paiement examen pour Biya Thomas (bilan hépatique)
  if (laborantinUser) {
    const examenBilanHep = await prisma.examenVisite.findFirst({
      where: {
        visiteId: 'bbbbbbbb-0003-4000-8000-000000000003',
        nomLibre: 'Bilan hépatique',
      },
    });
    if (examenBilanHep) {
      const paiementExam = await prisma.paiementExamen.findUnique({
        where: { examenId: examenBilanHep.id },
      });
      if (!paiementExam) {
        await prisma.paiementExamen.create({
          data: {
            examenId: examenBilanHep.id,
            montantFCFA: 8000,
            statut: 'impaye',
            saisiParId: laborantinUser.id,
          },
        });
        console.log('  Paiement examen Biya Thomas (bilan hépatique) : 8000 FCFA (impayé)');
      }
    }
  }

  // ── Patients supplémentaires pour tests variés ────────────────────────────────
  console.log('\nPatients supplémentaires…');

  // Patient 7 : Essomba Marie — visite en_attente_infirmier (file infirmier)
  await prisma.patient.upsert({
    where: { id: 'aaaaaaaa-0007-4000-8000-000000000007' },
    update: {},
    create: {
      id: 'aaaaaaaa-0007-4000-8000-000000000007',
      nom: 'Essomba',
      prenom: 'Marie',
      dateNaissance: new Date('2001-07-10'),
      sexe: Sexe.F,
      telephone: '677007007',
      adresse: 'Quartier Melen, Yaoundé',
    },
  });

  if (receptionUser) {
    const visite7Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0007-4000-8000-000000000007' },
    });
    if (!visite7Existante) {
      await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0007-4000-8000-000000000007',
          patientId: 'aaaaaaaa-0007-4000-8000-000000000007',
          motif: 'Fatigue et vertiges',
          statut: StatutVisite.en_attente_infirmier,
          ouvertPar: receptionUser.id,
        },
      });
      console.log('  Essomba Marie → en_attente_infirmier');
    }
  }

  // Patient 8 : Onana Daniel — visite en_attente_pharmacie avec ordonnance en_preparation
  await prisma.patient.upsert({
    where: { id: 'aaaaaaaa-0008-4000-8000-000000000008' },
    update: {},
    create: {
      id: 'aaaaaaaa-0008-4000-8000-000000000008',
      nom: 'Onana',
      prenom: 'Daniel',
      dateNaissance: new Date('1972-03-28'),
      sexe: Sexe.M,
      telephone: '699008008',
    },
  });

  if (receptionUser && medecinUser) {
    const visite8Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0008-4000-8000-000000000008' },
    });
    if (!visite8Existante) {
      const visite8 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0008-4000-8000-000000000008',
          patientId: 'aaaaaaaa-0008-4000-8000-000000000008',
          motif: 'Infection urinaire',
          statut: StatutVisite.en_attente_pharmacie,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite8.id,
          poids: 76,
          taille: 170,
          tensionSystolique: 122,
          tensionDiastolique: 80,
          temperature: 38.2,
          frequenceCardiaque: 90,
          plainte: 'Brûlures mictionnelles depuis 2 jours',
        },
      });

      const consultation8 = await prisma.consultation.create({
        data: {
          visiteId: visite8.id,
          medecinId: medecinUser.id,
          plainte: 'Brûlures mictionnelles depuis 2 jours',
          examenClinique: 'Douleur sus-pubienne à la palpation',
          diagnostic: 'Infection urinaire basse',
          conseilsCliniques: 'Boire beaucoup d\'eau, éviter les boissons irritantes',
        },
      });

      await prisma.ordonnance.create({
        data: {
          visiteId: visite8.id,
          consultationId: consultation8.id,
          statut: StatutOrdonnance.en_preparation,
          lignes: {
            create: [
              {
                nom: 'Ciprofloxacine',
                dosage: '500mg',
                frequence: '2x/jour',
                duree: '5 jours',
                instructions: 'À jeun, éviter les produits laitiers',
              },
              {
                nom: 'Phloroglucinol (Spasfon)',
                dosage: '80mg',
                frequence: '3x/jour',
                duree: '3 jours',
                instructions: 'Si douleurs abdominales',
              },
            ],
          },
        },
      });

      console.log('  Onana Daniel → en_attente_pharmacie (ordonnance en_preparation)');
    }
  }

  // Patient 9 : Ngo Bassa Estelle — visite abandonnée
  await prisma.patient.upsert({
    where: { id: 'aaaaaaaa-0009-4000-8000-000000000009' },
    update: {},
    create: {
      id: 'aaaaaaaa-0009-4000-8000-000000000009',
      nom: 'Ngo Bassa',
      prenom: 'Estelle',
      dateNaissance: new Date('1990-01-05'),
      sexe: Sexe.F,
      telephone: '677009009',
    },
  });

  if (receptionUser) {
    const visite9Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0009-4000-8000-000000000009' },
    });
    if (!visite9Existante) {
      await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0009-4000-8000-000000000009',
          patientId: 'aaaaaaaa-0009-4000-8000-000000000009',
          motif: 'Contrôle de routine',
          statut: StatutVisite.abandonnee,
          ouvertPar: receptionUser.id,
        },
      });
      console.log('  Ngo Bassa Estelle → abandonnée');
    }
  }

  // Patient 10 : Tchinda Robert — visite en_attente_medecin avec examen résultat dispo
  await prisma.patient.upsert({
    where: { id: 'aaaaaaaa-0010-4000-8000-000000000010' },
    update: {},
    create: {
      id: 'aaaaaaaa-0010-4000-8000-000000000010',
      nom: 'Tchinda',
      prenom: 'Robert',
      dateNaissance: new Date('1955-08-18'),
      sexe: Sexe.M,
      telephone: '699010010',
      adresse: 'Quartier Bastos, Yaoundé',
    },
  });

  if (receptionUser && infirmierUser) {
    const visite10Existante = await prisma.visite.findUnique({
      where: { id: 'bbbbbbbb-0010-4000-8000-000000000010' },
    });
    if (!visite10Existante) {
      const visite10 = await prisma.visite.create({
        data: {
          id: 'bbbbbbbb-0010-4000-8000-000000000010',
          patientId: 'aaaaaaaa-0010-4000-8000-000000000010',
          motif: 'Contrôle diabète',
          statut: StatutVisite.en_attente_medecin,
          ouvertPar: receptionUser.id,
        },
      });

      await prisma.constantes.create({
        data: {
          visiteId: visite10.id,
          poids: 92,
          taille: 175,
          tensionSystolique: 145,
          tensionDiastolique: 95,
          temperature: 37.0,
          frequenceCardiaque: 68,
          glycemie: 2.8,
          plainte: 'Contrôle trimestriel diabète type 2',
          observations: 'Tension élevée — surveillance recommandée',
        },
      });

      // Examen glycémie avec résultat disponible
      const typeGlycemie = await prisma.examenType.findUnique({
        where: { nom: 'Glycémie à jeun' },
      });
      await prisma.examenVisite.create({
        data: {
          visiteId: visite10.id,
          typeId: typeGlycemie?.id ?? null,
          nomLibre: 'Glycémie à jeun',
          source: SourceExamen.interne_clinique,
          statut: StatutExamen.resultat_disponible,
          prescritParId: infirmierUser.id,
          resultatTexte: 'Glycémie à jeun : 2.8 g/L (élevée, valeur normale < 1.1 g/L)',
          noteLaborantin: 'Valeur très élevée, consultation urgente recommandée',
        },
      });

      console.log('  Tchinda Robert → en_attente_medecin (glycémie 2.8 g/L — alerte)');
    }
  }

  console.log('\nSeed terminé.');
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(() => prisma.$disconnect());
