// Mock accounting data — SD Islam Cendekia Bangsa (PSAK 45-style yayasan)

const SCHOOL = {
  name: 'SD Islam Cendekia Bangsa',
  legal: 'Yayasan Pendidikan Cendekia Bangsa',
  short: 'A',
  npsn: '20104782',
  address: 'Jl. Anggrek Raya No. 12, Bandung',
  fiscalYear: '2025 / 2026',
};

const PERIOD_LIST = [
  { id: '2026-01', label: 'Januari 2026' },
  { id: '2026-02', label: 'Februari 2026' },
  { id: '2026-03', label: 'Maret 2026' },
  { id: '2026-04', label: 'April 2026' },
  { id: '2026-05', label: 'Mei 2026' },
];
const CURRENT_PERIOD = '2026-04';

const ROLES = {
  bendahara: {
    id: 'bendahara',
    name: 'Sari Lestari',
    title: 'Bendahara',
    initials: 'SL',
    can: { entry: true,  approve: false, export: true,  settings: true },
  },
  kepsek: {
    id: 'kepsek',
    name: 'H. Ahmad Rifqi',
    title: 'Kepala Sekolah',
    initials: 'AR',
    can: { entry: false, approve: true,  export: true,  settings: false },
  },
  auditor: {
    id: 'auditor',
    name: 'Lestariana Dewi',
    title: 'Auditor Yayasan',
    initials: 'LD',
    can: { entry: false, approve: false, export: true,  settings: false },
  },
};

// Chart of accounts
const ACCOUNTS = [
  // ASET LANCAR
  { code: '1-1010', name: 'Kas Kecil',                       group: 'Aset Lancar', type: 'aset' },
  { code: '1-1020', name: 'Bank BSI — Operasional',          group: 'Aset Lancar', type: 'aset' },
  { code: '1-1030', name: 'Bank Mandiri — Tabungan SPP',     group: 'Aset Lancar', type: 'aset' },
  { code: '1-1110', name: 'Piutang SPP',                     group: 'Aset Lancar', type: 'aset' },
  { code: '1-1120', name: 'Piutang Uang Pangkal',            group: 'Aset Lancar', type: 'aset' },
  { code: '1-1210', name: 'Persediaan Bahan Habis Pakai',    group: 'Aset Lancar', type: 'aset' },
  { code: '1-1310', name: 'Beban Dibayar Dimuka',            group: 'Aset Lancar', type: 'aset' },
  // ASET TETAP
  { code: '1-2010', name: 'Tanah',                           group: 'Aset Tetap',  type: 'aset' },
  { code: '1-2020', name: 'Bangunan Sekolah',                group: 'Aset Tetap',  type: 'aset' },
  { code: '1-2030', name: 'Peralatan & Mebel',               group: 'Aset Tetap',  type: 'aset' },
  { code: '1-2040', name: 'Kendaraan',                       group: 'Aset Tetap',  type: 'aset' },
  { code: '1-2090', name: 'Akumulasi Penyusutan',            group: 'Aset Tetap',  type: 'aset', contra: true },
  // LIABILITAS
  { code: '2-1010', name: 'Utang Usaha Vendor',              group: 'Liabilitas Jk Pendek', type: 'liabilitas' },
  { code: '2-1020', name: 'Utang Gaji',                      group: 'Liabilitas Jk Pendek', type: 'liabilitas' },
  { code: '2-1030', name: 'Utang Pajak PPh 21',              group: 'Liabilitas Jk Pendek', type: 'liabilitas' },
  { code: '2-1110', name: 'SPP Diterima Dimuka',             group: 'Liabilitas Jk Pendek', type: 'liabilitas' },
  // EKUITAS
  { code: '3-1010', name: 'Modal Yayasan',                   group: 'Ekuitas',     type: 'ekuitas' },
  { code: '3-1020', name: 'Surplus Akumulasi',               group: 'Ekuitas',     type: 'ekuitas' },
  // PENDAPATAN
  { code: '4-1010', name: 'Pendapatan SPP',                  group: 'Pendapatan Operasional',     type: 'pendapatan' },
  { code: '4-1020', name: 'Pendapatan Uang Pangkal',         group: 'Pendapatan Operasional',     type: 'pendapatan' },
  { code: '4-1030', name: 'Pendapatan Kegiatan Siswa',       group: 'Pendapatan Operasional',     type: 'pendapatan' },
  { code: '4-2010', name: 'Donasi & Hibah',                  group: 'Pendapatan Non-Operasional', type: 'pendapatan' },
  { code: '4-2020', name: 'Bunga Bank',                      group: 'Pendapatan Non-Operasional', type: 'pendapatan' },
  // BEBAN
  { code: '5-1010', name: 'Gaji Guru & Karyawan',            group: 'Beban Operasional', type: 'beban' },
  { code: '5-1020', name: 'Tunjangan & Honor',               group: 'Beban Operasional', type: 'beban' },
  { code: '5-1030', name: 'Beban Listrik, Air, Internet',    group: 'Beban Operasional', type: 'beban' },
  { code: '5-1040', name: 'Beban Bahan Habis Pakai',         group: 'Beban Operasional', type: 'beban' },
  { code: '5-1050', name: 'Beban Pemeliharaan',              group: 'Beban Operasional', type: 'beban' },
  { code: '5-1060', name: 'Beban Kegiatan Siswa',            group: 'Beban Operasional', type: 'beban' },
  { code: '5-2010', name: 'Beban Penyusutan',                group: 'Beban Non-Tunai',   type: 'beban' },
  { code: '5-3010', name: 'Beban Administrasi Bank',         group: 'Beban Lainnya',     type: 'beban' },
];
const ACC = Object.fromEntries(ACCOUNTS.map(a => [a.code, a]));

// Opening balances (1 April 2026)
const OPENING_BALANCES = {
  '1-1010':    8_450_000,
  '1-1020':  214_320_000,
  '1-1030':  186_750_000,
  '1-1110':   72_400_000,
  '1-1120':   18_500_000,
  '1-1210':    6_120_000,
  '1-1310':    4_800_000,
  '1-2010': 1_200_000_000,
  '1-2020': 2_450_000_000,
  '1-2030':  178_000_000,
  '1-2040':   95_000_000,
  '1-2090': -612_400_000,
  '2-1010':   24_600_000,
  '2-1020':   38_200_000,
  '2-1030':    9_840_000,
  '2-1110':   46_500_000,
  '3-1010': 3_000_000_000,
  '3-1020':  702_800_000,
};

// Journal entries (April 2026)
const JOURNALS = [
  { id: 'JV-2604-001', date: '2026-04-01', ref: 'BSI-IN-0401', desc: 'Penerimaan SPP April — gel. 1 (124 siswa)', status: 'posted', lines: [
    { code: '1-1020', debit: 96_750_000, credit: 0 },
    { code: '4-1010', debit: 0, credit: 96_750_000 },
  ]},
  { id: 'JV-2604-002', date: '2026-04-02', ref: 'KAS-OUT-0402', desc: 'Pembayaran listrik PLN — Maret 2026', status: 'posted', lines: [
    { code: '5-1030', debit: 8_240_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 8_240_000 },
  ]},
  { id: 'JV-2604-003', date: '2026-04-02', ref: 'KAS-OUT-0403', desc: 'Pembelian ATK & bahan habis pakai (CV Mitra Pena)', status: 'posted', lines: [
    { code: '1-1210', debit: 3_450_000, credit: 0 },
    { code: '1-1010', debit: 0, credit: 3_450_000 },
  ]},
  { id: 'JV-2604-004', date: '2026-04-03', ref: 'BSI-IN-0404', desc: 'Penerimaan uang pangkal kelas 1 — 4 siswa baru', status: 'posted', lines: [
    { code: '1-1020', debit: 26_000_000, credit: 0 },
    { code: '4-1020', debit: 0, credit: 26_000_000 },
  ]},
  { id: 'JV-2604-005', date: '2026-04-04', ref: 'KAS-OUT-0405', desc: 'Pemeliharaan AC & instalasi listrik (PT Tata Jaya)', status: 'posted', lines: [
    { code: '5-1050', debit: 4_750_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 4_750_000 },
  ]},
  { id: 'JV-2604-006', date: '2026-04-05', ref: 'BSI-IN-0406', desc: 'Donasi alumni angkatan 1998', status: 'posted', lines: [
    { code: '1-1020', debit: 15_000_000, credit: 0 },
    { code: '4-2010', debit: 0, credit: 15_000_000 },
  ]},
  { id: 'JV-2604-007', date: '2026-04-07', ref: 'BSI-IN-0407', desc: 'Penerimaan SPP April — gel. 2 (62 siswa)', status: 'posted', lines: [
    { code: '1-1020', debit: 48_360_000, credit: 0 },
    { code: '4-1010', debit: 0, credit: 48_360_000 },
  ]},
  { id: 'JV-2604-008', date: '2026-04-08', ref: 'KAS-OUT-0408', desc: 'Beban internet & telepon — XL Business', status: 'posted', lines: [
    { code: '5-1030', debit: 2_180_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 2_180_000 },
  ]},
  { id: 'JV-2604-009', date: '2026-04-10', ref: 'KAS-OUT-0410', desc: 'Pembelian printer Epson L3210 (inv aset)', status: 'posted', lines: [
    { code: '1-2030', debit: 3_650_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 3_650_000 },
  ]},
  { id: 'JV-2604-010', date: '2026-04-12', ref: 'BSI-IN-0412', desc: 'Penerimaan SPP April — gel. 3 (28 siswa)', status: 'posted', lines: [
    { code: '1-1020', debit: 21_840_000, credit: 0 },
    { code: '4-1010', debit: 0, credit: 21_840_000 },
  ]},
  { id: 'JV-2604-011', date: '2026-04-14', ref: 'KAS-OUT-0414', desc: 'Kegiatan study tour kelas 5 — bus & konsumsi', status: 'posted', lines: [
    { code: '5-1060', debit: 12_400_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 12_400_000 },
  ]},
  { id: 'JV-2604-012', date: '2026-04-14', ref: 'BSI-IN-0414', desc: 'Pendapatan kegiatan study tour — kontribusi orang tua', status: 'posted', lines: [
    { code: '1-1020', debit: 14_800_000, credit: 0 },
    { code: '4-1030', debit: 0, credit: 14_800_000 },
  ]},
  { id: 'JV-2604-013', date: '2026-04-15', ref: 'KAS-OUT-0415', desc: 'Pembayaran utang vendor CV Mitra Pena (jatuh tempo)', status: 'posted', lines: [
    { code: '2-1010', debit: 6_200_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 6_200_000 },
  ]},
  { id: 'JV-2604-014', date: '2026-04-18', ref: 'BSI-IN-0418', desc: 'Penerimaan SPP April — gel. 4 (telat, 18 siswa)', status: 'posted', lines: [
    { code: '1-1020', debit: 14_040_000, credit: 0 },
    { code: '4-1010', debit: 0, credit: 14_040_000 },
  ]},
  { id: 'JV-2604-015', date: '2026-04-20', ref: 'BNK-FEE-0420', desc: 'Biaya administrasi bulanan rekening BSI', status: 'posted', lines: [
    { code: '5-3010', debit: 180_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 180_000 },
  ]},
  { id: 'JV-2604-016', date: '2026-04-22', ref: 'KAS-OUT-0422', desc: 'Pelatihan guru — sertifikasi Asesmen Nasional', status: 'posted', lines: [
    { code: '5-1020', debit: 9_500_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 9_500_000 },
  ]},
  { id: 'JV-2604-017', date: '2026-04-24', ref: 'KAS-OUT-0424', desc: 'Pengadaan buku bacaan perpustakaan (Mizan Publika)', status: 'posted', lines: [
    { code: '5-1040', debit: 5_280_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 5_280_000 },
  ]},
  { id: 'JV-2604-018', date: '2026-04-25', ref: 'PAY-2604', desc: 'Pembayaran gaji bulan April — 28 guru, 6 karyawan', status: 'posted', lines: [
    { code: '5-1010', debit: 124_500_000, credit: 0 },
    { code: '5-1020', debit:  18_200_000, credit: 0 },
    { code: '1-1020', debit: 0, credit: 138_840_000 },
    { code: '2-1030', debit: 0, credit:   3_860_000 },
  ]},
  { id: 'JV-2604-019', date: '2026-04-27', ref: 'BSI-IN-0427', desc: 'Penerimaan piutang SPP Maret — 9 siswa', status: 'posted', lines: [
    { code: '1-1020', debit: 7_020_000, credit: 0 },
    { code: '1-1110', debit: 0, credit: 7_020_000 },
  ]},
  { id: 'JV-2604-020', date: '2026-04-28', ref: 'ADJ-DEP-0426', desc: 'Penyesuaian penyusutan bulan April', status: 'posted', lines: [
    { code: '5-2010', debit: 8_600_000, credit: 0 },
    { code: '1-2090', debit: 0, credit: 8_600_000 },
  ]},
  { id: 'JV-2604-021', date: '2026-04-29', ref: 'BSI-IN-0429', desc: 'Bunga tabungan bulan April — Bank BSI', status: 'posted', lines: [
    { code: '1-1020', debit: 642_500, credit: 0 },
    { code: '4-2020', debit: 0, credit: 642_500 },
  ]},
  { id: 'JV-2604-022', date: '2026-04-29', ref: 'ADJ-PIUT-0429', desc: 'Pengakuan piutang SPP April siswa yg belum bayar (16 siswa)', status: 'pending', lines: [
    { code: '1-1110', debit: 12_480_000, credit: 0 },
    { code: '4-1010', debit: 0, credit: 12_480_000 },
  ]},
  { id: 'JV-2604-023', date: '2026-04-30', ref: 'KAS-OUT-0430', desc: 'Honor pengawas ujian tengah semester', status: 'pending', lines: [
    { code: '5-1020', debit: 4_200_000, credit: 0 },
    { code: '1-1010', debit: 0, credit: 4_200_000 },
  ]},
];

// Fixed asset register
const FIXED_ASSETS = [
  { id: 'FA-001', name: 'Tanah Lokasi Utama',           cat: 'Tanah',      acquired: '2014-07-01', cost: 1_200_000_000, useful: 0,  accum: 0,           net: 1_200_000_000, loc: 'Jl. Anggrek Raya 12' },
  { id: 'FA-002', name: 'Gedung Utama 3 Lantai',        cat: 'Bangunan',   acquired: '2014-08-15', cost: 2_100_000_000, useful: 20, accum: 472_500_000, net: 1_627_500_000, loc: 'Lokasi Utama' },
  { id: 'FA-003', name: 'Gedung Anex (Lab + Aula)',     cat: 'Bangunan',   acquired: '2020-01-10', cost:   350_000_000, useful: 20, accum:  92_400_000, net:   257_600_000, loc: 'Lokasi Utama' },
  { id: 'FA-004', name: 'Mobil Antar-Jemput Elf',       cat: 'Kendaraan',  acquired: '2022-06-20', cost:    95_000_000, useful: 8,  accum:  35_100_000, net:    59_900_000, loc: 'Garasi sekolah' },
  { id: 'FA-005', name: '120 Set Meja-Kursi Siswa',     cat: 'Mebel',      acquired: '2023-07-12', cost:    84_000_000, useful: 8,  accum:  24_000_000, net:    60_000_000, loc: 'Ruang Kelas 1-6' },
  { id: 'FA-006', name: '24 Komputer Lab + 1 Proyektor',cat: 'Peralatan',  acquired: '2024-09-04', cost:    78_000_000, useful: 5,  accum:  25_100_000, net:    52_900_000, loc: 'Lab Komputer' },
  { id: 'FA-007', name: 'Printer Epson L3210 (April)',  cat: 'Peralatan',  acquired: '2026-04-10', cost:     3_650_000, useful: 4,  accum:      76_000, net:     3_574_000, loc: 'TU' },
];

// Derived expense view (one row per beban-debit line)
const EXPENSES = JOURNALS.flatMap(j =>
  j.lines.filter(l => ACC[l.code]?.type === 'beban' && l.debit > 0).map(l => ({
    id: j.id + ':' + l.code,
    date: j.date,
    ref: j.ref,
    desc: j.desc,
    category: ACC[l.code].name,
    amount: l.debit,
    status: j.status,
  }))
);

// ── Helpers ─────────────────────────────────────────────────────────────────

function rupiah(n, opts = {}) {
  if (n == null || isNaN(n)) return '—';
  const sign = n < 0 ? '-' : '';
  const abs = Math.abs(Math.round(n));
  if (opts.compact && abs >= 1_000_000) {
    if (abs >= 1_000_000_000) return sign + (abs / 1_000_000_000).toFixed(2).replace('.', ',') + ' M';
    return sign + (abs / 1_000_000).toFixed(1).replace('.', ',') + ' jt';
  }
  const str = abs.toLocaleString('id-ID');
  return (opts.sym ? 'Rp ' : '') + sign + str;
}

function formatDateID(iso) {
  if (!iso) return '—';
  const m = ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Agu','Sep','Okt','Nov','Des'];
  const d = new Date(iso);
  return `${d.getDate()} ${m[d.getMonth()]} ${d.getFullYear()}`;
}

function periodLabel(id) {
  return PERIOD_LIST.find(p => p.id === id)?.label || id;
}

function accountMovement(code, period) {
  return JOURNALS.reduce((acc, j) => {
    if (!j.date.startsWith(period)) return acc;
    j.lines.forEach(l => {
      if (l.code === code) {
        acc.debit  += l.debit  || 0;
        acc.credit += l.credit || 0;
      }
    });
    return acc;
  }, { debit: 0, credit: 0 });
}

function accountClosing(code, period = CURRENT_PERIOD) {
  const a = ACC[code];
  const opening = OPENING_BALANCES[code] || 0;
  const m = accountMovement(code, period);
  if (['aset', 'beban'].includes(a.type)) return opening + m.debit - m.credit;
  return opening + m.credit - m.debit;
}

function hash(s) {
  let h = 0;
  for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0;
  return h;
}

Object.assign(window, {
  SCHOOL, PERIOD_LIST, CURRENT_PERIOD, ROLES,
  ACCOUNTS, ACC, OPENING_BALANCES, JOURNALS, FIXED_ASSETS, EXPENSES,
  rupiah, formatDateID, periodLabel, accountMovement, accountClosing, hash,
});
