import http from "http";

/**
 * Запускает HTTP-сервер для проверки здоровья.
 * @param controller - AbortController для управления состоянием здоровья.
 * @param defaultPort - Порт для сервера по умолчанию (если не указан в ENV HEALTH_PORT).
 * @param defaultHostName - Имя хоста для сервера по умолчанию (если не указан в ENV HEALTH_HOST).
 */
export function startHealthServer(
  controller: AbortController,
  defaultPort: number = 8000,
  defaultHostName: string = "127.0.0.1",
) {
  const port = parseInt(process.env.HEALTH_PORT || `${defaultPort}`, 10);
  const hostname = process.env.HEALTH_HOST || defaultHostName;

  const server = http.createServer((req, res) => {
    if (req.url === "/health") {
      const signal = controller.signal;

      // Если сигнал отмены активирован, сервер помечается как "unhealthy"
      if (signal.aborted) {
        res.writeHead(500, { "Content-Type": "application/json" });
        res.end(
          JSON.stringify({
            status: "unhealthy",
            reason: "Service aborted",
          }),
        );
        return;
      }

      // Возвращаем стандартный статус "ok", если всё нормально
      res.writeHead(200, { "Content-Type": "application/json" });
      res.end(
        JSON.stringify({
          status: "ok",
        }),
      );
    } else {
      res.writeHead(404, { "Content-Type": "text/plain" });
      res.end("Not Found");
    }
  });

  const { promise, resolve, reject } = Promise.withResolvers<void>();
  server.once("error", reject);
  server.listen(port, hostname, resolve);

  promise.then(() => {
    console.log(
      `Healthcheck server running on http://${hostname}:${port}/health`,
    );
  });

  // Закрываем сервер при активации AbortController
  controller.signal.addEventListener("abort", () => {
    console.log("Healthcheck server shutting down due to abort signal.");
    reject();
    server.close();
  });

  return promise;
}
