package dev.elaine.network;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.startup.Tomcat;

import java.io.IOException;
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.nio.file.Files;

public final class EmbeddedTomcatSample {
    private EmbeddedTomcatSample() {}

    public static String requestOnce() throws Exception {
        Tomcat tomcat = new Tomcat();
        tomcat.setBaseDir(Files.createTempDirectory("tomcat-lab-").toString());
        tomcat.setPort(0);
        tomcat.getConnector();
        Context context = tomcat.addContext("", null);
        Tomcat.addServlet(context, "hello", new HelloServlet());
        context.addServletMappingDecoded("/hello", "hello");
        tomcat.start();
        try {
            int port = tomcat.getConnector().getLocalPort();
            HttpRequest request = HttpRequest.newBuilder(
                    URI.create("http://127.0.0.1:" + port + "/hello")).build();
            return HttpClient.newHttpClient()
                    .send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
                    .body();
        } finally {
            tomcat.stop();
            tomcat.destroy();
        }
    }

    static final class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws IOException {
            response.setContentType("text/plain;charset=UTF-8");
            response.getWriter().write("Tomcat 请求成功");
        }
    }
}

