import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

// Bagian 1: memodelkan barang dan jurnal mutasi, lalu menghitung stok dari jurnal.
public class DemoGudang {

    public static void main(String[] args) {
        Barang kertas = new Barang("BRG-001", "Kertas HVS A4", "RIM",
                new BigDecimal("47500"), 40, 10);
        Barang tinta = new Barang("BRG-002", "Tinta Printer Hitam", "BOTOL",
                new BigDecimal("185000"), 8, 4);

        System.out.println("barang 1: " + kertas);
        System.out.println("barang 2: " + tinta);

        // Jurnal mutasi BRG-001 sejak barang pertama kali diterima.
        List<MutasiStok> jurnal = List.of(
                new MutasiStok(1, "BRG-001", JenisMutasi.MASUK, 50,
                        LocalDate.of(2026, 1, 5), "Budi", "penerimaan awal"),
                new MutasiStok(2, "BRG-001", JenisMutasi.KELUAR, 25,
                        LocalDate.of(2026, 1, 8), "Siti", "permintaan divisi keuangan"),
                new MutasiStok(3, "BRG-001", JenisMutasi.MASUK, 30,
                        LocalDate.of(2026, 1, 15), "Budi", "pembelian rutin"),
                new MutasiStok(4, "BRG-001", JenisMutasi.KELUAR, 15,
                        LocalDate.of(2026, 1, 20), "Dewi", "permintaan divisi pemasaran"));

        for (MutasiStok mutasi : jurnal) {
            System.out.println("mutasi  : " + mutasi);
        }

        // Stok saat ini = penjumlahan seluruh jurnal: 50 - 25 + 30 - 15.
        int stokDariJurnal = 0;
        for (MutasiStok mutasi : jurnal) {
            stokDariJurnal += mutasi.jenis().tanda() * mutasi.jumlah();
        }
        System.out.println("stok dari jurnal       : " + stokDariJurnal);
        System.out.println("stok pada barang       : " + kertas.stok());
        System.out.println("jurnal dan stok selaras: " + (stokDariJurnal == kertas.stok()));

        // Validasi record menolak jumlah mutasi yang tidak positif.
        try {
            new MutasiStok(5, "BRG-001", JenisMutasi.KELUAR, -10,
                    LocalDate.of(2026, 1, 21), "Siti", "salah ketik");
        } catch (IllegalArgumentException e) {
            System.out.println("ditolak : " + e.getMessage());
        }
    }
}
