import { LabOverviewContent } from "@/components/pages/lab-overview/content";
import { SiteFooter } from "@/components/site-footer";
import { cachedDecideLocale } from "@/lib/server-locale";
import { getLabMeta } from "@/lib/api/labs.v2";
import { cachedGetLabs, cachedGetMe } from "@/lib/api/server-labs";
import { handleServerErrorInterrupts } from "@/lib/errors";
import { assertIsPathLocale, getLocaleFromLangString } from "@/lib/locale";
import { getAlternateUrls } from "@/lib/seo";
import { isTrustedUser } from "@/lib/users";
import { t } from "@/locales";
import type { Metadata } from "next";
import { forbidden, notFound } from "next/navigation";
import { cache } from "react";

const cachedGetLabMeta = cache(getLabMeta);

export default async function LabOverviewPage(props: {
  params: Promise<{ lang?: string; code: string }>;
}) {
  const params = await props.params;
  const code = decodeURIComponent(params.code);

  assertIsPathLocale(params.lang);

  const locale = await cachedDecideLocale(params.lang);

  try {
    const [me, lab, labs] = await Promise.all([
      cachedGetMe(),
      cachedGetLabMeta(code),
      cachedGetLabs(),
    ]);

    if (!lab) {
      notFound();
    }
    if (!isTrustedUser(me) && lab.employee_only) {
      forbidden();
    }

    return (
      <>
        <main className="mx-auto max-w-(--breakpoint-xl) p-4 md:p-6 lg:p-8 min-h-content">
          <LabOverviewContent lab={lab} labs={labs} />
        </main>
        <SiteFooter locale={locale} />
      </>
    );
  } catch (e) {
    handleServerErrorInterrupts(e);
    return Promise.reject(e);
  }
}

export async function generateMetadata(props: {
  params: Promise<{ lang?: string; code: string }>;
}): Promise<Metadata> {
  const params = await props.params;
  const code = decodeURIComponent(params.code);
  const locale = getLocaleFromLangString(params.lang);

  try {
    const [meta] = await Promise.all([cachedGetLabMeta(code)]);

    return {
      title: `${meta[`title_${locale}`]} | ${t(locale, "home.seo.title")}`,
      description: meta[`description_${locale}`],
      keywords: (meta[`keywords_${locale}`] ?? [])
        .concat(t(locale, "home.seo.keywords").split(","))
        .map((s) => s.trim())
        .filter(Boolean),
      openGraph: {
        title: `${meta[`title_${locale}`]} | ${t(locale, "home.seo.title")}`,
        description: meta[`description_${locale}`],
        images: meta[`splash_image_${locale}`],
        tags: t(locale, "home.seo.keywords"),
      },
      alternates: getAlternateUrls(
        locale,
        `/labs/${encodeURIComponent(params.code)}`
      ),
    };
  } catch (e) {
    handleServerErrorInterrupts(e);
    return Promise.reject(e);
  }
}
