import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

/** Graceful shutdown mini: satu shutdown hook dengan tahapan berurutan. */
public class MatangBerhenti {

    /** Model kolam koneksi database yang harus ditutup di akhir hidup proses. */
    static final int KONEKSI_AKTIF = 20;

    /** Gerbang penerimaan request: false berarti load balancer mengalihkan trafik. */
    static final AtomicBoolean MENERIMA = new AtomicBoolean(true);

    /** Pekerjaan yang sedang diproses saat sinyal tiba — harus diselesaikan, dibuang. */
    static final Deque<String> SEDANG_DIPROSES =
            new ArrayDeque<>(List.of("pesanan P-1051", "pesanan P-1052", "pesanan P-1053"));

    /** Seluruh tahap penutupan berada di SATU hook: urutan eksplisit, bukan kebetulan. */
    static void matiAnggun() {
        System.out.println("== Shutdown hook dijalankan JVM ==");

        // Tahap 1: berhenti menerima pekerjaan baru.
        MENERIMA.set(false);
        System.out.println("  [tahap 1] readiness -> 503, load balancer mengalihkan trafik");

        // Tahap 2: selesaikan pekerjaan yang sedang berjalan.
        System.out.println("  [tahap 2] menguras " + SEDANG_DIPROSES.size() + " pekerjaan berjalan:");
        while (!SEDANG_DIPROSES.isEmpty()) {
            System.out.println("    selesai : " + SEDANG_DIPROSES.poll());
        }

        // Tahap 3: tutup resource berurutan, log disiram paling akhir.
        System.out.println("  [tahap 3] kolam koneksi " + KONEKSI_AKTIF + " ditutup");
        System.out.println("  [tahap 3] berkas log disiram (flush) ke disk");
        System.out.println("proses berakhir dengan aman");
    }

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(MatangBerhenti::matiAnggun, "hook-penutupan"));

        System.out.println("== Proses berjalan normal ==");
        System.out.println("menerima request baru : " + MENERIMA.get());
        System.out.println("sedang diproses       : " + SEDANG_DIPROSES.size() + " pekerjaan");
        System.out.println();
        System.out.println("operator  : docker stop kasirapp  (SIGTERM sampai ke JVM)");
        System.exit(0);
    }
}
