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;
import java.util.concurrent.CompletableFuture;

public class RantaiAsync {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        server.createContext("/kota", exchange -> {
            byte[] body = "Bandung".getBytes(StandardCharsets.UTF_8);
            exchange.sendResponseHeaders(200, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        server.createContext("/sapa/", exchange -> {
            String nama = exchange.getRequestURI().getPath().substring("/sapa/".length());
            byte[] body = ("halo " + nama).getBytes(StandardCharsets.UTF_8);
            exchange.sendResponseHeaders(200, body.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(body);
            }
        });
        server.start();

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

            // Permintaan kedua bergantung pada hasil permintaan pertama
            CompletableFuture<String> hasil =
                    klien.sendAsync(
                            HttpRequest.newBuilder(URI.create(dasar + "/kota")).GET().build(),
                            HttpResponse.BodyHandlers.ofString())
                            .thenApply(HttpResponse::body)
                            .thenCompose(kota -> klien.sendAsync(
                                    HttpRequest.newBuilder(URI.create(dasar + "/sapa/" + kota))
                                            .GET().build(),
                                    HttpResponse.BodyHandlers.ofString()))
                            .thenApply(HttpResponse::body);

            System.out.println("hasil rantai : " + hasil.join());
        } finally {
            server.stop(0);
        }
    }
}
