import type { Metadata } from "next";
import { api } from "../../../../../convex/_generated/api";
import { q } from "@/lib/convex-server";
import { ShowroomPage, type Catalog } from "@/components/showroom/showroom-page";

export const dynamic = "force-dynamic";

const DAY = /^\d{4}-\d{2}-\d{2}$/;
type Params = { params: Promise<{ id: string }>; searchParams: Promise<{ in?: string; out?: string; g?: string }> };

async function load(id: string) {
  const catalog = (await q(api.showroom.catalog, {}).catch(() => null)) as Catalog | null;
  return { catalog, apartment: catalog?.apartments.find((a) => a.id === id) ?? null };
}

export async function generateMetadata({ params }: Params): Promise<Metadata> {
  const { id } = await params;
  const { catalog, apartment } = await load(id);
  if (!apartment) return { title: "Apartment" };
  const cover = apartment.images[0]?.id;
  const title = apartment.name;
  const description = `${apartment.bedrooms ? `${apartment.bedrooms} bedroom${apartment.bedrooms > 1 ? "s" : ""}` : "Studio"} · up to ${apartment.maxGuests} guests · from ${apartment.basePrice} ${catalog?.business.currency ?? "MAD"} per night.`;
  return { title, description, openGraph: { title, description, images: cover ? [{ url: `/api/media/${cover}?w=1200` }] : [] }, twitter: { card: "summary_large_image", title, description } };
}

/**
 * Shared apartment link: the showroom opened straight on one apartment with
 * the client's dates preselected. Public, read-only, no guest data.
 */
export default async function SharedApartmentPage({ params, searchParams }: Params) {
  const [{ id }, sp] = await Promise.all([params, searchParams]);
  const { catalog } = await load(id);
  const g = Number(sp.g);
  return <ShowroomPage initial={catalog} focus={id} presetIn={sp.in && DAY.test(sp.in) ? sp.in : undefined} presetOut={sp.out && DAY.test(sp.out) ? sp.out : undefined} presetGuests={Number.isFinite(g) && g >= 1 && g <= 12 ? g : undefined} />;
}
