import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;

public class PesanHttp {

    enum Metode {
        GET(true, true), POST(false, false), PUT(false, true),
        DELETE(false, true), PATCH(false, false);

        final boolean aman;
        final boolean idempoten;

        Metode(boolean aman, boolean idempoten) {
            this.aman = aman;
            this.idempoten = idempoten;
        }
    }

    public static void main(String[] args) {
        String permintaanMentah = """
                GET /produk?kategori=buku&urut=harga HTTP/1.1
                Host: tokobudi.example
                Accept: application/json
                User-Agent: klien-belajar/1.0
                """;

        System.out.println("== Pesan permintaan mentah ==");
        System.out.print(permintaanMentah);

        String[] baris = permintaanMentah.split("\n");
        String[] bagian = baris[0].trim().split(" ");
        String metode = bagian[0];
        String target = bagian[1];
        String versi = bagian[2];

        Map<String, String> header = new LinkedHashMap<>();
        for (int i = 1; i < baris.length; i++) {
            if (baris[i].isBlank()) {
                continue;
            }
            int titikDua = baris[i].indexOf(':');
            header.put(baris[i].substring(0, titikDua).trim(),
                    baris[i].substring(titikDua + 1).trim());
        }

        System.out.println("== Hasil penguraian pesan ==");
        System.out.println("Method : " + metode);
        System.out.println("Target : " + target);
        System.out.println("Versi  : " + versi);
        System.out.println("Path   : " + target.substring(0, target.indexOf('?')));
        System.out.println("Query  : " + target.substring(target.indexOf('?') + 1));
        header.forEach((nama, nilai) -> System.out.println("Header : " + nama + " -> " + nilai));

        String body = "{\"total\":2,\"kategori\":\"buku\"}";
        StringBuilder respons = new StringBuilder();
        respons.append("HTTP/1.1 200 OK\r\n");
        respons.append("Content-Type: application/json\r\n");
        respons.append("Content-Length: ")
                .append(body.getBytes(StandardCharsets.UTF_8).length).append("\r\n");
        respons.append("\r\n");
        respons.append(body);
        System.out.println();
        System.out.println("== Pesan respons yang dibangun (penanda \\r\\n ditampilkan eksplisit) ==");
        System.out.print(respons.toString().replace("\r\n", "\\r\\n\n"));
        System.out.println();

        System.out.println();
        System.out.println("== Sifat method HTTP ==");
        System.out.printf("%-7s %-8s %-10s%n", "Method", "Aman?", "Idempoten?");
        for (Metode m : Metode.values()) {
            System.out.printf("%-7s %-8s %-10s%n", m, m.aman, m.idempoten);
        }
    }
}
