import com.sun.net.httpserver.HttpServer;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class TugasJson {
    // Menyusun objek JSON kecil secara manual dengan escape yang benar
    static String bangunJson(String nama, String prioritas) {
        return "{\"nama\":\"" + EscapeJson.escape(nama)
                + "\",\"prioritas\":\"" + EscapeJson.escape(prioritas) + "\"}";
    }

    // Pembaca nilai string sederhana untuk JSON yang kita susun sendiri
    static String ambilNilai(String json, String kunci) {
        String penanda = "\"" + kunci + "\":";
        int posisi = json.indexOf(penanda);
        if (posisi < 0) {
            return null;
        }
        int i = posisi + penanda.length();
        while (i < json.length() && json.charAt(i) != '"') {
            i++;
        }
        i++; // lewati tanda kutip pembuka nilai
        StringBuilder nilai = new StringBuilder();
        while (i < json.length()) {
            char c = json.charAt(i);
            if (c == '\\' && i + 1 < json.length()) {
                char berikutnya = json.charAt(i + 1);
                nilai.append(switch (berikutnya) {
                    case '"' -> '"';
                    case '\\' -> '\\';
                    case 'n' -> '\n';
                    case 't' -> '\t';
                    default -> berikutnya;
                });
                i += 2;
            } else if (c == '"') {
                break;
            } else {
                nilai.append(c);
                i++;
            }
        }
        return nilai.toString();
    }

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        server.createContext("/tugas", exchange -> {
            String bodyMasuk = new String(exchange.getRequestBody().readAllBytes(),
                    StandardCharsets.UTF_8);
            String nama = ambilNilai(bodyMasuk, "nama");

            String jawaban = "{\"status\":\"diterima\",\"nama\":\""
                    + EscapeJson.escape(nama) + "\",\"id\":42}";
            byte[] body = jawaban.getBytes(StandardCharsets.UTF_8);
            exchange.getResponseHeaders().set("Content-Type", "application/json");
            exchange.sendResponseHeaders(200, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        server.start();

        try {
            String permintaan = bangunJson("Budi Santoso", "tinggi");
            HttpRequest req = HttpRequest.newBuilder()
                    .uri(URI.create("http://127.0.0.1:" + server.getAddress().getPort() + "/tugas"))
                    .header("Content-Type", "application/json")
                    .POST(HttpRequest.BodyPublishers.ofString(permintaan))
                    .build();

            HttpClient klien = HttpClient.newHttpClient();
            HttpResponse<String> res = klien.send(req, HttpResponse.BodyHandlers.ofString());

            System.out.println("kirim    : " + permintaan);
            System.out.println("terima   : " + res.body());
            System.out.println("status   : " + ambilNilai(res.body(), "status"));
            System.out.println("nama     : " + ambilNilai(res.body(), "nama"));
        } finally {
            server.stop(0);
        }
    }
}
