import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class PetaEkosistem {

    record Teknologi(String nama, String lapisan, String peran) {}

    record Keputusan(String situasi, String pilihan, String alasan) {}

    public static void main(String[] args) {
        List<Teknologi> peta = List.of(
                new Teknologi("Jakarta Servlet", "Spesifikasi", "kontrak pemroses permintaan web"),
                new Teknologi("Jakarta RESTful WS", "Spesifikasi", "anotasi REST di atas Servlet"),
                new Teknologi("Jakarta CDI", "Spesifikasi", "dependency injection dan scope bean"),
                new Teknologi("Apache Tomcat", "Wadah web", "implementasi Jakarta Servlet"),
                new Teknologi("Eclipse Jetty", "Wadah web", "implementasi Jakarta Servlet"),
                new Teknologi("WildFly", "Platform", "implementasi profil Jakarta EE"),
                new Teknologi("Open Liberty", "Platform", "implementasi profil Jakarta EE"),
                new Teknologi("Spring Boot", "Framework aplikasi", "wadah tertanam + ekosistem starter"),
                new Teknologi("Quarkus", "Framework aplikasi", "dioptimalkan untuk kontainer"),
                new Teknologi("Javalin", "Framework ringan", "pembungkus Jetty yang ringkas"));

        System.out.println("== Jumlah teknologi per lapisan ==");
        Map<String, List<Teknologi>> perLapisan = peta.stream()
                .collect(Collectors.groupingBy(
                        Teknologi::lapisan, LinkedHashMap::new, Collectors.toList()));
        perLapisan.forEach((lapisan, daftar) ->
                System.out.printf("%-20s %d%n", lapisan, daftar.size()));

        System.out.println();
        System.out.println("== Isi setiap lapisan ==");
        perLapisan.forEach((lapisan, daftar) -> {
            System.out.println("[" + lapisan + "]");
            for (Teknologi t : daftar) {
                System.out.printf("  %-16s - %s%n", t.nama(), t.peran());
            }
        });

        System.out.println();
        System.out.println("== Saran pilihan per situasi ==");
        List<Keputusan> keputusan = List.of(
                new Keputusan("API kecil untuk tugas kuliah", "Javalin",
                        "satu dependensi, langsung berjalan"),
                new Keputusan("Monolith aplikasi perusahaan", "Spring Boot",
                        "ekosistem matang, banyak integrasi siap pakai"),
                new Keputusan("Layanan mikro hemat memori", "Quarkus",
                        "startup cepat dan jejak RAM kecil"),
                new Keputusan("Aplikasi yang harus portabel antar vendor", "Jakarta EE di WildFly",
                        "kode hanya bergantung pada spesifikasi"));
        for (Keputusan k : keputusan) {
            System.out.printf("%-45s -> %-22s (%s)%n", k.situasi(), k.pilihan(), k.alasan());
        }
    }
}
