import java.util.List;

/** Membandingkan isi image akhir: satu tahap vs multi-stage build. */
public class TahapBuild {

    /** Satu berkas dalam tahap build: nama dan ukuran (MB). */
    record Berkas(String nama, int mb) {}

    /** Isi tahap builder: alat build + sumber + hasil build. */
    static final List<Berkas> BUILDER = List.of(
            new Berkas("jdk-25 lengkap (javac, jlink, jcmd)", 460),
            new Berkas("cache dependensi Maven", 85),
            new Berkas("src/main/java (kode sumber)", 1),
            new Berkas("target/toko-fat.jar (hasil build)", 3));

    /** Isi tahap final: hanya yang dibutuhkan untuk berjalan. */
    static final List<Berkas> FINAL = List.of(
            new Berkas("jre-25 (runtime saja)", 240),
            new Berkas("toko-fat.jar (disalin dari builder)", 3));

    static int total(List<Berkas> berkas) {
        return berkas.stream().mapToInt(Berkas::mb).sum();
    }

    static void tampilkan(String judul, List<Berkas> berkas) {
        System.out.println("== " + judul + " ==");
        for (Berkas b : berkas) {
            System.out.printf("  %-42s %5d MB%n", b.nama(), b.mb());
        }
        System.out.printf("  %-42s %5d MB%n", "TOTAL (" + berkas.size() + " berkas)",
                total(berkas));
        System.out.println();
    }

    public static void main(String[] args) {
        tampilkan("Tahap builder (tidak ikut image akhir)", BUILDER);
        tampilkan("Tahap final (menjadi image akhir)", FINAL);

        int single = total(BUILDER);
        int multi = total(FINAL);
        System.out.println("== Perbandingan image akhir ==");
        System.out.printf("  satu tahap (semua ikut)  : %d MB%n", single);
        System.out.printf("  multi-stage               : %d MB%n", multi);
        System.out.printf("  yang tidak ikut terbawa   : %d MB%n", single - multi);
        System.out.printf("  penghematan               : %.1f%%%n", 100.0 * (single - multi) / single);
    }
}
