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

public class SapaAsync {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        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();
            List<String> nama = List.of("Budi", "Siti", "Dewi");

            // Tiga permintaan dikirim tanpa menunggu satu sama lain
            CompletableFuture<String>[] tugas = new CompletableFuture[nama.size()];
            for (int i = 0; i < nama.size(); i++) {
                HttpRequest req = HttpRequest.newBuilder()
                        .uri(URI.create("http://127.0.0.1:" + server.getAddress().getPort()
                                + "/sapa/" + nama.get(i)))
                        .GET().build();
                tugas[i] = klien.sendAsync(req, HttpResponse.BodyHandlers.ofString())
                        .thenApply(HttpResponse::body);
            }

            CompletableFuture.allOf(tugas).join();
            System.out.println("permintaan tuntas : " + tugas.length);
            for (int i = 0; i < tugas.length; i++) {
                System.out.println("hasil " + (i + 1) + " : " + tugas[i].join());
            }
        } finally {
            server.stop(0);
        }
    }
}
