import java.util.Comparator;
import java.util.PriorityQueue;

public class AntreanRumahSakit {

    // Level triage IGD: P1 paling prioritas, disusul P2, lalu P3.
    enum LevelTriage { P1, P2, P3 }

    // Pasien direpresentasikan record: ringkas, immutable, bernilai sama bila datanya sama.
    record Pasien(String nama, LevelTriage level, int nomorKedatangan) { }

    public static void main(String[] args) {
        // Aturan antrean: level triage dulu, lalu nomor kedatangan (FIFO).
        Comparator<Pasien> urutan = Comparator
                .comparing((Pasien p) -> p.level())
                .thenComparingInt(Pasien::nomorKedatangan);

        PriorityQueue<Pasien> antrean = new PriorityQueue<>(urutan);

        antrean.add(new Pasien("Siti", LevelTriage.P3, 1));
        antrean.add(new Pasien("Budi", LevelTriage.P2, 2));
        antrean.add(new Pasien("Dewi", LevelTriage.P1, 3));
        antrean.add(new Pasien("Joko", LevelTriage.P2, 4));
        antrean.add(new Pasien("Rani", LevelTriage.P1, 5));

        System.out.println("=== Antrean IGD: level triage dulu, lalu urutan datang ===");
        System.out.println("Pasien menunggu: " + antrean.size());

        layani(antrean);

        // Pasien P1 datang ketika antrean sedang berjalan.
        antrean.add(new Pasien("Tono", LevelTriage.P1, 6));
        System.out.println();
        System.out.println("Pasien baru masuk : Tono (P1, kedatangan ke-6)");
        System.out.println("Pasien menunggu   : " + antrean.size());

        while (!antrean.isEmpty()) {
            layani(antrean);
        }
    }

    static void layani(PriorityQueue<Pasien> antrean) {
        Pasien pasien = antrean.poll();
        System.out.println("Dilayani : " + pasien.nama() + " (" + pasien.level()
                + ", kedatangan ke-" + pasien.nomorKedatangan() + "), sisa "
                + antrean.size() + " pasien");
    }
}
