import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Function;

public class DispatcherMini {

    record Permintaan(String method, String path) {
        String kunci() {
            return method + " " + path;
        }
    }

    record Respons(int status, String tipeKonten, String badan) { }

    private final Map<String, Function<Permintaan, Respons>> petaHandler;

    DispatcherMini(Map<String, Function<Permintaan, Respons>> petaHandler) {
        this.petaHandler = petaHandler;
    }

    public static void main(String[] args) {
        // HandlerMapping mini: kunci "METHOD /path" -> handler.
        Map<String, Function<Permintaan, Respons>> petaHandler = new LinkedHashMap<>();
        petaHandler.put("GET /produk", req -> new Respons(200, "application/json",
                "{\"id\":1,\"nama\":\"Kopi Gayo 250g\"}"));
        petaHandler.put("GET /pesanan", req -> new Respons(200, "application/json",
                "{\"id\":77,\"status\":\"DIKIRIM\"}"));
        petaHandler.put("POST /pesanan", req -> new Respons(201, "application/json",
                "{\"id\":78,\"status\":\"BARU\"}"));

        DispatcherMini dispatcher = new DispatcherMini(petaHandler);
        dispatcher.layani(new Permintaan("GET", "/produk"));
        dispatcher.layani(new Permintaan("POST", "/pesanan"));
        dispatcher.layani(new Permintaan("DELETE", "/pesanan/78"));
    }

    // Front controller: seluruh permintaan lewat satu titik ini.
    void layani(Permintaan permintaan) {
        System.out.println("1) DispatcherServlet menerima " + permintaan.kunci());

        Function<Permintaan, Respons> handler = petaHandler.get(permintaan.kunci());
        System.out.println("2) HandlerMapping mencari handler -> "
                + (handler != null ? "ditemukan" : "tidak ada"));

        Respons respons;
        if (handler == null) {
            // Tidak ada handler: fallback 404 ala ResponseStatusException.
            System.out.println("3) handler tidak ditemukan -> respons 404 dibuat");
            respons = new Respons(404, "application/problem+json",
                    "{\"title\":\"Not Found\",\"status\":404}");
        } else {
            System.out.println("3) HandlerAdapter memanggil method controller");
            respons = handler.apply(permintaan);
            System.out.println("4) HttpMessageConverter menulis body "
                    + respons.tipeKonten());
        }
        System.out.println("-> respons: " + respons.status() + " "
                + respons.tipeKonten() + " " + respons.badan());
        System.out.println();
    }
}
