import "server-only"

import { headers } from "next/headers"
import { cache } from "react"

import { Lang } from "@/constants/languages"

import { languageSchema } from "@/utils/languages"

const getRef = cache(() => ({ current: undefined as Lang | undefined }))

/**
 * Set the language for the current request
 *
 * It works kind of like React's context,
 * but on the server side, per request.
 *
 * @param newLang
 */
export function setLang(newLang: Lang) {
  const parseResult = languageSchema.safeParse(newLang)
  getRef().current = parseResult.success ? parseResult.data : Lang.en
}

/**
 * Get the global language set for the current request
 */
export async function getLang(): Promise<Lang> {
  const contextLang = getRef().current
  const headersList = await headers()
  const headerLang = headersList.get("x-lang") as Lang

  const l = contextLang || headerLang || Lang.en
  return l
}
