import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDate;

// Demo persistensi: simpan state ke berkas, muat kembali, buktikan kesetaraan.
public class LayarDemo {

    private static final Path BERKAS = Path.of("perpustakaan.txt");

    public static void main(String[] args) throws PersistensiGagalException {
        Perpustakaan perpus = bangunKeadaan();
        PenyimpananPerpustakaan.simpan(perpus, BERKAS);
        System.out.println("tersimpan : " + Files.exists(BERKAS));

        Perpustakaan salinan = PenyimpananPerpustakaan.muat(BERKAS);
        System.out.println("buku      : " + perpus.jumlahBuku() + " -> " + salinan.jumlahBuku());
        System.out.println("anggota   : " + perpus.jumlahAnggota() + " -> " + salinan.jumlahAnggota());
        System.out.println("riwayat   : " + perpus.riwayat().size() + " -> " + salinan.riwayat().size());
        System.out.println("aktif     : " + perpus.jumlahPinjamanAktif()
                + " -> " + salinan.jumlahPinjamanAktif());

        // Record bernilai sama tetap setara setelah perjalanan lewat berkas.
        Buku asli = perpus.cariBukuIsbn("978-602-421-123-4");
        Buku hasilMuat = salinan.cariBukuIsbn("978-602-421-123-4");
        System.out.println("setara    : " + asli.equals(hasilMuat));

        // Pinjaman aktif tetap hidup: salinan dapat menyelesaikan transaksi.
        Peminjaman selesai = salinan.kembalikan(
                "978-602-401-718-3", LocalDate.of(2026, 1, 25));
        System.out.println("kembali   : " + selesai);
        System.out.println("denda     : " + selesai.hariTerlambat(LocalDate.of(2026, 1, 25))
                + " hari terlambat, " + formatRupiah(
                selesai.denda(LocalDate.of(2026, 1, 25), Perpustakaan.TARIF_DENDA_PER_HARI)));

        // Isi berkas yang tertulis (charset UTF-8 eksplisit).
        String isi;
        try {
            isi = Files.readString(BERKAS, StandardCharsets.UTF_8);
        } catch (IOException e) {
            throw new PersistensiGagalException("gagal membaca " + BERKAS, e);
        }
        System.out.println("--- isi perpustakaan.txt ---");
        System.out.print(isi);
    }

    static Perpustakaan bangunKeadaan() {
        Perpustakaan perpus = new Perpustakaan();
        perpus.tambahBuku(new Buku("978-602-421-123-4", "Laskar Pelangi",
                "Andrea Hirata", 2005));
        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)));
        // Satu transaksi sudah selesai (tepat waktu), satu masih berjalan.
        perpus.pinjam("978-602-421-123-4", "A-001", LocalDate.of(2026, 1, 5));
        perpus.kembalikan("978-602-421-123-4", LocalDate.of(2026, 1, 10));
        perpus.pinjam("978-602-401-718-3", "A-002", LocalDate.of(2026, 1, 5));
        return perpus;
    }

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