// Klinik Praktik — Klinik Mitra Sehat (fictional GP clinic, Jakarta Selatan)
// Tanggal demo: 2026-04-22, jam 14:32 WIB

const TENANT = {
  name: 'Klinik Mitra Sehat',
  tagline: 'Klinik Praktik Dokter Umum & Spesialis',
  address: 'Jl. Kemang Raya No. 88, Jakarta Selatan 12730',
  phone: '021-7180-***',
  bpjs: 'PRP 0301-K089',
  npwp: '02.847.391.5-014.000',
  hours: 'Senin–Sabtu · 08:00 — 20:00',
};

const TODAY = '2026-04-22';
const NOW_HHMM = '14:32';
const SHIFT = 'Siang (12:00 — 20:00)';

const ROLES = {
  perawat:   { name: 'Suster Maya Anggraini',  role: 'Perawat / Front Office' },
  dokter:    { name: 'dr. Anita Pradipta',     role: 'Dokter Umum' },
  apoteker:  { name: 'Apt. Rini Wulandari',    role: 'Apoteker' },
  manajer:   { name: 'dr. Hadi Wijaya',        role: 'Kepala Klinik' },
};

// Dokter list (4 dokter)
const DOKTER = [
  { id: 'D01', name: 'dr. Anita Pradipta',   spesialis: 'Umum',         room: 'Ruang 1', shift: '08:00-16:00', avgPerVisit: 12 },
  { id: 'D02', name: 'dr. Bayu Santosa',     spesialis: 'Umum',         room: 'Ruang 2', shift: '12:00-20:00', avgPerVisit: 10 },
  { id: 'D03', name: 'dr. Citra Lestari',    spesialis: 'Anak',         room: 'Ruang 3', shift: '15:00-20:00', avgPerVisit: 18 },
  { id: 'D04', name: 'dr. Dimas Pratomo',    spesialis: 'Gigi',         room: 'Ruang 4', shift: '09:00-17:00', avgPerVisit: 25 },
];

// Pasien database (sample)
const PASIEN = [
  { id: 'P-00142', nama: 'Ibu Sari Wahyuni',     usia: 38, gender: 'P', alamat: 'Pasar Minggu', phone: '0812***456', bpjs: '0001-0002-3456', alergi: 'Penicillin', visits: 12 },
  { id: 'P-00287', nama: 'Pak Budi Santoso',     usia: 52, gender: 'L', alamat: 'Cilandak',     phone: '0813***221', bpjs: '0001-0002-7891', alergi: '—', visits: 8, kronis: 'Hipertensi' },
  { id: 'P-00351', nama: 'Sdr. Reno Andika',     usia: 24, gender: 'L', alamat: 'Kemang',       phone: '0815***112', bpjs: '—', alergi: '—', visits: 3 },
  { id: 'P-00489', nama: 'Ibu Maria Theresia',   usia: 45, gender: 'P', alamat: 'Pejaten',      phone: '0818***309', bpjs: '0001-0003-1208', alergi: 'Sulfa', visits: 15, kronis: 'DM Tipe 2' },
  { id: 'P-00521', nama: 'Adik Naura Salsabila', usia: 6,  gender: 'P', alamat: 'Cipete',       phone: '0817***822', bpjs: '0001-0003-4567', alergi: '—', visits: 5 },
  { id: 'P-00612', nama: 'Pak Hendra Wijaya',    usia: 61, gender: 'L', alamat: 'Lebak Bulus',  phone: '0813***988', bpjs: '0001-0004-2210', alergi: '—', visits: 22, kronis: 'Hipertensi, Kolesterol' },
  { id: 'P-00718', nama: 'Ibu Dewi Anjani',      usia: 33, gender: 'P', alamat: 'Pondok Indah', phone: '0812***441', bpjs: '0001-0004-7782', alergi: '—', visits: 6 },
  { id: 'P-00824', nama: 'Sdr. Yoga Pratama',    usia: 28, gender: 'L', alamat: 'Tebet',        phone: '0814***556', bpjs: '0001-0005-1109', alergi: 'Aspirin', visits: 4 },
  { id: 'P-00891', nama: 'Adik Faiz Ramadhan',   usia: 9,  gender: 'L', alamat: 'Mampang',      phone: '0817***332', bpjs: '0001-0005-3320', alergi: '—', visits: 7 },
  { id: 'P-00945', nama: 'Ibu Ratna Sari',       usia: 41, gender: 'P', alamat: 'Bangka',       phone: '0813***667', bpjs: '0001-0005-8821', alergi: '—', visits: 9 },
  { id: 'P-01023', nama: 'Pak Eko Susilo',       usia: 56, gender: 'L', alamat: 'Cipete',       phone: '0812***112', bpjs: '0001-0006-1145', alergi: '—', visits: 11, kronis: 'DM Tipe 2' },
  { id: 'P-01087', nama: 'Ibu Lina Marlina',     usia: 47, gender: 'P', alamat: 'Pasar Minggu', phone: '0815***889', bpjs: '0001-0006-7720', alergi: 'Penicillin', visits: 13 },
];

const PASIEN_BY_ID = Object.fromEntries(PASIEN.map(p => [p.id, p]));

// Antrian hari ini (live queue)
const ANTRIAN = [
  // Sudah selesai
  { no: 'A-001', pasienId: 'P-00142', dokterId: 'D01', tipe: 'BPJS',  registeredAt: '08:12', calledAt: '08:30', finishedAt: '08:48', status: 'done',     keluhan: 'Batuk pilek 3 hari' },
  { no: 'A-002', pasienId: 'P-00287', dokterId: 'D01', tipe: 'BPJS',  registeredAt: '08:24', calledAt: '08:50', finishedAt: '09:08', status: 'done',     keluhan: 'Kontrol tensi rutin' },
  { no: 'A-003', pasienId: 'P-00489', dokterId: 'D01', tipe: 'BPJS',  registeredAt: '08:38', calledAt: '09:10', finishedAt: '09:35', status: 'done',     keluhan: 'Kontrol gula darah' },
  { no: 'A-004', pasienId: 'P-00521', dokterId: 'D04', tipe: 'Umum',  registeredAt: '09:05', calledAt: '09:30', finishedAt: '10:02', status: 'done',     keluhan: 'Sakit gigi geraham' },
  { no: 'A-005', pasienId: 'P-00351', dokterId: 'D01', tipe: 'Umum',  registeredAt: '09:42', calledAt: '09:55', finishedAt: '10:12', status: 'done',     keluhan: 'Sakit perut' },
  { no: 'A-006', pasienId: 'P-00612', dokterId: 'D01', tipe: 'BPJS',  registeredAt: '10:08', calledAt: '10:18', finishedAt: '10:42', status: 'done',     keluhan: 'Kontrol tensi & kolesterol' },
  { no: 'A-007', pasienId: 'P-00718', dokterId: 'D04', tipe: 'Umum',  registeredAt: '10:24', calledAt: '10:35', finishedAt: '11:08', status: 'done',     keluhan: 'Tambal gigi' },
  { no: 'A-008', pasienId: 'P-00824', dokterId: 'D01', tipe: 'Umum',  registeredAt: '10:42', calledAt: '11:00', finishedAt: '11:20', status: 'done',     keluhan: 'Demam, sakit kepala' },
  { no: 'A-009', pasienId: 'P-00891', dokterId: 'D01', tipe: 'BPJS',  registeredAt: '11:15', calledAt: '11:32', finishedAt: '11:48', status: 'done',     keluhan: 'Batuk berdahak' },
  { no: 'A-010', pasienId: 'P-00945', dokterId: 'D02', tipe: 'BPJS',  registeredAt: '12:08', calledAt: '12:20', finishedAt: '12:42', status: 'done',     keluhan: 'Kontrol asam urat' },
  { no: 'A-011', pasienId: 'P-01023', dokterId: 'D02', tipe: 'BPJS',  registeredAt: '12:32', calledAt: '12:55', finishedAt: '13:18', status: 'done',     keluhan: 'Kontrol gula darah' },
  { no: 'A-012', pasienId: 'P-01087', dokterId: 'D02', tipe: 'Umum',  registeredAt: '13:08', calledAt: '13:25', finishedAt: '13:48', status: 'done',     keluhan: 'Mual & lemas' },
  // Sedang ditangani
  { no: 'A-013', pasienId: 'P-00142', dokterId: 'D02', tipe: 'BPJS',  registeredAt: '13:42', calledAt: '14:18', finishedAt: null,    status: 'in-room', keluhan: 'Kontrol post-batuk' },
  { no: 'A-014', pasienId: 'P-00824', dokterId: 'D04', tipe: 'Umum',  registeredAt: '13:55', calledAt: '14:25', finishedAt: null,    status: 'in-room', keluhan: 'Cabut gigi bungsu' },
  // Menunggu (antrian aktif)
  { no: 'A-015', pasienId: 'P-00287', dokterId: 'D02', tipe: 'BPJS',  registeredAt: '14:02', calledAt: null,    finishedAt: null,    status: 'waiting', keluhan: 'Refill obat hipertensi' },
  { no: 'A-016', pasienId: 'P-00489', dokterId: 'D02', tipe: 'BPJS',  registeredAt: '14:10', calledAt: null,    finishedAt: null,    status: 'waiting', keluhan: 'Konsultasi diet DM' },
  { no: 'A-017', pasienId: 'P-00521', dokterId: 'D03', tipe: 'BPJS',  registeredAt: '14:18', calledAt: null,    finishedAt: null,    status: 'waiting', keluhan: 'Imunisasi MR' },
  { no: 'A-018', pasienId: 'P-00891', dokterId: 'D03', tipe: 'BPJS',  registeredAt: '14:25', calledAt: null,    finishedAt: null,    status: 'waiting', keluhan: 'Demam tinggi 2 hari' },
  { no: 'A-019', pasienId: 'P-00945', dokterId: 'D02', tipe: 'Umum',  registeredAt: '14:28', calledAt: null,    finishedAt: null,    status: 'waiting', keluhan: 'Cek lab gula darah' },
];

// Rekam medis sample (untuk pasien P-00287 Pak Budi - hipertensi)
const REKAM_MEDIS = [
  { id: 'RM-2026-00142', pasienId: 'P-00287', tanggal: '2026-04-22', dokterId: 'D02', dx: 'Refill obat hipertensi (HT terkontrol)', td: '128/82', nadi: 78, suhu: 36.5, bb: 72, anamnesa: 'Tidak ada keluhan. Obat habis 3 hari lalu.', terapi: 'Amlodipine 10mg 1x1, Captopril 25mg 2x1', followUp: 'Kontrol 1 bulan' },
  { id: 'RM-2026-00098', pasienId: 'P-00287', tanggal: '2026-03-18', dokterId: 'D01', dx: 'Hipertensi grade I, kontrol rutin', td: '142/88', nadi: 84, suhu: 36.6, bb: 73, anamnesa: 'Sakit kepala ringan pagi hari.', terapi: 'Amlodipine 10mg 1x1, Captopril 25mg 2x1, naikkan dosis bila TD >150', followUp: 'Kontrol 1 bulan' },
  { id: 'RM-2026-00067', pasienId: 'P-00287', tanggal: '2026-02-15', dokterId: 'D01', dx: 'Hipertensi grade I + dislipidemia ringan', td: '148/92', nadi: 86, suhu: 36.7, bb: 74, anamnesa: 'Pusing saat bangun, riwayat HT 5 tahun.', terapi: 'Amlodipine 5mg 1x1 (titrasi naik), simvastatin 10mg 1x1', followUp: 'Kontrol 4 minggu, cek lipid 3 bulan' },
  { id: 'RM-2025-00982', pasienId: 'P-00287', tanggal: '2025-12-20', dokterId: 'D01', dx: 'Hipertensi essensial, terkontrol parsial', td: '138/86', nadi: 80, suhu: 36.5, bb: 73, anamnesa: 'Tidak ada keluhan, rutin minum obat.', terapi: 'Amlodipine 5mg 1x1, Captopril 25mg 2x1', followUp: 'Kontrol 2 bulan' },
];

// Jadwal dokter minggu ini
const JADWAL = (() => {
  // Senin = 2026-04-20
  const days = [
    { date: '2026-04-20', day: 'Senin' },
    { date: '2026-04-21', day: 'Selasa' },
    { date: '2026-04-22', day: 'Rabu (Hari ini)' },
    { date: '2026-04-23', day: 'Kamis' },
    { date: '2026-04-24', day: 'Jumat' },
    { date: '2026-04-25', day: 'Sabtu' },
  ];
  return days.map(d => ({
    ...d,
    slots: DOKTER.map(dk => ({
      dokterId: dk.id,
      dokter: dk.name,
      shift: dk.shift,
      room: dk.room,
      booked: Math.floor(Math.random() * 8) + 6,
      capacity: 20,
      cuti: (dk.id === 'D03' && d.date === '2026-04-21') || (dk.id === 'D04' && d.date === '2026-04-25'),
    })),
  }));
})();

// Stok obat / apotek
const OBAT = [
  { sku: 'OBT-AML10', nama: 'Amlodipine 10mg',           kategori: 'Anti-hipertensi', satuan: 'tablet', stock: 380, par: 200, harga: 850,    supplier: 'Kalbe' },
  { sku: 'OBT-CAP25', nama: 'Captopril 25mg',            kategori: 'Anti-hipertensi', satuan: 'tablet', stock: 540, par: 300, harga: 420,    supplier: 'Kalbe' },
  { sku: 'OBT-MET500',nama: 'Metformin 500mg',           kategori: 'Anti-diabetes',   satuan: 'tablet', stock: 220, par: 200, harga: 650,    supplier: 'Dexa' },
  { sku: 'OBT-PCT',   nama: 'Paracetamol 500mg',         kategori: 'Analgesik',       satuan: 'tablet', stock:1200, par: 500, harga: 180,    supplier: 'Indofarma' },
  { sku: 'OBT-IBU',   nama: 'Ibuprofen 400mg',           kategori: 'Analgesik',       satuan: 'tablet', stock: 320, par: 250, harga: 450,    supplier: 'Indofarma' },
  { sku: 'OBT-AMX',   nama: 'Amoxicillin 500mg',         kategori: 'Antibiotik',      satuan: 'kapsul', stock:  82, par: 200, harga: 1_200, supplier: 'Hexpharm' },
  { sku: 'OBT-CIP',   nama: 'Ciprofloxacin 500mg',       kategori: 'Antibiotik',      satuan: 'tablet', stock: 145, par: 150, harga: 1_800, supplier: 'Hexpharm' },
  { sku: 'OBT-OMP',   nama: 'Omeprazole 20mg',           kategori: 'Lambung',         satuan: 'kapsul', stock: 280, par: 200, harga: 1_100, supplier: 'Dexa' },
  { sku: 'OBT-LOR',   nama: 'Loratadine 10mg',           kategori: 'Antihistamin',    satuan: 'tablet', stock: 165, par: 150, harga: 950,    supplier: 'Sanbe' },
  { sku: 'OBT-DEX',   nama: 'Dextrometorfan syrup 60ml', kategori: 'Batuk',           satuan: 'botol',  stock:  28, par:  40, harga: 14_500, supplier: 'Sanbe' },
  { sku: 'OBT-VIT',   nama: 'Vitamin B Complex',         kategori: 'Vitamin',         satuan: 'tablet', stock: 480, par: 300, harga: 320,    supplier: 'Kimia Farma' },
  { sku: 'OBT-SIM',   nama: 'Simvastatin 10mg',          kategori: 'Anti-kolesterol', satuan: 'tablet', stock: 195, par: 150, harga: 880,    supplier: 'Kalbe' },
  { sku: 'OBT-INS',   nama: 'Insulin pen Lantus',        kategori: 'Anti-diabetes',   satuan: 'pen',    stock:  12, par:  15, harga: 215_000,supplier: 'Sanofi' },
  { sku: 'OBT-MR',    nama: 'Vaksin MR',                 kategori: 'Vaksin',          satuan: 'vial',   stock:  18, par:  20, harga: 95_000, supplier: 'Bio Farma' },
];

// Resep hari ini (terkait antrian yang done)
const RESEP = [
  { id: 'R-2026-0042', antrianNo: 'A-013', pasienId: 'P-00142', dokterId: 'D02', issuedAt: null,    status: 'pending',   items: [{ sku: 'OBT-PCT', qty: 10, sig: '3x1 prn demam' },{ sku: 'OBT-DEX', qty: 1, sig: '3x1 sdt' }] },
  { id: 'R-2026-0041', antrianNo: 'A-012', pasienId: 'P-01087', dokterId: 'D02', issuedAt: '13:50', status: 'dispensed', items: [{ sku: 'OBT-OMP', qty: 14, sig: '1x1 sebelum makan pagi' },{ sku: 'OBT-VIT', qty: 14, sig: '1x1' }] },
  { id: 'R-2026-0040', antrianNo: 'A-011', pasienId: 'P-01023', dokterId: 'D02', issuedAt: '13:22', status: 'dispensed', items: [{ sku: 'OBT-MET500', qty: 30, sig: '2x1 setelah makan' },{ sku: 'OBT-VIT', qty: 30, sig: '1x1' }] },
  { id: 'R-2026-0039', antrianNo: 'A-010', pasienId: 'P-00945', dokterId: 'D02', issuedAt: '12:50', status: 'dispensed', items: [{ sku: 'OBT-IBU', qty: 10, sig: '3x1 prn nyeri' }] },
  { id: 'R-2026-0038', antrianNo: 'A-009', pasienId: 'P-00891', dokterId: 'D01', issuedAt: '11:55', status: 'dispensed', items: [{ sku: 'OBT-AMX', qty: 15, sig: '3x1 selama 5 hari' },{ sku: 'OBT-DEX', qty: 1, sig: '3x1 sdt' },{ sku: 'OBT-PCT', qty: 10, sig: '3x1 prn demam' }] },
];

// Tagihan / billing summary hari ini
const BILLING_TODAY = ANTRIAN.filter(a => a.status === 'done').map((a, i) => ({
  id: `INV-2026-${(420 + i).toString().padStart(4, '0')}`,
  antrianNo: a.no,
  pasienId: a.pasienId,
  tipe: a.tipe,
  konsul: a.tipe === 'BPJS' ? 0 : 75_000,
  obat: [60_000, 28_000, 45_000, 180_000, 22_000, 38_000, 320_000, 36_000, 42_000, 18_000, 55_000, 32_000][i] || 30_000,
  paidAt: a.finishedAt,
}));

// KPI
const KPI = {
  pasienToday: ANTRIAN.length,
  pasienDone: ANTRIAN.filter(a => a.status === 'done').length,
  pasienWaiting: ANTRIAN.filter(a => a.status === 'waiting').length,
  pasienInRoom: ANTRIAN.filter(a => a.status === 'in-room').length,
  avgWaitMin: 14,
  avgConsultMin: 18,
  revenueToday: BILLING_TODAY.reduce((s, b) => s + b.konsul + b.obat, 0),
  bpjsClaim:    BILLING_TODAY.filter(b => b.tipe === 'BPJS').length,
};

// Trend kunjungan 14 hari
const VISITS_DAILY = [
  { date: '2026-04-09', total: 38 }, { date: '2026-04-10', total: 42 },
  { date: '2026-04-11', total: 28 }, { date: '2026-04-12', total: 12 }, // Minggu
  { date: '2026-04-13', total: 51 }, { date: '2026-04-14', total: 47 },
  { date: '2026-04-15', total: 44 }, { date: '2026-04-16', total: 49 },
  { date: '2026-04-17', total: 52 }, { date: '2026-04-18', total: 38 },
  { date: '2026-04-19', total: 14 }, // Minggu
  { date: '2026-04-20', total: 48 }, { date: '2026-04-21', total: 46 },
  { date: '2026-04-22', total: ANTRIAN.length }, // hari ini, ongoing
];

// Top diagnosis (30 hari)
const TOP_DX = [
  { dx: 'ISPA / Common cold',          count: 124, pct: 18 },
  { dx: 'Hipertensi (kontrol)',         count:  98, pct: 14 },
  { dx: 'DM Tipe 2 (kontrol)',          count:  72, pct: 10 },
  { dx: 'Gastritis / Dyspepsia',        count:  64, pct:  9 },
  { dx: 'Demam tifoid',                 count:  48, pct:  7 },
  { dx: 'Karies gigi',                  count:  42, pct:  6 },
  { dx: 'Imunisasi anak',               count:  38, pct:  5 },
  { dx: 'Lain-lain',                    count: 214, pct: 31 },
];

// Aktivitas terbaru
const ACTIVITY = [
  { id: 1, time: '14:25', text: 'A-014 Sdr. Yoga dipanggil ke Ruang 4 (dr. Dimas)', who: 'Suster Maya', urgent: false },
  { id: 2, time: '14:18', text: 'A-013 Ibu Sari masuk ruang konsultasi (dr. Bayu)', who: 'Suster Maya', urgent: false },
  { id: 3, time: '14:10', text: 'Stok Amoxicillin 500mg di bawah par (82/200)', who: 'Sistem', urgent: true },
  { id: 4, time: '13:50', text: 'Resep R-2026-0041 selesai dispensing (Ibu Lina)', who: 'Apt. Rini', urgent: false },
  { id: 5, time: '13:48', text: 'A-012 Ibu Lina selesai konsultasi', who: 'dr. Bayu', urgent: false },
  { id: 6, time: '13:30', text: 'Klaim BPJS hari ini: 11 kunjungan submitted', who: 'Suster Maya', urgent: false },
  { id: 7, time: '12:42', text: 'A-010 Ibu Ratna selesai (kontrol asam urat)', who: 'dr. Bayu', urgent: false },
];

// Helpers
function rupiah(n, opts = {}) {
  const { sym = false, compact = false } = opts;
  if (n == null || isNaN(n)) return '—';
  let s;
  if (compact && Math.abs(n) >= 1_000_000) s = (n / 1_000_000).toFixed(n % 1_000_000 ? 1 : 0).replace('.', ',') + ' jt';
  else if (compact && Math.abs(n) >= 1_000) s = (n / 1_000).toFixed(0).replace('.', ',') + ' rb';
  else s = Math.abs(n).toLocaleString('id-ID');
  return (sym ? 'Rp ' : '') + (n < 0 ? '−' : '') + s;
}

function formatDateID(iso) {
  const d = new Date(iso + 'T00:00:00');
  const days = ['Min','Sen','Sel','Rab','Kam','Jum','Sab'];
  const months = ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Agu','Sep','Okt','Nov','Des'];
  return `${days[d.getDay()]}, ${d.getDate()} ${months[d.getMonth()]} ${d.getFullYear()}`;
}

function minutesSince(hhmm) {
  if (!hhmm) return 0;
  const [h, m] = hhmm.split(':').map(Number);
  const [nh, nm] = NOW_HHMM.split(':').map(Number);
  return Math.max(0, (nh*60+nm) - (h*60+m));
}

function fmtMin(m) {
  if (m == null) return '—';
  if (m < 60) return `${m} min`;
  const h = Math.floor(m/60), mm = m%60;
  return mm ? `${h}j ${mm}m` : `${h}j`;
}

function totalBill(b) { return (b.konsul || 0) + (b.obat || 0); }

function statusTone(s) {
  return s === 'done' ? 'success'
    : s === 'in-room' ? 'warn'
    : s === 'waiting' ? 'accent'
    : s === 'pending' ? 'warn'
    : s === 'dispensed' ? 'success'
    : 'muted';
}

function statusLabel(s) {
  return s === 'done' ? 'Selesai'
    : s === 'in-room' ? 'Di Ruang'
    : s === 'waiting' ? 'Menunggu'
    : s === 'pending' ? 'Menunggu'
    : s === 'dispensed' ? 'Diserahkan'
    : s;
}

Object.assign(window, {
  TENANT, TODAY, NOW_HHMM, SHIFT, ROLES,
  DOKTER, PASIEN, PASIEN_BY_ID, ANTRIAN, REKAM_MEDIS, JADWAL,
  OBAT, RESEP, BILLING_TODAY, KPI, VISITS_DAILY, TOP_DX, ACTIVITY,
  rupiah, formatDateID, minutesSince, fmtMin, totalBill,
  statusTone, statusLabel,
});
