import type { Metadata } from "next";
import { notFound } from "next/navigation";

import JsonLd from "@/components/common/JsonLd";
import BuilderProPage from "@/components/products/BuilderPro/BuilderProPage";
import ProductPage from "@/components/products/ProductPage";
import { siteConfig } from "@/config/site.config";
import { getProduct } from "@/data/products.data";
import { getDictionary } from "@/lib/i18n";
import { hasLocale } from "@/lib/locales";
import { isProductSlug } from "@/lib/routes";
import { createBreadcrumbJsonLd, createMetadata } from "@/lib/seo";

export async function generateMetadata({
  params,
}: PageProps<"/[lang]/products/[slug]">): Promise<Metadata> {
  const { lang, slug } = await params;
  if (!hasLocale(lang) || !isProductSlug(slug)) notFound();
  const dictionary = await getDictionary(lang);
  const product = getProduct(dictionary, slug, lang);
  if (!product) notFound();
  const metadata = createMetadata({
    locale: lang,
    path: `/products/${slug}`,
    title: product.seoTitle,
    description: product.seoDescription,
  });
  return { ...metadata, title: { absolute: product.seoTitle } };
}

export default async function ProductDetailPage({
  params,
}: PageProps<"/[lang]/products/[slug]">) {
  const { lang, slug } = await params;
  if (!hasLocale(lang) || !isProductSlug(slug)) notFound();
  const dictionary = await getDictionary(lang);
  const product = getProduct(dictionary, slug, lang);
  if (!product) notFound();

  const jsonLd = [
    createBreadcrumbJsonLd(lang, [
      { name: "PureSaaS", path: "" },
      { name: "Products", path: "/products" },
      { name: product.name, path: `/products/${slug}` },
    ]),
    {
      "@context": "https://schema.org",
      "@type": "SoftwareApplication",
      name: product.name,
      alternateName: `${product.name} by PureSaaS`,
      applicationCategory: "BusinessApplication",
      applicationSubCategory: product.short,
      operatingSystem: "Web",
      description: product.seoDescription,
      url: `${siteConfig.url}/${lang}/products/${slug}`,
      image: `${siteConfig.url}${product.images.hero.src}`,
      brand: {
        "@type": "Brand",
        name: siteConfig.name,
      },
      publisher: {
        "@type": "Organization",
        name: siteConfig.name,
        url: siteConfig.url,
      },
      offers: {
        "@type": "Offer",
        price: "0",
        priceCurrency: "INR",
        availability: "https://schema.org/InStock",
        url: `${siteConfig.url}/${lang}/products/${slug}/register`,
      },
      featureList: product.features,
    },
    {
      "@context": "https://schema.org",
      "@type": "FAQPage",
      mainEntity: product.faqs.map(([question, answer]) => ({
        "@type": "Question",
        name: question,
        acceptedAnswer: { "@type": "Answer", text: answer },
      })),
    },
  ];

  return (
    <>
      <JsonLd data={jsonLd} />
      {slug === "buildpro" ? (
        <BuilderProPage dictionary={dictionary} locale={lang} product={product} />
      ) : (
        <ProductPage dictionary={dictionary} locale={lang} product={product} />
      )}
    </>
  );
}
