import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class BacaTulisHttp {

    static Map<String, List<String>> uraiParameter(String mentah) {
        Map<String, List<String>> hasil = new LinkedHashMap<>();
        if (mentah == null || mentah.isEmpty()) {
            return hasil;
        }
        for (String pasangan : mentah.split("&")) {
            int samaDengan = pasangan.indexOf('=');
            String kunci = samaDengan >= 0
                    ? pasangan.substring(0, samaDengan) : pasangan;
            String nilai = samaDengan >= 0
                    ? pasangan.substring(samaDengan + 1) : "";
            kunci = URLDecoder.decode(kunci, StandardCharsets.UTF_8);
            nilai = URLDecoder.decode(nilai, StandardCharsets.UTF_8);
            hasil.computeIfAbsent(kunci, k -> new ArrayList<>()).add(nilai);
        }
        return hasil;
    }

    static String getParameter(Map<String, List<String>> parameter, String nama) {
        List<String> nilai = parameter.get(nama);
        return nilai == null ? null : nilai.get(0);
    }

    public static void main(String[] args) {
        String queryString = "nama=Budi%20Santoso&minat=buku&minat=musik&kota=Bandung";
        String bodyForm = "email=budi%40example.com&pesan=selamat%20pagi+toko";

        System.out.println("== Parameter dari query string ==");
        uraiParameter(queryString).forEach(
                (kunci, nilai) -> System.out.println(kunci + " = " + nilai));

        System.out.println();
        System.out.println("== Parameter dari body form ==");
        uraiParameter(bodyForm).forEach(
                (kunci, nilai) -> System.out.println(kunci + " = " + nilai));

        System.out.println();
        System.out.println("== getParameter mengambil nilai pertama ==");
        System.out.println("nama  = " + getParameter(uraiParameter(queryString), "nama"));
        System.out.println("minat = " + getParameter(uraiParameter(queryString), "minat"));

        System.out.println();
        System.out.println("== Response yang ditulis server (penanda \\r\\n ditampilkan eksplisit) ==");
        String isi = "{\"sapa\":\"Halo Budi Santoso\"}";
        byte[] byteIsi = isi.getBytes(StandardCharsets.UTF_8);
        StringBuilder respons = new StringBuilder();
        respons.append("HTTP/1.1 200 OK\r\n");
        respons.append("Content-Type: application/json; charset=utf-8\r\n");
        respons.append("Content-Length: ").append(byteIsi.length).append("\r\n");
        respons.append("\r\n");
        respons.append(isi);
        System.out.print(respons.toString().replace("\r\n", "\\r\\n\n"));
        System.out.println();
    }
}
