import { type Request, type Response, Router } from "express";
import { getFileExt } from "~/lib/utils";
import db from "~/server/db";
import { file } from "~/server/db/schema/file";
import { and, eq, isNull } from "drizzle-orm";
import { serveHtml } from "./serve-html";
import { serveJs } from "./serve-js";
import { getMimeType } from "~/server/lib/mime";
import { postcss } from "./postcss";
import { project } from "~/server/db/schema/project";

const get = async (req: Request, res: Response) => {
  const { slug, ...pathParams } = req.params as any;
  const path = pathParams[0];

  const projectData = await db.query.project.findFirst({
    where: and(eq(project.slug, slug), isNull(project.deletedAt)),
  });
  if (!projectData) {
    return res.status(404).send("Project not found!");
  }

  const fileData = await db.query.file.findFirst({
    where: and(
      eq(file.projectId, projectData.id),
      eq(file.path, path),
      isNull(file.deletedAt)
    ),
  });
  if (!fileData) {
    return res.status(404).send("File not found!");
  }

  const ext = getFileExt(fileData.filename);
  let content = fileData.content || "";

  if (["html", "htm"].includes(ext)) {
    content = await serveHtml(fileData);
  }

  if (["js", "ts", "jsx", "tsx"].includes(ext)) {
    content = await serveJs(fileData);
  }

  if (["css"].includes(ext)) {
    content = await postcss(fileData);
  }

  res.setHeader("Content-Type", getMimeType(fileData.filename));
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Methods", "GET");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  res.send(content);
};

const router = Router();
router.get("/:slug/*", get);

export default router;