import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
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;

/** svc-pesanan memanggil svc-inventori lewat REST dan menangani kegagalannya. */
public class PanggilInventori {
    public static void main(String[] args) throws Exception {
        // "svc-inventori" lokal: satu endpoint sehat, satu endpoint gagal
        HttpServer inventori = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        inventori.createContext("/stok/A1", exchange -> {
            byte[] body = "{\"kode\":\"A1\",\"jumlah\":7}".getBytes(StandardCharsets.UTF_8);
            exchange.getResponseHeaders().set("Content-Type", "application/json");
            exchange.sendResponseHeaders(200, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        inventori.createContext("/stok/B2", exchange -> {
            byte[] body = "{\"error\":\"gudang sibuk\"}".getBytes(StandardCharsets.UTF_8);
            exchange.getResponseHeaders().set("Content-Type", "application/json");
            exchange.sendResponseHeaders(503, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        inventori.start();

        String dasar = "http://127.0.0.1:" + inventori.getAddress().getPort();
        HttpClient klien = HttpClient.newHttpClient();

        try {
            System.out.println("skenario 1 (sukses) : " + panggil(klien, dasar + "/stok/A1"));
            System.out.println("skenario 2 (503)    : " + panggil(klien, dasar + "/stok/B2"));
        } finally {
            inventori.stop(0); // service inventori "dimatikan"
        }

        // Klien baru (pool koneksi baru) menabrak port yang sudah tidak dilayani
        HttpClient klienBaru = HttpClient.newHttpClient();
        System.out.println("skenario 3 (mati)   : " + panggil(klienBaru, dasar + "/stok/A1"));
    }

    /** Satu panggilan GET dengan penanganan status respons dan kegagalan koneksi. */
    static String panggil(HttpClient klien, String url) {
        HttpRequest permintaan = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Accept", "application/json")
                .GET()
                .build();
        try {
            HttpResponse<String> respons =
                    klien.send(permintaan, HttpResponse.BodyHandlers.ofString());
            if (respons.statusCode() == 200) {
                return "200 -> " + respons.body();
            }
            return respons.statusCode() + " -> stok tidak diketahui, jangan lempar mentah";
        } catch (IOException e) {
            return "koneksi gagal (" + e.getClass().getSimpleName() + ") -> fallback cache";
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return "terputus";
        }
    }
}
