import { PrismaClient, Role, NewsStatus } from '@prisma/client';
import * as bcrypt from 'bcrypt';
import * as slugify from 'slugify';

const prisma = new PrismaClient();

async function main() {
  console.log('Seeding database...');

  // ── USERS (upsert by email, jangan di-delete) ──
  const hashedPassword = await bcrypt.hash('admin123', 12);
  const users = [
    { name: 'Super Admin', email: 'superadmin@rsud.com', password: hashedPassword, role: Role.SUPER_ADMIN },
    { name: 'Admin RSUD', email: 'admin@rsud.com', password: hashedPassword, role: Role.ADMIN },
  ];
  for (const u of users) {
    await prisma.user.upsert({
      where: { email: u.email },
      update: u,
      create: u,
    });
  }

  // ── POLI (hapus lama, bikin ulang biar slug konsisten) ──
  await prisma.schedule.deleteMany();
  await prisma.doctorPoli.deleteMany();
  await prisma.doctor.deleteMany();
  await prisma.poli.deleteMany();
  const poliData = [
    { name: 'Poli Umum', description: 'Melayani pemeriksaan kesehatan umum dan penanganan penyakit ringan.', icon: '🩺' },
    { name: 'Poli Gigi', description: 'Melayani pemeriksaan dan perawatan kesehatan gigi dan mulut.', icon: '🦷' },
    { name: 'Poli Anak', description: 'Melayani kesehatan dan penanganan penyakit pada anak-anak.', icon: '👶' },
    { name: 'Poli Kandungan', description: 'Melayani kesehatan ibu hamil, persalinan, dan kesehatan reproduksi wanita.', icon: '🤰' },
    { name: 'Poli Mata', description: 'Melayani pemeriksaan dan perawatan kesehatan mata.', icon: '👁️' },
    { name: 'Poli THT', description: 'Melayani kesehatan telinga, hidung, dan tenggorokan.', icon: '👂' },
    { name: 'Poli Saraf', description: 'Melayani penanganan gangguan sistem saraf.', icon: '🧠' },
    { name: 'Poli Jantung', description: 'Melayani pemeriksaan dan perawatan kesehatan jantung.', icon: '❤️' },
  ];
  const poliRecords: { id: number }[] = [];
  for (const p of poliData) {
    const poli = await prisma.poli.create({
      data: { ...p, slug: slugify.default(p.name, { lower: true, strict: true }) },
    });
    poliRecords.push(poli);
  }

  // ── DOCTORS ──
  const doctorData = [
    { name: 'dr. Andi Pratama, Sp.PD', specialization: 'Spesialis Penyakit Dalam', education: 'FK Universitas Indonesia', bio: 'Dokter spesialis penyakit dalam dengan pengalaman lebih dari 15 tahun.' },
    { name: 'dr. Sari Dewi, Sp.A', specialization: 'Spesialis Anak', education: 'FK Universitas Gadjah Mada', bio: 'Spesialis anak yang berdedikasi tinggi dalam menangani kesehatan anak.' },
    { name: 'dr. Budi Santoso, Sp.OG', specialization: 'Spesialis Kandungan', education: 'FK Universitas Airlangga', bio: 'Ahli kandungan dengan fokus pada kesehatan ibu dan janin.' },
    { name: 'dr. Maya Anggraini, Sp.M', specialization: 'Spesialis Mata', education: 'FK Universitas Padjajaran', bio: 'Spesialis mata dengan pengalaman dalam bedah refraktif dan katarak.' },
    { name: 'dr. Rudi Hartono, Sp.THT-KL', specialization: 'Spesialis THT', education: 'FK Universitas Diponegoro', bio: 'Ahli THT yang berpengalaman dalam penanganan gangguan pendengaran.' },
    { name: 'dr. Fitriani, Sp.S', specialization: 'Spesialis Saraf', education: 'FK Universitas Brawijaya', bio: 'Spesialis saraf dengan keahlian dalam penanganan stroke dan epilepsi.' },
    { name: 'dr. Hendra Gunawan, Sp.JP', specialization: 'Spesialis Jantung', education: 'FK Universitas Sumatera Utara', bio: 'Kardiolog dengan pengalaman dalam intervensi jantung koroner.' },
    { name: 'dr. Dewi Lestari, Sp.GK', specialization: 'Spesialis Gigi', education: 'FKG Universitas Trisakti', bio: 'Dokter gigi yang ahli dalam perawatan estetika gigi dan bedah mulut.' },
  ];
  const doctorRecords: { id: number }[] = [];
  for (const d of doctorData) {
    const doctor = await prisma.doctor.create({
      data: { ...d, slug: slugify.default(d.name, { lower: true, strict: true }) },
    });
    doctorRecords.push(doctor);
  }

  // ── DOCTOR-POLI ──
  const assignments = [
    [0, 0], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 1], [0, 1],
  ];
  for (const [docIdx, poliIdx] of assignments) {
    await prisma.doctorPoli.create({
      data: { doctorId: doctorRecords[docIdx].id, poliId: poliRecords[poliIdx].id },
    });
  }

  // ── SCHEDULES ──
  const days = ['Senin', 'Selasa', 'Rabu', 'Kamis', "Jum'at", 'Sabtu'];
  const scheduleData = [
    { docIdx: 0, poliIdx: 0, day: 0, start: '08:00', end: '14:00', room: 'Ruang 1' },
    { docIdx: 0, poliIdx: 0, day: 2, start: '08:00', end: '12:00', room: 'Ruang 1' },
    { docIdx: 1, poliIdx: 2, day: 1, start: '09:00', end: '15:00', room: 'Ruang Anak A' },
    { docIdx: 1, poliIdx: 2, day: 3, start: '09:00', end: '13:00', room: 'Ruang Anak A' },
    { docIdx: 2, poliIdx: 3, day: 0, start: '08:00', end: '14:00', room: 'Ruang Kandungan' },
    { docIdx: 2, poliIdx: 3, day: 4, start: '08:00', end: '12:00', room: 'Ruang Kandungan' },
    { docIdx: 3, poliIdx: 4, day: 1, start: '08:00', end: '14:00', room: 'Ruang Mata' },
    { docIdx: 3, poliIdx: 4, day: 3, start: '08:00', end: '12:00', room: 'Ruang Mata' },
    { docIdx: 4, poliIdx: 5, day: 2, start: '09:00', end: '15:00', room: 'Ruang THT' },
    { docIdx: 4, poliIdx: 5, day: 5, start: '08:00', end: '12:00', room: 'Ruang THT' },
    { docIdx: 5, poliIdx: 6, day: 0, start: '10:00', end: '14:00', room: 'Ruang Saraf' },
    { docIdx: 5, poliIdx: 6, day: 4, start: '10:00', end: '14:00', room: 'Ruang Saraf' },
    { docIdx: 6, poliIdx: 7, day: 1, start: '08:00', end: '14:00', room: 'Ruang Jantung' },
    { docIdx: 6, poliIdx: 7, day: 3, start: '08:00', end: '13:00', room: 'Ruang Jantung' },
    { docIdx: 7, poliIdx: 1, day: 0, start: '08:00', end: '14:00', room: 'Ruang Gigi' },
    { docIdx: 7, poliIdx: 1, day: 2, start: '08:00', end: '12:00', room: 'Ruang Gigi' },
    { docIdx: 0, poliIdx: 1, day: 4, start: '08:00', end: '12:00', room: 'Ruang Gigi' },
  ];
  for (const s of scheduleData) {
    await prisma.schedule.create({
      data: {
        doctorId: doctorRecords[s.docIdx].id,
        poliId: poliRecords[s.poliIdx].id,
        day: days[s.day],
        startTime: s.start,
        endTime: s.end,
        room: s.room,
      },
    });
  }

  // ── SERVICES (hapus lama, bikin ulang) ──
  await prisma.serviceItem.deleteMany();
  await prisma.service.deleteMany();
  interface ServiceSeed {
    name: string; icon: string; description: string; items: string[]
  }
  const servicesData: ServiceSeed[] = [
    { name: 'Pelayanan Emergency', icon: '🚑', description: 'Pelayanan gawat darurat 24 jam.', items: ['Instalasi Gawat Darurat 24 Jam', 'Kebidanan', 'Perinatal dan Neonatal', 'Radiomedik'] },
    { name: 'Pelayanan Rawat Jalan', icon: '🩺', description: 'Pelayanan poliklinik rawat jalan.', items: ['Poliklinik Bedah', 'Poliklinik Penyakit Dalam', 'Poliklinik Kebidanan dan Kandungan', 'Poliklinik Ilmu Kesehatan Anak', 'Poliklinik Gigi dan Mulut', 'Poliklinik THT', 'Poliklinik Saraf', 'Poliklinik Endoskopi', 'Poliklinik Orthopedi', 'Poliklinik Rehabilitasi Medik', 'Klinik Dots TB', 'Klinik Hanna'] },
    { name: 'Pelayanan Rawat Inap', icon: '🏥', description: 'Fasilitas rawat inap dengan perawatan intensif.', items: [] },
    { name: 'Pelayanan Operasi', icon: '🔪', description: 'Pelayanan bedah dan operasi.', items: [] },
    { name: 'Pelayanan Intensif', icon: '❤️', description: 'Perawatan intensif bagi pasien kritis.', items: [] },
    { name: 'Pelayanan Khusus', icon: '🔬', description: 'Pelayanan medis khusus.', items: [] },
    { name: 'Pelayanan Unggulan', icon: '⭐', description: 'Layanan unggulan RSUD.', items: ['Pelayanan radiologi termasuk USG 4 dimensi', 'Pelayanan X-Foto Panoramic', 'Pelayanan Endoskopi', 'Pelayanan Operasi dengan Laparoskopi', 'Pelayanan Resusitasi dengan CPAP', 'Pelayanan Rehabilitasi Medik dengan alat laser Ultrasonik'] },
    { name: 'Pelayanan Laboratorium Patologi Klinik', icon: '🔬', description: 'Pemeriksaan laboratorium lengkap.', items: [] },
    { name: 'Pelayanan Farmasi', icon: '💊', description: 'Apotek dan layanan obat-obatan.', items: [] },
    { name: 'Pelayanan Konsultasi Gizi', icon: '🥗', description: 'Konsultasi gizi untuk pasien.', items: [] },
    { name: 'Pelayanan Ambulans / Mobil Jenazah', icon: '🚑', description: 'Layanan antar jemput pasien dan mobil jenazah.', items: [] },
    { name: 'Pelayanan Laundry dan Sterilisasi (CSSD)', icon: '🧺', description: 'Laundry rumah sakit dan sterilisasi alat medis.', items: [] },
    { name: 'Pelayanan Rekam Medis', icon: '📋', description: 'Dokumentasi dan pengelolaan rekam medis.', items: [] },
    { name: 'Pengelolaan Limbah Bakar Medis', icon: '♻️', description: 'Pengelolaan limbah medis sesuai standar.', items: [] },
    { name: 'Pelayanan Pemeliharaan Sarana Rumah Sakit', icon: '🔧', description: 'Pemeliharaan sarana dan prasarana RS.', items: [] },
    { name: 'Pelayanan Administrasi Manajemen', icon: '📄', description: 'Surat kesehatan, visum, dan administrasi lainnya.', items: [] },
  ];
  for (const s of servicesData) {
    const service = await prisma.service.create({
      data: {
        name: s.name,
        slug: slugify.default(s.name, { lower: true, strict: true }),
        icon: s.icon,
        description: s.description,
      },
    });
    for (let i = 0; i < s.items.length; i++) {
      await prisma.serviceItem.create({
        data: { serviceId: service.id, name: s.items[i], orderNo: i },
      });
    }
  }

  // ── CONTACT (upsert — hanya 1 baris) ──
  const existingContact = await prisma.contact.findFirst();
  if (!existingContact) {
    await prisma.contact.create({
      data: {
        address: 'Kampung Doyo, Distrik Waibu, Kabupaten Jayapura',
        phone: '(0967) 123456',
        email: 'info@rsudyowari.go.id',
        googleMapEmbed: '<iframe src="https://www.google.com/maps/embed?pb=!1m18..." width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy"></iframe>',
      },
    });
  }

  // ── USER GENERATED CONTENT: hanya insert kalau masih kosong ──

  if ((await prisma.news.count()) === 0) {
    const newsData = [
      { title: 'RSUD Luncurkan Layanan Telemedicine', excerpt: 'Kemudahan konsultasi dokter dari rumah melalui layanan telemedicine terbaru.', content: 'RSUD dengan bangga meluncurkan layanan telemedicine...', status: NewsStatus.PUBLISHED, publishedAt: new Date('2024-12-01') },
      { title: 'Jadwal Dokter Spesialis Periode Desember 2024', excerpt: 'Informasi lengkap jadwal praktik dokter spesialis di RSUD.', content: 'Berikut adalah jadwal lengkap praktik dokter spesialis di RSUD...', status: NewsStatus.PUBLISHED, publishedAt: new Date('2024-11-28') },
      { title: 'Peringatan Hari Kesehatan Nasional di RSUD', excerpt: 'RSUD menggelar berbagai kegiatan dalam rangka Hari Kesehatan Nasional.', content: 'Dalam rangka memperingati Hari Kesehatan Nasional...', status: NewsStatus.PUBLISHED, publishedAt: new Date('2024-11-12') },
    ];
    for (const n of newsData) {
      await prisma.news.create({ data: { ...n, slug: slugify.default(n.title, { lower: true, strict: true }) } });
    }
  }

  if ((await prisma.galleryPhoto.count()) === 0) {
    await prisma.galleryPhoto.createMany({
      data: [
        { title: 'Gedung RSUD Tampak Depan', image: '/uploads/gallery/gedung-depan.jpg' },
        { title: 'Ruang Tunggu Pasien', image: '/uploads/gallery/ruang-tunggu.jpg' },
        { title: 'Ruang Operasi', image: '/uploads/gallery/ruang-operasi.jpg' },
        { title: 'Tim Medis RSUD', image: '/uploads/gallery/tim-medis.jpg' },
      ],
    });
  }

  if ((await prisma.galleryVideo.count()) === 0) {
    await prisma.galleryVideo.createMany({
      data: [
        { title: 'Profil RSUD', youtubeUrl: 'https://www.youtube.com/watch?v=example1' },
        { title: 'Layanan Unggulan RSUD', youtubeUrl: 'https://www.youtube.com/watch?v=example2' },
      ],
    });
  }

  if ((await prisma.announcement.count()) === 0) {
    await prisma.announcement.createMany({
      data: [
        {
          title: 'Libur Natal dan Tahun Baru',
          content: 'Sehubungan dengan libur Natal dan Tahun Baru, IGD tetap beroperasi 24 jam.',
          startDate: new Date('2024-12-24'),
          endDate: new Date('2025-01-02'),
        },
        {
          title: 'Vaksinasi COVID-19',
          content: 'RSUD melayani vaksinasi COVID-19 setiap hari Senin-Jumat pukul 08.00-14.00.',
          startDate: new Date('2024-11-01'),
          endDate: new Date('2025-06-30'),
        },
      ],
    });
  }

  if ((await prisma.banner.count()) === 0) {
    await prisma.banner.createMany({
      data: [
        { title: 'Selamat Datang di RSUD', image: '/uploads/banner/banner1.jpg', link: '/layanan', orderNo: 1, status: true },
        { title: 'Layanan IGD 24 Jam', image: '/uploads/banner/banner2.jpg', link: '/services', orderNo: 2, status: true },
        { title: 'Dokter Spesialis Terbaik', image: '/uploads/banner/banner3.jpg', link: '/dokter', orderNo: 3, status: true },
      ],
    });
  }

  if ((await prisma.bedRoom.count()) === 0) {
    await prisma.bedRoom.createMany({
      data: [
        { name: 'RUANG YP KARAFIR', kelas: 'VIP', capacity: 1, orderNo: 1, status: true },
        { name: 'RUANG BUPATI', kelas: 'KELAS I', capacity: 12, orderNo: 2, status: true },
        { name: 'RUANG CENDERAWASIH', kelas: 'KELAS I', capacity: 10, orderNo: 3, status: true },
        { name: 'RUANG NURI', kelas: 'KELAS II', capacity: 8, orderNo: 4, status: true },
        { name: 'RUANG KANAK - KANAK', kelas: 'KELAS II', capacity: 4, orderNo: 5, status: true },
        { name: 'RUANG BEDAH WANITA', kelas: 'KELAS III', capacity: 8, orderNo: 6, status: true },
        { name: 'RUANG BEDAH PRIA', kelas: 'KELAS III', capacity: 8, orderNo: 7, status: true },
        { name: 'RUANG INTERNA WANITA', kelas: 'KELAS III', capacity: 14, orderNo: 8, status: true },
        { name: 'RUANG INTERNA PRIA', kelas: 'KELAS III', capacity: 14, orderNo: 9, status: true },
        { name: 'RUANG PERINA', kelas: 'NICU / PICU', capacity: 23, orderNo: 10, status: true },
        { name: 'RUANG NIFAS', kelas: 'KELAS III', capacity: 8, orderNo: 11, status: true },
        { name: 'RUANG ICU', kelas: 'ICU', capacity: 4, orderNo: 12, status: true },
        { name: 'RUANG ISOLASI COVID', kelas: 'ISOLASI', capacity: 10, orderNo: 13, status: true },
        { name: 'RUANG VK', kelas: 'KELAS III', capacity: 8, orderNo: 14, status: true },
        { name: 'RUANG PONEK', kelas: 'KELAS III', capacity: 4, orderNo: 15, status: true },
      ],
    });
  }

  // ── SERVICE STANDARDS ──
  if ((await prisma.serviceStandard.count()) === 0) {
    await prisma.serviceStandard.createMany({
      data: [
        {
          title: 'Standar Pelayanan',
          content: 'RSUD Yowari berkomitmen memberikan pelayanan kesehatan yang bermutu, aman, dan terjangkau bagi seluruh masyarakat Kabupaten Jayapura. Pelayanan dilaksanakan sesuai dengan Standar Operasional Prosedur (SOP) yang berlaku dan mengacu pada standar akreditasi rumah sakit.',
          orderNo: 1,
        },
        {
          title: 'Hak dan Kewajiban Pasien',
          content: 'Hak Pasien:\n1. Mendapatkan informasi tentang tata tertib dan peraturan yang berlaku\n2. Mendapatkan pelayanan yang profesional dan manusiawi\n3. Mendapatkan informed consent sebelum tindakan medis\n4. Mendapatkan privasi dan kerahasiaan data medis\n5. Mengajukan pendapat kedua (second opinion)\n6. Mendapatkan rekam medis\n\nKewajiban Pasien:\n1. Memberikan informasi yang jujur tentang kondisi kesehatan\n2. Mematuhi instruksi dokter dan perawat\n3. Menghormati hak pasien lain dan petugas\n4. Menjaga kebersihan dan ketertiban\n5. Menyelesaikan kewajiban biaya sesuai ketentuan',
          orderNo: 2,
        },
        {
          title: 'Jam Besuk',
          content: 'Jam besuk pasien rawat inap:\n- Sesi Pagi: 10.00 - 12.00 WIT\n- Sesi Sore: 15.00 - 17.00 WIT\n- Sesi Malam: 19.00 - 20.00 WIT\n\nSetiap pasien maksimal dijenguk oleh 2 orang dewasa. Anak-anak di bawah 12 tahun tidak diperkenankan masuk ruang rawat inap.\n\nIGD melayani 24 jam setiap hari.',
          orderNo: 3,
        },
        {
          title: 'Prosedur Pendaftaran',
          content: 'Pendaftaran Rawat Jalan:\n1. Datang ke loket pendaftaran dengan membawa KTP/KK dan kartu BPJS (jika ada)\n2. Ambil nomor antrian\n3. Tunggu panggilan untuk verifikasi data\n4. Konsultasi dengan dokter sesuai poli yang dituju\n\nPendaftaran Rawat Inap:\n1. Mendapatkan rujukan dari IGD atau poliklinik\n2. Melengkapi administrasi di loket pendaftaran rawat inap\n3. Membayar uang muka atau menunjukkan surat jaminan\n4. Diarahkan ke ruang perawatan yang ditentukan',
          orderNo: 4,
        },
        {
          title: 'Alur Pasien IGD',
          content: '1. Pasien datang ke IGD\n2. Triage oleh perawat (menentukan tingkat kegawatdaruratan)\n3. Registrasi dan identifikasi pasien\n4. Penanganan awal oleh dokter jaga\n5. Observasi dan penanganan lanjutan\n6. Keputusan: rawat jalan, rawat inap, atau rujukan\n\nIGD RSUD Yowari melayani 24 jam dengan dokter jaga dan perawat yang siap siaga.',
          orderNo: 5,
        },
        {
          title: 'Pelayanan BPJS',
          content: 'RSUD Yowari melayani pasien pengguna BPJS Kesehatan untuk semua kelas perawatan. Prosedur:\n1. Membawa kartu BPJS yang aktif\n2. Membawa surat rujukan dari FKTP (untuk poli)\n3. Melakukan verifikasi di loket BPJS\n4. Mendapatkan pelayanan sesuai ketentuan BPJS\n\nRSUD Yowari juga melayani peserta JKN pada IGD tanpa surat rujukan untuk kasus kegawatdaruratan.',
          orderNo: 6,
        },
      ],
    });
  }

  // ── PROFILE ──
  if ((await prisma.profile.count()) === 0) {
    await prisma.profile.create({
      data: {
        description: 'RSUD Yowari adalah rumah sakit milik Pemerintah Kabupaten Jayapura yang memberikan pelayanan kesehatan secara profesional dan berkualitas kepada seluruh masyarakat.\n\nPembangunan fisik RSUD Yowari dilakukan secara bertahap sejak tahun 2003. Soft Opening operational pada 27 Januari 2007 dan Grand Opening pada 30 Januari 2017. RSUD Yowari merupakan rumah sakit umum Kelas C dan satu-satunya rumah sakit di wilayah Kabupaten Jayapura.\n\nBerlokasi di Kampung Doyo, Distrik Waibu, Kabupaten Jayapura ± 40 km dari pusat Kota Jayapura dan ± 5 km dari Bandara Sentani.',
        vision: 'Menjadi Rumah Sakit Berkualitas Pilihan Masyarakat Papua',
        mission: 'Menjalankan pelayanan kesehatan rujukan berkualitas dan mengutamakan keselamatan pasien\nMewujudkan Sistem Informasi Rumah Sakit berbasis teknologi\nMembangun Sumber Daya Manusia yang profesional, berintegritas, dan berdaya saing\nMengoptimalkan Rumah Sakit sebagai tempat pendidikan, penelitian, dan pengembangan pelayanan kesehatan\nMewujudkan sistem pengelolaan manajemen yang jujur, bersih, dan akuntabel\nMelayani dengan kasih dan memperhatikan kearifan lokal',
        motto: 'Kesembuhan Pasien Kebahagiaan Kami',
        values: 'K:Komitmen dalam bekerja\nO:Orientasi pada pasien\nT:Tanamkan rasa kejujuran dalam bekerja\nE:Empati terhadap pasien\nK:Kasih di atas segalanya\nA:Ada tanggung jawab penuh',
        accreditation: 'Terakreditasi PARIPURNA (Bintang 5) oleh Komite Akreditasi Rumah Sakit (KARS) Indonesia, 20 Maret 2023',
      },
    });
  }

  console.log('Seed completed successfully!');
  console.log('Login credentials:');
  console.log('  Email: superadmin@rsud.com');
  console.log('  Password: admin123');
  console.log('  Email: admin@rsud.com');
  console.log('  Password: admin123');
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
