// Koperasi Simpan Pinjam — Koperasi Karya Bersama (fictional employee cooperative)
// Periode demo: April 2026

const TENANT = {
  name: 'Koperasi Karya Bersama',
  tagline: 'Simpan Pinjam Karyawan dan UMKM Komunitas',
  address: 'Jl. Raya Condet No. 41, Jakarta Timur 13530',
  badanHukum: 'BH No. 174/BH/KDK.9.4/III/2018',
  npwp: '03.512.844.7-005.000',
  phone: '021-8092-***',
  rapatAnggota: '2026-05-18',
};

const TODAY = '2026-04-22';
const PERIODE = '2026-04';
const PERIODE_LABEL = 'April 2026';

const ROLES = {
  teller:    { name: 'Nur Aisyah',       role: 'Teller Koperasi' },
  kredit:    { name: 'Bambang Riyadi',   role: 'Analis Kredit' },
  bendahara: { name: 'Dian Permatasari', role: 'Bendahara' },
  ketua:     { name: 'H. Mahmud Fauzi',  role: 'Ketua Koperasi' },
};

const UNIT = [
  { id: 'KRY', name: 'Karyawan Pabrik', targetSimpanan: 120_000_000 },
  { id: 'UMK', name: 'UMKM Binaan',     targetSimpanan:  80_000_000 },
  { id: 'PAS', name: 'Pedagang Pasar',  targetSimpanan:  70_000_000 },
  { id: 'GUR', name: 'Guru Honorer',    targetSimpanan:  45_000_000 },
];

const DEPAN = ['Agus','Aminah','Budi','Citra','Darma','Euis','Fikri','Gita','Hasan','Ika','Joko','Kartika','Lukman','Maya','Nurdin','Oktavia','Purnomo','Ratih','Slamet','Tini','Ujang','Vera','Wawan','Yanti','Zaenal','Rina','Bayu','Sari','Hendra','Nia','Rudi','Lilis','Taufik','Dewi','Arman','Putri','Yoga','Mira','Fajar','Novi','Dedi','Yulia'];
const BLKG = ['Santoso','Wijaya','Hidayat','Suryani','Pratama','Kusuma','Maulana','Saputra','Lestari','Permana','Setiawan','Nugroho','Anjani','Halim','Utomo','Rahmawati'];

const ANGGOTA = Array.from({ length: 42 }, (_, i) => {
  const no = 2301 + i;
  const unit = UNIT[i % UNIT.length];
  const nama = `${DEPAN[i % DEPAN.length]} ${BLKG[(i * 5) % BLKG.length]}`;
  const masukYear = 2019 + (i % 7);
  const masukMonth = String(((i * 3) % 12) + 1).padStart(2, '0');
  const masukDay = String(((i * 7) % 26) + 1).padStart(2, '0');
  const simpananPokok = 500_000;
  const simpananWajib = 50_000 * (18 + (i % 42));
  const simpananSukarela = 250_000 * ((i * 7) % 24);
  return {
    id: `AG-${no}`,
    nama,
    unitId: unit.id,
    unit: unit.name,
    status: i % 19 === 3 ? 'nonaktif' : 'aktif',
    masuk: `${masukYear}-${masukMonth}-${masukDay}`,
    pekerjaan: unit.id === 'KRY' ? 'Operator Produksi' : unit.id === 'UMK' ? 'Pelaku UMKM' : unit.id === 'PAS' ? 'Pedagang' : 'Guru Honorer',
    phone: `08${12 + (i % 7)}***${(430 + i * 17).toString().slice(-3)}`,
    alamat: ['Cililitan','Condet','Kramat Jati','Pasar Rebo','Duren Sawit','Jatinegara'][i % 6],
    simpananPokok,
    simpananWajib,
    simpananSukarela,
  };
});

const ANGGOTA_BY_ID = Object.fromEntries(ANGGOTA.map(a => [a.id, a]));

const PINJAMAN = [
  { id:'PJ-2026-0042', anggotaId:'AG-2302', tanggal:'2026-04-21', jenis:'Modal Usaha', plafon:12_000_000, tenor:12, bunga:1.2, outstanding:11_250_000, status:'aktif', tujuan:'Tambah stok sembako warung' },
  { id:'PJ-2026-0041', anggotaId:'AG-2305', tanggal:'2026-04-18', jenis:'Konsumtif',   plafon: 6_000_000, tenor:10, bunga:1.0, outstanding: 5_400_000, status:'aktif', tujuan:'Biaya pendidikan anak' },
  { id:'PJ-2026-0040', anggotaId:'AG-2311', tanggal:'2026-04-16', jenis:'Darurat',     plafon: 3_500_000, tenor: 6, bunga:0.8, outstanding: 3_100_000, status:'aktif', tujuan:'Biaya berobat keluarga' },
  { id:'PJ-2026-0039', anggotaId:'AG-2316', tanggal:'2026-04-10', jenis:'Modal Usaha', plafon:18_000_000, tenor:18, bunga:1.2, outstanding:16_800_000, status:'aktif', tujuan:'Renovasi kios pasar' },
  { id:'PJ-2026-0038', anggotaId:'AG-2321', tanggal:'2026-04-08', jenis:'Konsumtif',   plafon: 8_500_000, tenor:12, bunga:1.0, outstanding: 7_900_000, status:'aktif', tujuan:'Pembelian motor bekas' },
  { id:'PJ-2026-0037', anggotaId:'AG-2327', tanggal:'2026-04-03', jenis:'Modal Usaha', plafon:15_000_000, tenor:12, bunga:1.2, outstanding:13_700_000, status:'aktif', tujuan:'Modal catering rumahan' },
  { id:'PJ-2026-0036', anggotaId:'AG-2334', tanggal:'2026-03-28', jenis:'Konsumtif',   plafon: 5_000_000, tenor: 8, bunga:1.0, outstanding: 3_750_000, status:'aktif', tujuan:'Perbaikan rumah' },
  { id:'PJ-2026-0035', anggotaId:'AG-2338', tanggal:'2026-03-21', jenis:'Modal Usaha', plafon:10_000_000, tenor:10, bunga:1.2, outstanding: 7_600_000, status:'aktif', tujuan:'Beli etalase dagang' },
  { id:'PJ-2026-0034', anggotaId:'AG-2340', tanggal:'2026-03-18', jenis:'Darurat',     plafon: 2_500_000, tenor: 5, bunga:0.8, outstanding: 1_500_000, status:'aktif', tujuan:'Kebutuhan keluarga mendadak' },
  { id:'PJ-2026-0033', anggotaId:'AG-2308', tanggal:'2026-03-12', jenis:'Modal Usaha', plafon:20_000_000, tenor:20, bunga:1.2, outstanding:17_950_000, status:'aktif', tujuan:'Mesin jahit tambahan' },
  { id:'APP-2026-0017', anggotaId:'AG-2319', tanggal:'2026-04-22', jenis:'Modal Usaha', plafon: 9_000_000, tenor:12, bunga:1.2, outstanding:0, status:'pending', tujuan:'Modal jualan takjil musiman' },
  { id:'APP-2026-0016', anggotaId:'AG-2325', tanggal:'2026-04-20', jenis:'Konsumtif',   plafon: 4_000_000, tenor: 8, bunga:1.0, outstanding:0, status:'pending', tujuan:'Laptop sekolah anak' },
];

const ANGSURAN = [
  { id:'ANG-2026-0871', pinjamanId:'PJ-2026-0042', tanggal:'2026-04-22', jatuhTempo:'2026-04-25', pokok:750_000, jasa:144_000, denda:0, status:'paid' },
  { id:'ANG-2026-0870', pinjamanId:'PJ-2026-0041', tanggal:'2026-04-22', jatuhTempo:'2026-04-25', pokok:600_000, jasa:60_000,  denda:0, status:'paid' },
  { id:'ANG-2026-0869', pinjamanId:'PJ-2026-0040', tanggal:null,         jatuhTempo:'2026-04-20', pokok:580_000, jasa:28_000,  denda:15_000, status:'late' },
  { id:'ANG-2026-0868', pinjamanId:'PJ-2026-0039', tanggal:'2026-04-21', jatuhTempo:'2026-04-21', pokok:1_000_000, jasa:216_000, denda:0, status:'paid' },
  { id:'ANG-2026-0867', pinjamanId:'PJ-2026-0038', tanggal:null,         jatuhTempo:'2026-04-22', pokok:710_000, jasa:85_000,  denda:0, status:'due' },
  { id:'ANG-2026-0866', pinjamanId:'PJ-2026-0037', tanggal:'2026-04-19', jatuhTempo:'2026-04-20', pokok:1_250_000, jasa:180_000, denda:0, status:'paid' },
  { id:'ANG-2026-0865', pinjamanId:'PJ-2026-0036', tanggal:null,         jatuhTempo:'2026-04-18', pokok:625_000, jasa:50_000,  denda:20_000, status:'late' },
];

function pinjamanById(id) { return PINJAMAN.find(p => p.id === id); }

const LEDGER = [
  { id:'GL-2026-0412', date:'2026-04-22', account:'Kas Teller', desc:'Angsuran PJ-2026-0042 AG-2302', debit:894_000, credit:0, ref:'ANG-2026-0871' },
  { id:'GL-2026-0411', date:'2026-04-22', account:'Piutang Anggota', desc:'Pokok angsuran PJ-2026-0042', debit:0, credit:750_000, ref:'ANG-2026-0871' },
  { id:'GL-2026-0410', date:'2026-04-22', account:'Pendapatan Jasa', desc:'Jasa pinjaman PJ-2026-0042', debit:0, credit:144_000, ref:'ANG-2026-0871' },
  { id:'GL-2026-0409', date:'2026-04-22', account:'Kas Teller', desc:'Setoran simpanan wajib AG-2320', debit:50_000, credit:0, ref:'SMP-2026-1021' },
  { id:'GL-2026-0408', date:'2026-04-22', account:'Simpanan Wajib', desc:'Setoran simpanan wajib AG-2320', debit:0, credit:50_000, ref:'SMP-2026-1021' },
  { id:'GL-2026-0407', date:'2026-04-21', account:'Kas Bank', desc:'Pencairan pinjaman AG-2302', debit:0, credit:12_000_000, ref:'PJ-2026-0042' },
  { id:'GL-2026-0406', date:'2026-04-21', account:'Piutang Anggota', desc:'Pencairan pinjaman AG-2302', debit:12_000_000, credit:0, ref:'PJ-2026-0042' },
  { id:'GL-2026-0405', date:'2026-04-21', account:'Kas Teller', desc:'Angsuran PJ-2026-0039 AG-2316', debit:1_216_000, credit:0, ref:'ANG-2026-0868' },
  { id:'GL-2026-0404', date:'2026-04-20', account:'Kas Teller', desc:'Setoran simpanan sukarela AG-2314', debit:300_000, credit:0, ref:'SMP-2026-1018' },
  { id:'GL-2026-0403', date:'2026-04-20', account:'Simpanan Sukarela', desc:'Setoran simpanan sukarela AG-2314', debit:0, credit:300_000, ref:'SMP-2026-1018' },
  { id:'GL-2026-0402', date:'2026-04-19', account:'Kas Teller', desc:'Angsuran PJ-2026-0037 AG-2327', debit:1_430_000, credit:0, ref:'ANG-2026-0866' },
  { id:'GL-2026-0401', date:'2026-04-19', account:'Pendapatan Administrasi', desc:'Biaya admin anggota baru', debit:0, credit:75_000, ref:'ADM-2026-088' },
];

const CASHFLOW_DAILY = [
  { date:'2026-04-15', masuk:3_250_000, keluar:0 },
  { date:'2026-04-16', masuk:2_800_000, keluar:5_000_000 },
  { date:'2026-04-17', masuk:4_120_000, keluar:0 },
  { date:'2026-04-18', masuk:1_750_000, keluar:2_500_000 },
  { date:'2026-04-19', masuk:4_330_000, keluar:0 },
  { date:'2026-04-20', masuk:5_950_000, keluar:0 },
  { date:'2026-04-21', masuk:3_760_000, keluar:12_000_000 },
  { date:'2026-04-22', masuk:2_308_000, keluar:0 },
];

const ACTIVITY = [
  { id:1, time:'14:20', text:'Angsuran AG-2302 diterima teller: Rp 894.000', who:'Nur Aisyah', urgent:false },
  { id:2, time:'13:55', text:'Pengajuan APP-2026-0017 menunggu komite kredit', who:'Bambang', urgent:true },
  { id:3, time:'12:40', text:'Setoran simpanan wajib AG-2320 tercatat', who:'Nur Aisyah', urgent:false },
  { id:4, time:'11:10', text:'ANG-2026-0869 lewat jatuh tempo, denda Rp 15.000', who:'Sistem', urgent:true },
  { id:5, time:'Kemarin', text:'Pencairan pinjaman PJ-2026-0042 Rp 12.000.000', who:'Dian', urgent:false },
];

const totalSimpananPokok = ANGGOTA.reduce((s,a) => s + a.simpananPokok, 0);
const totalSimpananWajib = ANGGOTA.reduce((s,a) => s + a.simpananWajib, 0);
const totalSimpananSukarela = ANGGOTA.reduce((s,a) => s + a.simpananSukarela, 0);
const totalSimpanan = totalSimpananPokok + totalSimpananWajib + totalSimpananSukarela;
const outstanding = PINJAMAN.filter(p => p.status === 'aktif').reduce((s,p) => s + p.outstanding, 0);
const pendingPinjaman = PINJAMAN.filter(p => p.status === 'pending').length;
const kas = LEDGER.reduce((s,l) => s + l.debit - l.credit, 86_000_000);

const KPI = {
  anggotaAktif: ANGGOTA.filter(a => a.status === 'aktif').length,
  anggotaTotal: ANGGOTA.length,
  totalSimpanan,
  totalSimpananPokok,
  totalSimpananWajib,
  totalSimpananSukarela,
  outstanding,
  pendingPinjaman,
  angsuranLate: ANGSURAN.filter(a => a.status === 'late').length,
  kas,
  shuYtd: 42_750_000,
};

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_000) s = (n / 1_000_000_000).toFixed(1).replace('.', ',') + ' M';
  else 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 initials(name) {
  return name.split(' ').slice(0,2).map(w => w[0]).join('').toUpperCase();
}

function totalSimpananAnggota(a) { return a.simpananPokok + a.simpananWajib + a.simpananSukarela; }
function totalAngsuran(a) { return a.pokok + a.jasa + a.denda; }

function statusLabel(s) {
  return s === 'aktif' ? 'Aktif'
    : s === 'nonaktif' ? 'Nonaktif'
    : s === 'pending' ? 'Menunggu'
    : s === 'paid' ? 'Lunas'
    : s === 'late' ? 'Terlambat'
    : s === 'due' ? 'Jatuh Tempo'
    : s;
}

function statusTone(s) {
  return s === 'aktif' || s === 'paid' ? 'success'
    : s === 'pending' || s === 'due' ? 'warn'
    : s === 'late' || s === 'nonaktif' ? 'danger'
    : 'neutral';
}

Object.assign(window, {
  TENANT, TODAY, PERIODE, PERIODE_LABEL, ROLES, UNIT,
  ANGGOTA, ANGGOTA_BY_ID, PINJAMAN, ANGSURAN, LEDGER, CASHFLOW_DAILY, ACTIVITY, KPI,
  pinjamanById, rupiah, formatDateID, initials, totalSimpananAnggota, totalAngsuran,
  statusLabel, statusTone,
});
