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.ArrayList;
import java.util.Collections;
import java.util.List;

public class KlienDipakaiUlang {
    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(); // SATU instance untuk semuanya

            // Lima permintaan berurutan lewat client yang sama
            List<String> nama = List.of("Budi", "Siti", "Dewi", "Rina", "Ali");
            List<String> hasilUrut = new ArrayList<>();
            for (String n : nama) {
                HttpRequest req = HttpRequest.newBuilder()
                        .uri(URI.create("http://127.0.0.1:" + server.getAddress().getPort()
                                + "/sapa/" + n))
                        .GET().build();
                HttpResponse<String> res = klien.send(req, HttpResponse.BodyHandlers.ofString());
                hasilUrut.add(res.body());
            }
            for (int i = 0; i < hasilUrut.size(); i++) {
                System.out.println("urutan " + (i + 1) + " : " + hasilUrut.get(i));
            }

            // Tiga thread memakai client yang sama secara bersamaan
            List<String> tugas = List.of("Budi", "Siti", "Dewi");
            List<String> hasilParalel =
                    new ArrayList<>(Collections.nCopies(tugas.size(), null));
            List<Thread> pegawai = new ArrayList<>();
            for (int i = 0; i < tugas.size(); i++) {
                int idx = i;
                Thread t = new Thread(() -> {
                    try {
                        HttpRequest req = HttpRequest.newBuilder()
                                .uri(URI.create("http://127.0.0.1:"
                                        + server.getAddress().getPort()
                                        + "/sapa/" + tugas.get(idx)))
                                .GET().build();
                        HttpResponse<String> res = klien.send(req,
                                HttpResponse.BodyHandlers.ofString());
                        hasilParalel.set(idx, res.body());
                    } catch (Exception e) {
                        hasilParalel.set(idx, "galat " + e.getClass().getSimpleName());
                    }
                });
                pegawai.add(t);
                t.start();
            }
            for (Thread t : pegawai) {
                t.join();
            }
            for (int i = 0; i < hasilParalel.size(); i++) {
                System.out.println("thread  " + (i + 1) + " : " + hasilParalel.get(i));
            }
        } finally {
            server.stop(0);
        }
    }
}
