import "dotenv/config";
import express from "express";
import { renderPage } from "vike/server";
import { IS_DEV } from "./lib/consts";
import cookieParser from "cookie-parser";
import api from "./api";
import { authMiddleware } from "./middlewares/auth";

async function createServer() {
  const app = express();
  const root = process.cwd();

  if (IS_DEV) {
    // start vite development server
    const { createServer: createViteServer } = await import("vite");
    const vite = await createViteServer({
      root,
      server: { middlewareMode: true },
      appType: "custom",
    });

    app.use(vite.middlewares);
  } else {
    // serve client assets
    app.use(express.static(root + "/dist/client"));

    const { default: morgan } = await import("morgan");
    app.use(morgan("combined"));
  }

  app.set("etag", false);
  app.use(cookieParser());
  app.use(authMiddleware);

  app.use("/api", api);

  app.use("*", async (req, res, next) => {
    const url = req.originalUrl;
    const pageContext = { req, res, cookies: req.cookies, user: req.user };
    const ctx = await renderPage({ urlOriginal: url, ...pageContext });

    const { httpResponse } = ctx;
    if (!httpResponse) {
      return next();
    }

    const { body, statusCode, headers, earlyHints } = httpResponse;

    // FIXME: SSL cloudflare gak bisa digunakan kalo ada ini..
    // if (res.writeEarlyHints) {
    //   res.writeEarlyHints({ link: earlyHints.map((e) => e.earlyHintLink) });
    // }

    headers.forEach(([name, value]) => res.setHeader(name, value));
    res.status(statusCode).send(body);
  });

  const host = process.env.HOST || "127.0.0.1";
  const port = Number(process.env.PORT) || 3000;

  app.listen(port, host, () => {
    console.log(`Server listening on http://${host}:${port}`);
  });
}

createServer();