// Financial reports: Neraca (Balance Sheet), LabaRugi (Income), ArusKas (Cash Flow).

// ── Shared row primitives ──────────────────────────────────────────────────

function BalanceRow({ code, name, current, prior, indent = 0 }) {
  return (
    <div className="balance-row">
      <div className="balance-row-label" style={{paddingLeft: indent * 16}}>
        {code && <span className="acct-code">{code}</span>}
        <span>{name}</span>
      </div>
      <div className="balance-row-value tnum">{rupiah(current)}</div>
      <div className="balance-row-value tnum muted">{rupiah(prior)}</div>
    </div>
  );
}

function BalanceSubtotal({ label, current, prior }) {
  return (
    <div className="balance-row balance-subtotal">
      <div className="balance-row-label" style={{fontWeight:600}}>{label}</div>
      <div className="balance-row-value tnum">{rupiah(current)}</div>
      <div className="balance-row-value tnum muted">{rupiah(prior)}</div>
    </div>
  );
}

function BalanceGrand({ label, current, prior }) {
  return (
    <div className="balance-row balance-grand">
      <div className="balance-row-label">{label}</div>
      <div className="balance-row-value tnum">{rupiah(current, { sym: true })}</div>
      <div className="balance-row-value tnum">{rupiah(prior, { sym: true })}</div>
    </div>
  );
}

function ReportColsHeader({ current, prior }) {
  return (
    <div className="balance-row" style={{borderBottom:'1px solid hsl(var(--border))', paddingBottom:8, marginBottom:6}}>
      <div className="balance-row-label" style={{fontSize:11, textTransform:'uppercase', letterSpacing:'0.06em', color:'hsl(var(--muted-foreground))', fontWeight:600}}>Akun</div>
      <div className="balance-row-value" style={{fontSize:11, textTransform:'uppercase', letterSpacing:'0.06em', color:'hsl(var(--muted-foreground))', fontWeight:600, textAlign:'right'}}>{current}</div>
      <div className="balance-row-value" style={{fontSize:11, textTransform:'uppercase', letterSpacing:'0.06em', color:'hsl(var(--muted-foreground))', fontWeight:600, textAlign:'right'}}>{prior}</div>
    </div>
  );
}

// ── Neraca (Balance Sheet) ─────────────────────────────────────────────────

function priorPeriod(period) {
  const [y, m] = period.split('-').map(Number);
  const pm = m === 1 ? 12 : m - 1;
  const py = m === 1 ? y - 1 : y;
  return `${py}-${String(pm).padStart(2,'0')}`;
}

function Neraca({ period }) {
  const prior = priorPeriod(period);
  const curLabel = periodLabel(period);
  const priorLabel = periodLabel(prior);

  // Asset accounts
  const liaCodes   = ACCOUNTS.filter(a => a.type === 'liabilitas').map(a => a.code);
  const eqCodes    = ACCOUNTS.filter(a => a.type === 'ekuitas').map(a => a.code);

  // For prior period we approximate using OPENING_BALANCES (period start)
  const valCur = (code) => accountClosing(code, period);
  const valPrior = (code) => OPENING_BALANCES[code] || 0;

  const sumGroup = (codes, fn) => codes.reduce((s, c) => s + fn(c), 0);

  const lancarCodes  = ['1-1010','1-1020','1-1030','1-1110','1-1120','1-1210','1-1310'];
  const tetapCodes   = ['1-2010','1-2020','1-2030','1-2040','1-2090'];

  const totalAsetLancar = sumGroup(lancarCodes, valCur);
  const totalAsetTetap  = sumGroup(tetapCodes, valCur);
  const totalAset = totalAsetLancar + totalAsetTetap;

  const totalAsetLancarPrior = sumGroup(lancarCodes, valPrior);
  const totalAsetTetapPrior  = sumGroup(tetapCodes, valPrior);
  const totalAsetPrior = totalAsetLancarPrior + totalAsetTetapPrior;

  const totalLia = sumGroup(liaCodes, valCur);
  const totalLiaPrior = sumGroup(liaCodes, valPrior);

  // Equity = saldo awal ekuitas + surplus periode berjalan
  const surplusPeriode = (() => {
    const rev = ['4-1010','4-1020','4-1030','4-2010','4-2020'].reduce((s, c) => s + accountMovement(c, period).credit, 0);
    const exp = ['5-1010','5-1020','5-1030','5-1040','5-1050','5-1060','5-2010','5-3010'].reduce((s, c) => s + accountMovement(c, period).debit, 0);
    return rev - exp;
  })();
  const ekuitasAwal = sumGroup(eqCodes, valPrior);
  const totalEkuitas = ekuitasAwal + surplusPeriode;
  const totalLiaEkuitas = totalLia + totalEkuitas;
  const totalLiaEkuitasPrior = totalLiaPrior + ekuitasAwal;

  const balanced = Math.abs(totalAset - totalLiaEkuitas) < 1;

  return (
    <div className="col gap-4">
      <ReportHeader
        title={`Posisi Keuangan · ${SCHOOL.name}`}
        subtitle="Laporan Posisi Keuangan"
        meta={`Per ${formatDateID(period + '-30')} (komparatif dengan ${priorLabel})`}
      />

      <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:14}}>
        {/* ASET */}
        <Card>
          <div className="card-header">
            <div className="card-title">Aset</div>
            {balanced && <Pill tone="ok" dot>Seimbang</Pill>}
          </div>
          <div className="card-body">
            <ReportColsHeader current={curLabel} prior={priorLabel} />
            <div className="balance-section">
              <div className="balance-section-title">Aset Lancar</div>
              {lancarCodes.map(c => {
                const acc = ACC[c];
                return <BalanceRow key={c} code={c} name={acc.name} current={valCur(c)} prior={valPrior(c)} indent={1} />;
              })}
              <BalanceSubtotal label="Jumlah Aset Lancar" current={totalAsetLancar} prior={totalAsetLancarPrior} />
            </div>
            <div className="balance-section">
              <div className="balance-section-title">Aset Tetap</div>
              {tetapCodes.map(c => {
                const acc = ACC[c];
                return <BalanceRow key={c} code={c} name={acc.name} current={valCur(c)} prior={valPrior(c)} indent={1} />;
              })}
              <BalanceSubtotal label="Jumlah Aset Tetap (Net)" current={totalAsetTetap} prior={totalAsetTetapPrior} />
            </div>
            <BalanceGrand label="TOTAL ASET" current={totalAset} prior={totalAsetPrior} />
          </div>
        </Card>

        {/* LIABILITAS + EKUITAS */}
        <Card>
          <div className="card-header">
            <div className="card-title">Liabilitas & Ekuitas</div>
            {!balanced && <Pill tone="warn" dot>Selisih {rupiah(totalAset - totalLiaEkuitas, {compact:true})}</Pill>}
          </div>
          <div className="card-body">
            <ReportColsHeader current={curLabel} prior={priorLabel} />
            <div className="balance-section">
              <div className="balance-section-title">Liabilitas</div>
              {liaCodes.map(c => {
                const acc = ACC[c];
                return <BalanceRow key={c} code={c} name={acc.name} current={valCur(c)} prior={valPrior(c)} indent={1} />;
              })}
              <BalanceSubtotal label="Jumlah Liabilitas" current={totalLia} prior={totalLiaPrior} />
            </div>
            <div className="balance-section">
              <div className="balance-section-title">Ekuitas</div>
              {eqCodes.map(c => {
                const acc = ACC[c];
                return <BalanceRow key={c} code={c} name={acc.name} current={valPrior(c)} prior={valPrior(c)} indent={1} />;
              })}
              <BalanceRow name="Surplus Periode Berjalan" current={surplusPeriode} prior={0} indent={1} />
              <BalanceSubtotal label="Jumlah Ekuitas" current={totalEkuitas} prior={ekuitasAwal} />
            </div>
            <BalanceGrand label="TOTAL LIABILITAS & EKUITAS" current={totalLiaEkuitas} prior={totalLiaEkuitasPrior} />
          </div>
        </Card>
      </div>

      <div className="card" style={{padding:'10px 14px', fontSize:11.5, color:'hsl(var(--muted-foreground))', display:'flex', gap:16}}>
        <span><b style={{color:'hsl(var(--foreground))'}}>Catatan:</b> Disajikan dalam Rupiah penuh. Akumulasi penyusutan disajikan sebagai pengurang aset tetap.</span>
        <span style={{marginLeft:'auto'}}>Disusun: Bendahara · Disetujui: Kepala Sekolah</span>
      </div>
    </div>
  );
}

// ── Laba Rugi ──────────────────────────────────────────────────────────────

function LabaRugi({ period }) {
  const prior = priorPeriod(period);
  const curL = periodLabel(period);
  const priorL = periodLabel(prior);

  const revRows = [
    { code: '4-1010', name: 'Pendapatan SPP' },
    { code: '4-1020', name: 'Uang Pangkal' },
    { code: '4-1030', name: 'Pendapatan Kegiatan' },
  ];
  const otherRevRows = [
    { code: '4-2010', name: 'Donasi & Sumbangan' },
    { code: '4-2020', name: 'Pendapatan Bunga Bank' },
  ];
  const opExpRows = [
    { code: '5-1010', name: 'Beban Gaji Guru' },
    { code: '5-1020', name: 'Beban Gaji Tenaga Pendukung' },
    { code: '5-1030', name: 'Beban Listrik, Air & Internet' },
    { code: '5-1040', name: 'Beban Bahan & Buku' },
    { code: '5-1050', name: 'Beban Pemeliharaan' },
    { code: '5-1060', name: 'Beban Kegiatan Sekolah' },
  ];
  const nonOpExpRows = [
    { code: '5-2010', name: 'Beban Penyusutan' },
    { code: '5-3010', name: 'Beban Administrasi Bank' },
  ];

  const movCredit = (code, p) => accountMovement(code, p).credit;
  const movDebit  = (code, p) => accountMovement(code, p).debit;

  const sum = (rows, p, side) => rows.reduce((s, r) => s + (side === 'credit' ? movCredit(r.code, p) : movDebit(r.code, p)), 0);

  const revOp = sum(revRows, period, 'credit');
  const revOpP = sum(revRows, prior, 'credit');
  const revOther = sum(otherRevRows, period, 'credit');
  const revOtherP = sum(otherRevRows, prior, 'credit');
  const totalRev = revOp + revOther;
  const totalRevP = revOpP + revOtherP;

  const expOp = sum(opExpRows, period, 'debit');
  const expOpP = sum(opExpRows, prior, 'debit');
  const expNon = sum(nonOpExpRows, period, 'debit');
  const expNonP = sum(nonOpExpRows, prior, 'debit');
  const totalExp = expOp + expNon;
  const totalExpP = expOpP + expNonP;

  const surplusOp = revOp - expOp;
  const surplusOpP = revOpP - expOpP;
  const surplusNet = totalRev - totalExp;
  const surplusNetP = totalRevP - totalExpP;

  const margin = totalRev ? (surplusNet / totalRev * 100) : 0;
  const marginP = totalRevP ? (surplusNetP / totalRevP * 100) : 0;

  return (
    <div className="col gap-4">
      <ReportHeader
        title={`Laba Rugi · ${SCHOOL.name}`}
        subtitle="Laporan Aktivitas Operasional"
        meta={`Periode ${curL} (komparatif dengan ${priorL})`}
      />

      {/* Summary KPI strip */}
      <div className="stat-grid" style={{gridTemplateColumns:'repeat(4, 1fr)'}}>
        <KpiCard label="Pendapatan" value={rupiah(totalRev, { sym: true })} delta={totalRev - totalRevP} deltaLabel={`vs ${priorL}`} />
        <KpiCard label="Beban" value={rupiah(totalExp, { sym: true })} delta={-(totalExp - totalExpP)} deltaLabel={`vs ${priorL}`} />
        <KpiCard label="Surplus Operasional" value={rupiah(surplusOp, { sym: true })} delta={surplusOp - surplusOpP} deltaLabel={`vs ${priorL}`} />
        <KpiCard label="Surplus Bersih" value={rupiah(surplusNet, { sym: true })} delta={surplusNet - surplusNetP} deltaLabel={`margin ${margin.toFixed(1)}%`} highlight />
      </div>

      <Card>
        <div className="card-header">
          <div><div className="card-title">Rincian Aktivitas</div><div className="card-desc">Disajikan dengan komparatif</div></div>
        </div>
        <div className="card-body">
          <ReportColsHeader current={curL} prior={priorL} />
          <div className="balance-section">
            <div className="balance-section-title">Pendapatan Operasional</div>
            {revRows.map(r => <BalanceRow key={r.code} code={r.code} name={r.name} current={movCredit(r.code, period)} prior={movCredit(r.code, prior)} indent={1} />)}
            <BalanceSubtotal label="Jumlah Pendapatan Operasional" current={revOp} prior={revOpP} />
          </div>
          <div className="balance-section">
            <div className="balance-section-title">Pendapatan Lain-lain</div>
            {otherRevRows.map(r => <BalanceRow key={r.code} code={r.code} name={r.name} current={movCredit(r.code, period)} prior={movCredit(r.code, prior)} indent={1} />)}
            <BalanceSubtotal label="Jumlah Pendapatan Lain-lain" current={revOther} prior={revOtherP} />
          </div>
          <BalanceSubtotal label="TOTAL PENDAPATAN" current={totalRev} prior={totalRevP} />

          <div className="balance-section" style={{marginTop:16}}>
            <div className="balance-section-title">Beban Operasional</div>
            {opExpRows.map(r => <BalanceRow key={r.code} code={r.code} name={r.name} current={movDebit(r.code, period)} prior={movDebit(r.code, prior)} indent={1} />)}
            <BalanceSubtotal label="Jumlah Beban Operasional" current={expOp} prior={expOpP} />
          </div>
          <div className="balance-section">
            <div className="balance-section-title">Beban Non-Operasional</div>
            {nonOpExpRows.map(r => <BalanceRow key={r.code} code={r.code} name={r.name} current={movDebit(r.code, period)} prior={movDebit(r.code, prior)} indent={1} />)}
            <BalanceSubtotal label="Jumlah Beban Non-Operasional" current={expNon} prior={expNonP} />
          </div>
          <BalanceSubtotal label="TOTAL BEBAN" current={totalExp} prior={totalExpP} />

          <BalanceGrand label="SURPLUS BERSIH" current={surplusNet} prior={surplusNetP} />
        </div>
      </Card>

      <div className="card" style={{padding:'10px 14px', fontSize:11.5, color:'hsl(var(--muted-foreground))', display:'flex', gap:16}}>
        <span><b style={{color:'hsl(var(--foreground))'}}>Margin surplus:</b> {margin.toFixed(1)}% (sebelumnya {marginP.toFixed(1)}%)</span>
        <span style={{marginLeft:'auto'}}>Akrual basis</span>
      </div>
    </div>
  );
}

// ── Arus Kas (Indirect Method) ─────────────────────────────────────────────

function CashflowSection({ title, rows, total }) {
  return (
    <div className="balance-section">
      <div className="balance-section-title">{title}</div>
      {rows.map((r, i) => (
        <div key={i} className="balance-row">
          <div className="balance-row-label" style={{paddingLeft:16}}>
            <span>{r.name}</span>
          </div>
          <div className="balance-row-value tnum" style={{color: r.value < 0 ? 'hsl(var(--destructive))' : undefined}}>
            {r.value < 0 ? `(${rupiah(Math.abs(r.value))})` : rupiah(r.value)}
          </div>
        </div>
      ))}
      <div className="balance-row balance-subtotal">
        <div className="balance-row-label" style={{fontWeight:600}}>Jumlah {title}</div>
        <div className="balance-row-value tnum" style={{color: total < 0 ? 'hsl(var(--destructive))' : undefined}}>
          {total < 0 ? `(${rupiah(Math.abs(total))})` : rupiah(total)}
        </div>
      </div>
    </div>
  );
}

function ArusKas({ period }) {
  const curL = periodLabel(period);

  // Surplus periode berjalan
  const rev = ['4-1010','4-1020','4-1030','4-2010','4-2020'].reduce((s, c) => s + accountMovement(c, period).credit, 0);
  const exp = ['5-1010','5-1020','5-1030','5-1040','5-1050','5-1060','5-2010','5-3010'].reduce((s, c) => s + accountMovement(c, period).debit, 0);
  const surplus = rev - exp;

  // Penyesuaian non-kas: penyusutan
  const depreciation = accountMovement('5-2010', period).debit;
  // Perubahan modal kerja: piutang SPP (kenaikan = pengurang kas)
  const piutangChange = accountClosing('1-1110', period) - (OPENING_BALANCES['1-1110'] || 0);
  // Perubahan utang gaji
  const utangGajiChange = accountClosing('2-1020', period) - (OPENING_BALANCES['2-1020'] || 0);

  const operasiRows = [
    { name: 'Surplus Periode Berjalan', value: surplus },
    { name: 'Penyesuaian: Beban Penyusutan', value: depreciation },
    { name: 'Kenaikan Piutang SPP', value: -piutangChange },
    { name: 'Kenaikan Utang Gaji', value: utangGajiChange },
  ];
  const totalOperasi = operasiRows.reduce((s, r) => s + r.value, 0);

  // Investasi: pembelian aset tetap (jika ada di period)
  const aktivaPurchase = JOURNALS
    .filter(j => j.date.startsWith(period))
    .flatMap(j => j.lines)
    .filter(l => ['1-2010','1-2020','1-2030','1-2040'].includes(l.code))
    .reduce((s, l) => s + l.debit - l.credit, 0);
  const investasiRows = [
    { name: 'Pembelian Aset Tetap', value: -aktivaPurchase },
  ];
  const totalInvestasi = investasiRows.reduce((s, r) => s + r.value, 0);

  // Pendanaan: tidak ada di periode ini
  const pendanaanRows = [
    { name: 'Penambahan Modal / Hibah', value: 0 },
    { name: 'Pelunasan Pinjaman', value: 0 },
  ];
  const totalPendanaan = 0;

  const kenaikan = totalOperasi + totalInvestasi + totalPendanaan;
  const kasAwal = (OPENING_BALANCES['1-1010']||0) + (OPENING_BALANCES['1-1020']||0) + (OPENING_BALANCES['1-1030']||0);
  const kasAkhir = kasAwal + kenaikan;

  return (
    <div className="col gap-4">
      <ReportHeader
        title={`Arus Kas · ${SCHOOL.name}`}
        subtitle="Laporan Arus Kas (Metode Tidak Langsung)"
        meta={`Periode ${curL}`}
      />

      <div className="stat-grid" style={{gridTemplateColumns:'repeat(4, 1fr)'}}>
        <KpiCard label="Aktivitas Operasi" value={rupiah(totalOperasi, { sym: true })} delta={totalOperasi} deltaLabel="bersih" highlight />
        <KpiCard label="Aktivitas Investasi" value={rupiah(totalInvestasi, { sym: true })} delta={totalInvestasi} deltaLabel="bersih" />
        <KpiCard label="Aktivitas Pendanaan" value={rupiah(totalPendanaan, { sym: true })} delta={0} deltaLabel="bersih" />
        <KpiCard label="Kenaikan Kas Bersih" value={rupiah(kenaikan, { sym: true })} delta={kenaikan} deltaLabel={curL} />
      </div>

      <Card>
        <div className="card-header"><div><div className="card-title">Rincian Arus Kas</div><div className="card-desc">Per kelompok aktivitas</div></div></div>
        <div className="card-body">
          <CashflowSection title="Aktivitas Operasi" rows={operasiRows} total={totalOperasi} />
          <CashflowSection title="Aktivitas Investasi" rows={investasiRows} total={totalInvestasi} />
          <CashflowSection title="Aktivitas Pendanaan" rows={pendanaanRows} total={totalPendanaan} />

          <div className="balance-row balance-grand" style={{marginTop:12}}>
            <div className="balance-row-label">KENAIKAN (PENURUNAN) KAS BERSIH</div>
            <div className="balance-row-value tnum">{rupiah(kenaikan, { sym: true })}</div>
          </div>
          <div className="balance-row" style={{paddingTop:6}}>
            <div className="balance-row-label muted">Saldo Kas Awal Periode</div>
            <div className="balance-row-value tnum muted">{rupiah(kasAwal, { sym: true })}</div>
          </div>
          <div className="balance-row balance-subtotal">
            <div className="balance-row-label" style={{fontWeight:600}}>SALDO KAS AKHIR PERIODE</div>
            <div className="balance-row-value tnum">{rupiah(kasAkhir, { sym: true })}</div>
          </div>
        </div>
      </Card>
    </div>
  );
}

Object.assign(window, { BalanceRow, BalanceSubtotal, BalanceGrand, ReportColsHeader, priorPeriod, Neraca, LabaRugi, CashflowSection, ArusKas });
