import java.util.List;

/** Tabel keputusan diagnosis produksi: gejala -> sumber bukti -> tindakan pertama. */
public class PetaDiagnosis {

    /** Satu baris tabel keputusan: gejala, indikator pendukung, bukti yang dikumpulkan, tindakan. */
    record Baris(String gejala, String indikator, String bukti, String tindakan) {}

    /** Tabel keputusan insiden — tiap baris adalah satu jalur diagnosis. */
    static final List<Baris> TABEL = List.of(
            new Baris("latensi p95 menanjak", "CPU rendah",
                    "thread dump (jcmd Thread.print)", "cari thread WAITING/BLOCKED dan pemilik kunci"),
            new Baris("latensi p95 menanjak", "CPU jenuh",
                    "rekaman JFR (jfr print)", "perbaiki hotspot teratas dari profil"),
            new Baris("OutOfMemoryError heap", "heap terus membesar",
                    "heap dump (jcmd GC.heap_dump)", "analisis retensi objek terbesar"),
            new Baris("container mati mendadak", "exit code 137",
                    "anggaran memori non-heap", "perbesar limit atau turunkan MaxRAMPercentage"),
            new Baris("aplikasi tidak menyala", "berhenti saat startup",
                    "log startup + tabel konfigurasi", "periksa environment variable wajib"),
            new Baris("koneksi database habis", "antrean pool menanjak",
                    "metrik pool + thread dump", "cari koneksi yang diambil tanpa ditutup"));

    /** Jalankan satu insiden lewat tabel: temukan baris yang cocok, cetak jalurnya. */
    static void diagnosis(int nomor, String gejala, String indikator) {
        System.out.println("Insiden " + nomor + ": " + gejala + " (" + indikator + ")");
        Baris cocok = TABEL.stream()
                .filter(b -> b.gejala().equals(gejala) && b.indikator().equals(indikator))
                .findFirst()
                .orElseThrow();
        System.out.println("  bukti   : kumpulkan " + cocok.bukti());
        System.out.println("  tindakan: " + cocok.tindakan());
        System.out.println();
    }

    public static void main(String[] args) {
        System.out.println("== Tabel keputusan diagnosis ==");
        System.out.printf("%-24s %-22s %-32s %s%n",
                "gejala", "indikator", "bukti yang dikumpulkan", "tindakan pertama");
        for (Baris b : TABEL) {
            System.out.printf("%-24s %-22s %-32s %s%n",
                    b.gejala(), b.indikator(), b.bukti(), b.tindakan());
        }
        System.out.println();

        System.out.println("== Tiga insiden melewati tabel ==");
        diagnosis(1, "latensi p95 menanjak", "CPU rendah");
        diagnosis(2, "container mati mendadak", "exit code 137");
        diagnosis(3, "koneksi database habis", "antrean pool menanjak");

        System.out.println("== Urutan penanganan insiden ==");
        String[] langkah = {
                "1. amankan bukti: thread dump, heap dump, JFR, sebelum restart apa pun",
                "2. pulihkan layanan: rollback atau scale-out dengan data yang ada",
                "3. cari akar masalah lewat tabel keputusan di atas",
                "4. tulis postmortem blameless (tanpa mencari kesalahan individu) beserta pencegahannya"
        };
        for (String l : langkah) {
            System.out.println("  " + l);
        }
    }
}
