import DesktopScanPrompt from "@/components/DesktopScanPrompt";
import { tryReadRunContext, verifyRunContextToken } from "@/lib/run-context";
import { redirect } from "next/navigation";

type SearchParams = Record<string, string | string[] | undefined>;

function getSearchParam(searchParams: SearchParams, keys: string[]) {
  for (const key of keys) {
    const value = searchParams[key];

    if (Array.isArray(value)) {
      const firstValue = value.find(Boolean);
      if (firstValue) return firstValue;
    } else if (value) {
      return value;
    }
  }

  return "";
}

export default async function QuickBrandPage({
  params,
  searchParams,
}: {
  params: Promise<{ brand: string }>;
  searchParams: Promise<SearchParams>;
}) {
  const [{ brand }, query] = await Promise.all([params, searchParams]);
  const imei = getSearchParam(query, ["imei", "IMEI"]);
  const redirectUrl = getSearchParam(query, [
    "redirect_url",
    "redirectUrl",
    "redirectURL",
  ]);
  const contextToken = getSearchParam(query, [
    "context_token",
    "contextToken",
  ]);
  const runParams = new URLSearchParams();

  if (imei) {
    runParams.set("imei", imei);
  }

  if (redirectUrl) {
    runParams.set("redirect_url", redirectUrl);
  }

  if (contextToken) {
    runParams.set("context_token", contextToken);
  }

  const runHref = `/devicetest/${brand}/run${
    runParams.size ? `?${runParams.toString()}` : ""
  }`;

  if (imei) {
    const context = await tryReadRunContext({
      partner_name: brand,
      imei,
    });

    if (!context) {
      try {
        const tokenContext = verifyRunContextToken(contextToken);

        if (
          tokenContext.imei !== imei ||
          tokenContext.partner_name.toLowerCase() !== brand.toLowerCase()
        ) {
          throw new Error("Run context token does not match URL");
        }
      } catch {
        redirect("/invalid-url");
      }
    }

    return (
      <DesktopScanPrompt
        runHref={runHref}
        partnerName={brand}
        imei={imei}
      />
    );
  }

  redirect(runHref);
}
