import ReactDOMServer from "react-dom/server";
import { escapeInject, dangerouslySkipEscape } from "vike/server";
import type { OnRenderHtmlAsync } from "vike/types";
import { getPageMetadata } from "./utils";
import App from "./app";

export const onRenderHtml: OnRenderHtmlAsync = async (
  pageContext
): ReturnType<OnRenderHtmlAsync> => {
  const { Page } = pageContext;

  if (!Page)
    throw new Error(
      "My onRenderHtml() hook expects pageContext.Page to be defined"
    );

  const page = ReactDOMServer.renderToString(
    <App pageContext={pageContext}>
      <Page />
    </App>
  );

  // See https://vike.dev/head
  const meta = getPageMetadata(pageContext);

  const documentHtml = escapeInject`<!DOCTYPE html>
    <html lang="en" class="dark">
      <head>
        <meta charset="UTF-8" />
        <link rel="icon" href="/favicon.ico" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta name="description" content="${meta.description}" />
        <title>${meta.title}</title>
      </head>
      <body>
        <div id="react-root">${dangerouslySkipEscape(page)}</div>
      </body>
    </html>`;

  return {
    documentHtml,
    pageContext: {},
  };
};