import type { Metadata } from "next";
import ProductDetail from "@/features/shop/product-detail";
import {
  effectivePrice,
  getPublicProductBySlug,
  resolvePublicMediaUrl,
} from "@/lib/public-product";

const SITE_URL = (process.env.NEXT_PUBLIC_SITE_URL || "https://nizamify.com").replace(/\/$/, "");

function getDescription(raw?: string | null) {
  const text = String(raw || "")
    .replace(/<[^>]+>/g, " ")
    .replace(/&nbsp;/gi, " ")
    .replace(/\s+/g, " ")
    .trim();
  if (!text) return "Explore product details, price, and variants on Nizamify.";
  return text.slice(0, 180);
}

export async function generateMetadata({
  params,
}: {
  params: { slug: string };
}): Promise<Metadata> {
  const product = await getPublicProductBySlug(params.slug);
  if (!product) {
    return {
      title: "Product Not Found | Nizamify",
      robots: { index: false, follow: false },
    };
  }

  const title = product.metaTitle?.trim() || `${product.title} | Nizamify`;
  const description = product.metaDescription?.trim() || getDescription(product.description);
  const canonical = `/product/${product.slug}`;
  const image = resolvePublicMediaUrl(product.images?.[0]);

  return {
    title,
    description,
    keywords: ["Nizamify product", product.title, "buy online"],
    alternates: { canonical },
    openGraph: {
      title,
      description,
      type: "website",
      url: `${SITE_URL}${canonical}`,
      images: image
        ? [
            {
              url: image,
              alt: product.title,
            },
          ]
        : undefined,
    },
    twitter: {
      card: "summary_large_image",
      title,
      description,
      images: image ? [image] : undefined,
    },
  };
}

export default async function ProductDetailPage({
  params,
}: {
  params: { slug: string };
}) {
  const product = await getPublicProductBySlug(params.slug);
  const image = resolvePublicMediaUrl(product?.images?.[0]);
  const description = product?.metaDescription?.trim() || getDescription(product?.description);
  const productSchema = product
    ? {
        "@context": "https://schema.org",
        "@type": "Product",
        name: product.title,
        description,
        image: image ? [image] : undefined,
        sku: product._id,
        category: product.categories?.map((c) => c.name).join(", ") || undefined,
        url: `${SITE_URL}/product/${product.slug}`,
        brand: {
          "@type": "Brand",
          name: "Nizamify",
        },
        offers: {
          "@type": "Offer",
          url: `${SITE_URL}/product/${product.slug}`,
          priceCurrency: "PKR",
          price: effectivePrice(product),
          availability:
            product.stock != null && product.stock <= 0
              ? "https://schema.org/OutOfStock"
              : "https://schema.org/InStock",
        },
      }
    : null;

  return (
    <>
      {productSchema ? (
        <script
          type="application/ld+json"
          dangerouslySetInnerHTML={{ __html: JSON.stringify(productSchema) }}
        />
      ) : null}
      <ProductDetail slug={params.slug} />
    </>
  );
}
