import { Lang } from "@/constants/languages"
import { getPublicNextURL } from "@/server/utils"

import { resolve as resolveEntry } from "@/utils/entry"
import { findLang } from "@/utils/languages"
import { removeTrailingSlash } from "@/utils/url"

import type { NextRequest } from "next/server"

export function getDefaultRequestHeaders(request: NextRequest) {
  const lang = findLang(request.nextUrl.pathname)!
  const nextUrlPublic = getPublicNextURL(request)
  const headers = new Headers(request.headers)
  headers.set("x-lang", lang)
  headers.set(
    "x-pathname",
    removeTrailingSlash(
      request.nextUrl.pathname.replace(`/${lang}`, "").replace(`/webview`, "")
    )
  )
  headers.set("x-url", removeTrailingSlash(nextUrlPublic.href))

  return headers
}

const entryResponseCache: Map<
  string,
  {
    contentType: string | null
    uid: string | null
    expiresAt: number
  }
> = new Map()
let size: number = 0

export const fetchAndCacheEntry = async (path: string, lang: Lang) => {
  const cacheKey = `${path + lang}`
  const cachedResponse = entryResponseCache.get(cacheKey)

  if (cachedResponse && cachedResponse.expiresAt > Date.now() / 1000) {
    console.log("[CMS MIDDLEWARE]: CACHE HIT")
    return cachedResponse
  }

  if (cachedResponse && cachedResponse.expiresAt < Date.now() / 1000) {
    console.log("[CMS MIDDLEWARE]: CACHE STALE")
    size -= JSON.stringify(cachedResponse).length
    entryResponseCache.delete(cacheKey)
  } else {
    console.log("[CMS MIDDLEWARE]: CACHE MISS")
  }

  const { contentType, uid } = await resolveEntry(path, lang)
  let expiresAt = Date.now() / 1000
  if (!contentType || !uid) {
    expiresAt += 600
  } else {
    expiresAt += 3600 * 12
  }
  const entryCache = { contentType, uid, expiresAt }
  size += JSON.stringify(entryCache).length
  console.log("[CMS MIDDLEWARE] Adding to cache", entryCache)
  console.log("[CMS MIDDLEWARE] Cache size (total)", size)
  entryResponseCache.set(cacheKey, entryCache)

  return {
    contentType,
    uid,
  }
}
