import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.YearMonth;

/**
 * Satu baris catatan keuangan: tanggal, keterangan, jenis, kategori, dan nominal.
 * Nominal selalu BigDecimal agar bebas galat pembulatan biner.
 */
public record Transaksi(LocalDate tanggal, String keterangan, JenisTransaksi jenis,
                        String kategori, BigDecimal jumlah) {

    // Compact constructor: validasi berjalan otomatis pada setiap pembuatan record.
    public Transaksi {
        if (tanggal == null || keterangan == null || jenis == null
                || kategori == null || jumlah == null) {
            throw new IllegalArgumentException("Seluruh field transaksi wajib terisi");
        }
        if (keterangan.isBlank()) {
            throw new IllegalArgumentException("Keterangan tidak boleh kosong");
        }
        if (kategori.isBlank()) {
            throw new IllegalArgumentException("Kategori tidak boleh kosong");
        }
        if (jumlah.signum() <= 0) {
            throw new IllegalArgumentException("Jumlah harus positif, diterima: "
                    + jumlah.toPlainString());
        }
    }

    /** Bulan terjadinya transaksi — kunci alami untuk laporan bulanan. */
    public YearMonth bulan() {
        return YearMonth.from(tanggal);
    }
}
