import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

/**
 * Menguji pola DAO tanpa membuka jendela: penyimpanan memori,
 * penyimpanan berkas, pemuatan ulang, dan penolakan berkas rusak.
 * Berkas uji dihapus lebih dulu bila ada, sehingga setiap eksekusi
 * selalu dimulai dari keadaan kosong dan keluarannya identik.
 */
public class DemoDao {

    public static void main(String[] args) throws Exception {
        System.out.println("== penyimpanan memori ==");
        DaftarKontak memori = new DaftarKontak(new KontakDaoMemori());
        memori.tambah("Budi", "budi@example.com", "0812-1000-1001");
        memori.tambah("Siti", "siti@example.com", "0812-1000-1002");
        memori.ubah(1, "Budi Santoso", "budi@example.com", "0812-1000-1001");
        System.out.println("jumlah = " + memori.jumlah());
        System.out.println("baris pertama = " + memori.semua().get(0));

        System.out.println();
        System.out.println("== penyimpanan berkas ==");
        Path berkas = Path.of("uji-kontak.txt");
        Files.deleteIfExists(berkas);  // mulai kosong agar eksekusi berulang identik
        DaftarKontak daftar = new DaftarKontak(new KontakDaoBerkas(berkas));
        daftar.tambah("Budi", "budi@example.com", "0812-1000-1001");
        daftar.tambah("Siti", "siti@example.com", "0812-1000-1002");
        daftar.tambah("Dewi", "dewi@example.com", "0813-2000-2003");

        System.out.println("isi " + berkas + ":");
        for (String baris : Files.readAllLines(berkas, StandardCharsets.UTF_8)) {
            System.out.println("  " + baris);
        }

        System.out.println("pemuatan ulang dari berkas yang sama:");
        DaftarKontak termuat = new DaftarKontak(new KontakDaoBerkas(berkas));
        System.out.println("  jumlah = " + termuat.jumlah());
        System.out.println("  kontak id 2 termuat kembali = "
                + termuat.cari(2).map(Kontak::nama).orElse("-"));

        System.out.println();
        System.out.println("== perubahan menulis tembus ke berkas ==");
        daftar.ubah(2, "Siti Rahayu", "siti@example.com", "0815-3000-3004");
        daftar.hapus(1);
        System.out.println("setelah ubah id 2 dan hapus id 1:");
        for (String baris : Files.readAllLines(berkas, StandardCharsets.UTF_8)) {
            System.out.println("  " + baris);
        }

        System.out.println();
        System.out.println("== aturan dan kegagalan ==");
        try {
            daftar.tambah("Budi|Cadangan", "cadangan@example.com", "0812");
        } catch (KontakInvalidException e) {
            System.out.println("tolak: " + e.getMessage());
        }

        Path rusak = Path.of("uji-rusak.txt");
        Files.writeString(rusak, "baris tanpa pemisah\n", StandardCharsets.UTF_8);
        try {
            new DaftarKontak(new KontakDaoBerkas(rusak));
        } catch (PersistensiGagalException e) {
            System.out.println("gagal: " + e.getMessage());
        }
    }
}
