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

// Demo sirkulasi lengkap: peminjaman, penolakan aturan, pengembalian, denda.
public class LayarDemo {

    private static final LocalDate HARI_INI = LocalDate.of(2026, 1, 5);

    public static void main(String[] args) {
        Perpustakaan perpus = new Perpustakaan();
        isiData(perpus);

        // 1. Budi meminjam dua buku, Siti satu buku.
        System.out.println("pinjam 1 : " + perpus.pinjam("978-602-421-123-4", "A-001", HARI_INI));
        System.out.println("pinjam 2 : " + perpus.pinjam("978-602-032-556-2", "A-001", HARI_INI));
        System.out.println("pinjam 3 : " + perpus.pinjam("978-602-401-718-3", "A-002", HARI_INI));

        // 2. Buku yang sudah dipinjam tidak dapat dipinjam lagi.
        try {
            perpus.pinjam("978-602-401-718-3", "A-001", HARI_INI);
        } catch (BukuDipinjamException e) {
            System.out.println("ditolak  : " + e.getMessage());
        }

        // 3. Budi menambah buku ketiga, lalu menabrak batas pinjaman.
        System.out.println("pinjam 4 : " + perpus.pinjam("978-602-291-024-4", "A-001", HARI_INI));
        try {
            perpus.pinjam("978-979-433-555-1", "A-001", HARI_INI);
        } catch (BatasPeminjamanTercapaiException e) {
            System.out.println("ditolak  : " + e.getMessage());
        }

        // 4. Pengembalian terlambat: jatuh tempo 2026-01-19, kembali 2026-01-25.
        Peminjaman terlambat = perpus.kembalikan("978-602-421-123-4", LocalDate.of(2026, 1, 25));
        System.out.println("terlambat: " + terlambat.hariTerlambat(LocalDate.of(2026, 1, 25)) + " hari");
        System.out.println("denda    : " + formatRupiah(
                terlambat.denda(LocalDate.of(2026, 1, 25), Perpustakaan.TARIF_DENDA_PER_HARI)));

        // 5. Pengembalian tepat waktu: denda nol.
        Peminjaman tepat = perpus.kembalikan("978-602-032-556-2", LocalDate.of(2026, 1, 10));
        System.out.println("tepat    : " + tepat.hariTerlambat(LocalDate.of(2026, 1, 10)) + " hari");
        System.out.println("denda    : " + formatRupiah(
                tepat.denda(LocalDate.of(2026, 1, 10), Perpustakaan.TARIF_DENDA_PER_HARI)));

        // 6. Buku yang sudah kembali boleh dipinjam anggota lain.
        System.out.println("pinjam 5 : "
                + perpus.pinjam("978-602-421-123-4", "A-003", LocalDate.of(2026, 1, 26)));

        // 7. Denda berjalan untuk pinjaman yang belum dikembalikan.
        LocalDate tanggalHitung = LocalDate.of(2026, 2, 1);
        for (Peminjaman p : perpus.pinjamanAktifAnggota("A-002")) {
            System.out.println("berjalan : " + p.buku().judul() + ", terlambat "
                    + p.hariTerlambat(tanggalHitung) + " hari, denda " + formatRupiah(
                    p.denda(tanggalHitung, Perpustakaan.TARIF_DENDA_PER_HARI)));
        }

        // 8. Ringkasan akhir.
        System.out.println("aktif    : " + perpus.jumlahPinjamanAktif() + " pinjaman");
        System.out.println("riwayat  : " + perpus.riwayat().size() + " transaksi");
    }

    static void isiData(Perpustakaan perpus) {
        perpus.tambahBuku(new Buku("978-602-421-123-4", "Laskar Pelangi",
                "Andrea Hirata", 2005));
        perpus.tambahBuku(new Buku("978-979-433-555-1", "Bumi Manusia",
                "Pramoedya Ananta Toer", 1980));
        perpus.tambahBuku(new Buku("978-602-032-556-2", "Hujan Bulan Juni",
                "Sapardi Djoko Damono", 1994));
        perpus.tambahBuku(new Buku("978-602-401-718-3", "Filosofi Teras",
                "Henry Manampiring", 2018));
        perpus.tambahBuku(new Buku("978-602-291-024-4", "Laut Bercerita",
                "Leila S. Chudori", 2017));
        perpus.daftarkan(new Anggota("A-001", "Budi Santoso",
                "budi@example.com", LocalDate.of(2026, 1, 2)));
        perpus.daftarkan(new Anggota("A-002", "Siti Rahayu",
                "siti@example.com", LocalDate.of(2026, 1, 3)));
        perpus.daftarkan(new Anggota("A-003", "Dewi Lestari",
                "dewi@example.com", LocalDate.of(2026, 1, 5)));
    }

    // Format uang sederhana: 3000 menjadi "Rp3.000".
    static String formatRupiah(BigDecimal nilai) {
        return "Rp" + nilai.setScale(0).toPlainString()
                .replaceAll("\\B(?=(\\d{3})+(?!\\d))", ".");
    }
}
