import java.util.List;

public class PetaJakarta {

    enum Profil { INTI, WEB, PENUH }

    record Spesifikasi(String nama, String versi, Profil profilMinimal) {}

    static final List<Spesifikasi> PETA = List.of(
            // komponen wajib Jakarta EE 11 Core Profile
            new Spesifikasi("Jakarta Annotations", "3.0", Profil.INTI),
            new Spesifikasi("Jakarta CDI (bagian Lite)", "4.1", Profil.INTI),
            new Spesifikasi("Jakarta Dependency Injection", "2.0", Profil.INTI),
            new Spesifikasi("Jakarta Interceptors", "2.2", Profil.INTI),
            new Spesifikasi("Jakarta JSON Processing", "2.1", Profil.INTI),
            new Spesifikasi("Jakarta JSON Binding", "3.0", Profil.INTI),
            new Spesifikasi("Jakarta RESTful Web Services", "4.0", Profil.INTI),
            // tambahan wajib Jakarta EE 11 Web Profile
            new Spesifikasi("Jakarta Authentication", "3.1", Profil.WEB),
            new Spesifikasi("Jakarta Concurrency", "3.1", Profil.WEB),
            new Spesifikasi("Jakarta Data", "1.0", Profil.WEB),
            new Spesifikasi("Jakarta Debugging Support for Other Languages", "2.0", Profil.WEB),
            new Spesifikasi("Jakarta Enterprise Beans Lite", "4.0", Profil.WEB),
            new Spesifikasi("Jakarta Expression Language", "6.0", Profil.WEB),
            new Spesifikasi("Jakarta Faces", "4.1", Profil.WEB),
            new Spesifikasi("Jakarta Pages", "4.0", Profil.WEB),
            new Spesifikasi("Jakarta Persistence", "3.2", Profil.WEB),
            new Spesifikasi("Jakarta Security", "4.0", Profil.WEB),
            new Spesifikasi("Jakarta Servlet", "6.1", Profil.WEB),
            new Spesifikasi("Jakarta Standard Tag Library", "3.0", Profil.WEB),
            new Spesifikasi("Jakarta Transactions", "2.0", Profil.WEB),
            new Spesifikasi("Jakarta Validation", "3.1", Profil.WEB),
            new Spesifikasi("Jakarta WebSocket", "2.2", Profil.WEB),
            // tambahan hanya pada Jakarta EE 11 Full Platform
            new Spesifikasi("Jakarta Authorization", "-", Profil.PENUH),
            new Spesifikasi("Jakarta Batch", "-", Profil.PENUH),
            new Spesifikasi("Jakarta Connectors", "-", Profil.PENUH),
            new Spesifikasi("Jakarta Enterprise Beans (penuh)", "-", Profil.PENUH),
            new Spesifikasi("Jakarta Mail", "-", Profil.PENUH),
            new Spesifikasi("Jakarta Messaging", "-", Profil.PENUH));

    public static void main(String[] args) {
        System.out.println("== Spesifikasi per profil (profil terkecil pemiliknya) ==");
        for (Profil profil : Profil.values()) {
            System.out.println();
            System.out.println("[" + profil + "]");
            PETA.stream()
                    .filter(s -> s.profilMinimal() == profil)
                    .forEach(s -> System.out.printf("  %-48s %s%n", s.nama(), s.versi()));
        }

        System.out.println();
        System.out.println("== Jumlah kumulatif isi tiap profil ==");
        int inti = 0, web = 0, penuh = 0;
        for (Spesifikasi s : PETA) {
            switch (s.profilMinimal()) {
                case INTI -> inti++;
                case WEB -> web++;
                case PENUH -> penuh++;
            }
        }
        System.out.println("Core Profile   : " + inti + " spesifikasi");
        System.out.println("Web Profile    : " + (inti + web) + " spesifikasi (7 + " + web + ")");
        System.out.println("Full Platform  : " + (inti + web + penuh)
                + " spesifikasi (22 + " + penuh + ")");
    }
}
