import LabPreviewV2 from "@/components/labs/lab-preview-v2";
import LabV2 from "@/components/labs/lab-v2";
import {
  getActiveLabInstance,
  getLabInstance,
  getLabMeta,
} from "@/lib/api/labs.v2";
import { cachedGetMe } from "@/lib/api/server-labs";
import { isClusterRegionKey } from "@/lib/cluster-regions";
import { handleServerErrorInterrupts } from "@/lib/errors";
import { redirect, unauthorized } from "next/navigation";

export default async function CurrentLabPage(props: {
  searchParams?: Promise<Record<string, string | string[] | undefined>>;
}) {
  const searchParams = (await props.searchParams) ?? {};

  try {
    if ("preview" in searchParams && typeof searchParams.preview === "string") {
      const labCode = searchParams.preview;
      const [me, lab] = await Promise.all([cachedGetMe(), getLabMeta(labCode)]);

      if (!me) {
        unauthorized();
      }

      const regionString = searchParams.region;
      const region = isClusterRegionKey(regionString)
        ? regionString
        : undefined;

      const grantIdString = searchParams.serverless_grant_id;
      let grantId: number | undefined =
        typeof grantIdString === "string" ? parseInt(grantIdString) : NaN;
      grantId = isFinite(grantId) ? grantId : undefined;

      return (
        <LabPreviewV2 lab={lab} serverlessGrantId={grantId} region={region} />
      );
    } else {
      if (
        "instance" in searchParams &&
        typeof searchParams.instance === "string"
      ) {
        const instance = await getLabInstance(Number(searchParams.instance));
        return <LabV2 instance={instance} />;
      } else {
        const instance = await getActiveLabInstance();
        redirect(`/lab?instance=${instance?.id}`);
      }
    }
  } catch (e) {
    handleServerErrorInterrupts(e);
    return Promise.reject(e);
  }
}
