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

import { hasLocale } from "@/app/[lang]/dictionaries";
import { LegalPage } from "@/components/legal/legal-page";
import { termsOfService } from "@/lib/legal/terms";
import { localizedAlternates } from "@/lib/seo/alternates";

/**
 * Clamp a meta description to ~155 chars on a word boundary so it isn't
 * truncated mid-word in SERPs. Returns the input unchanged when short enough.
 */
function clampDescription(text: string, max = 155): string {
  if (text.length <= max) return text;
  const sliced = text.slice(0, max);
  const lastSpace = sliced.lastIndexOf(" ");
  return `${(lastSpace > 0 ? sliced.slice(0, lastSpace) : sliced).trimEnd()}…`;
}

export async function generateMetadata({
  params,
}: PageProps<"/[lang]/terms">): Promise<Metadata> {
  const { lang } = await params;
  const doc = termsOfService[hasLocale(lang) ? lang : "en"];
  const description = clampDescription(doc.intro);
  return {
    title: `${doc.title} | SEO Insight`,
    description,
    alternates: localizedAlternates("/terms", lang),
    openGraph: {
      title: doc.title,
      description,
      locale: lang === "fr" ? "fr_FR" : "en_US",
    },
  };
}

export default async function TermsPage({
  params,
}: PageProps<"/[lang]/terms">) {
  const { lang } = await params;
  if (!hasLocale(lang)) notFound();
  return <LegalPage doc={termsOfService[lang]} lang={lang} />;
}
