interface Env {}

const HOST = "zap.stream";

export const onRequest: PagesFunction<Env> = async context => {
  const u = new URL(context.request.url);

  const prefixes = ["npub1", "nprofile1", "naddr1", "nevent1", "note1"];
  const isEntityPath = prefixes.some(
    a => u.pathname.startsWith(`/${a}`) || u.pathname.startsWith(`/e/${a}`) || u.pathname.startsWith(`/p/${a}`),
  );
  const nostrAddress = u.pathname.match(/^\/([a-zA-Z0-9_]+)$/i);
  const next = await context.next();
  if (u.pathname != "/" && (isEntityPath || nostrAddress)) {
    //console.log("Handeling path: ", u.pathname, isEntityPath, nostrAddress[1]);
    try {
      let id = u.pathname.split("/").at(-1);
      if (!isEntityPath && nostrAddress) {
        id = `${id}@${HOST}`;
      }
      const fetchApi = `https://nostr.api.v0l.io/api/v1/opengraph/${id}?canonical=${encodeURIComponent(
        `https://${HOST}/%s`,
      )}`;
      console.log("Fetching tags from: ", fetchApi);
      const reqBuf = await next.arrayBuffer();
      const rsp = await fetch(fetchApi, {
        method: "POST",
        body: reqBuf,
        headers: {
          "user-agent": `SnortFunctions/1.0 (https://${HOST})`,
          "content-type": "text/html",
          accept: "text/html",
        },
      });
      if (rsp.ok) {
        const body = await rsp.text();
        if (body.length > 0) {
          return new Response(body, {
            headers: {
              ...Object.fromEntries(rsp.headers.entries()),
              "cache-control": "public, max-age=60",
            },
          });
        }
      }
    } catch (e) {
      console.error(e);
    }
  }
  return next;
};
