import java.util.LinkedHashMap;
import java.util.Map;

public class WadahMini {

    interface ServletMini {
        boolean menerima(String metode);

        String isi(String jalur);
    }

    static class HalamanDepan implements ServletMini {
        @Override
        public boolean menerima(String metode) {
            return metode.equals("GET");
        }

        @Override
        public String isi(String jalur) {
            return "selamat datang di toko Budi";
        }
    }

    static class DaftarProduk implements ServletMini {
        private int panggilan = 0;

        @Override
        public boolean menerima(String metode) {
            return metode.equals("GET");
        }

        @Override
        public String isi(String jalur) {
            panggilan++;
            return "daftar produk (panggilan ke-" + panggilan
                    + " pada instance yang sama): buku, pena, tas";
        }
    }

    static class Wadah {
        private final Map<String, ServletMini> rute = new LinkedHashMap<>();

        void daftarkan(String pola, ServletMini servlet) {
            rute.put(pola, servlet);
        }

        String tangani(String metode, String jalur) {
            ServletMini servlet = rute.get(jalur);
            if (servlet == null) {
                return "404 Not Found: tidak ada servlet pada " + jalur;
            }
            if (!servlet.menerima(metode)) {
                return "405 Method Not Allowed: servlet tidak menerima " + metode;
            }
            return "200 OK: " + servlet.isi(jalur);
        }
    }

    public static void main(String[] args) {
        Wadah wadah = new Wadah();
        wadah.daftarkan("/", new HalamanDepan());
        wadah.daftarkan("/produk", new DaftarProduk());

        System.out.println("== Wadah memetakan pola URL ke servlet ==");
        System.out.println("/       -> HalamanDepan");
        System.out.println("/produk -> DaftarProduk");

        System.out.println();
        System.out.println("== Permintaan ditangani wadah ==");
        String[][] permintaan = {
                {"GET", "/"}, {"GET", "/produk"}, {"POST", "/produk"},
                {"GET", "/produk"}, {"GET", "/pelanggan"}};
        for (String[] p : permintaan) {
            System.out.printf("%-5s %-12s -> %s%n", p[0], p[1], wadah.tangani(p[0], p[1]));
        }
    }
}
