import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/** Kumpulan transaksi milik satu pemilik, lengkap dengan total per jenis dan saldo. */
public class BukuKas {

    private final List<Transaksi> daftar = new ArrayList<>();

    /** Menambah satu transaksi; null ditolak sebelum sempat masuk daftar. */
    public void tambah(Transaksi t) {
        if (t == null) {
            throw new IllegalArgumentException("Transaksi tidak boleh null");
        }
        daftar.add(t);
    }

    /** Daftar transaksi baca-saja agar pemanggil tidak dapat mengubah catatan dari luar. */
    public List<Transaksi> semua() {
        return Collections.unmodifiableList(daftar);
    }

    public int jumlahTransaksi() {
        return daftar.size();
    }

    /** Menjumlahkan nominal seluruh transaksi satu jenis dengan loop eksplisit. */
    public BigDecimal total(JenisTransaksi jenis) {
        BigDecimal total = BigDecimal.ZERO;
        for (Transaksi t : daftar) {
            if (t.jenis() == jenis) {
                total = total.add(t.jumlah());
            }
        }
        return total;
    }

    /** Saldo = total pemasukan dikurangi total pengeluaran. */
    public BigDecimal saldo() {
        return total(JenisTransaksi.PEMASUKAN)
                .subtract(total(JenisTransaksi.PENGELUARAN));
    }
}
