import { createReadStream, existsSync, statSync } from "node:fs";
import { join, normalize, resolve, sep } from "node:path";
import type { ServerResponse } from "node:http";

const CONTENT_TYPES: Record<string, string> = {
  ".html": "text/html; charset=utf-8",
  ".js": "text/javascript; charset=utf-8",
  ".css": "text/css; charset=utf-8",
  ".json": "application/json; charset=utf-8",
  ".svg": "image/svg+xml",
};

export function serveStaticAsset(staticRoot: string, requestPath: string, response: ServerResponse): boolean {
  const root = resolve(staticRoot);
  const pathname = requestPath === "/" ? "/index.html" : requestPath;
  const candidate = resolve(join(root, normalize(pathname).replace(/^(\.\.(\/|\\|$))+/, "")));
  if (candidate !== root && !candidate.startsWith(`${root}${sep}`)) {
    return false;
  }
  const filePath = existsSync(candidate) && statSync(candidate).isFile() ? candidate : resolve(root, "index.html");
  if (!existsSync(filePath) || !statSync(filePath).isFile()) {
    return false;
  }

  response.writeHead(200, { "content-type": CONTENT_TYPES[filePath.slice(filePath.lastIndexOf("."))] ?? "application/octet-stream" });
  createReadStream(filePath).pipe(response);
  return true;
}