import React from 'react';
import type {Metadata} from 'next';
import {notFound} from 'next/navigation';

import {getMediaPage} from '@/services/mediaPageService';
import {documentTitle} from '@/utils/documentTitle';
import MediaPageContent from './MediaPageContent';

type RouteProps = {params: Promise<{locale: string}>};

/**
 * Fabrique la page Next.js d'une page éditoriale administrée en back-office :
 * même chargement, même titre de document, même rendu pour chaque slug.
 * @param slug Slug de la page côté API (ex. `mentions-legales`).
 * @param renderExtras Bloc optionnel affiché sous le contenu (menu de sous-pages...).
 */
export function createMediaPageRoute(
  slug: string,
  renderExtras?: (locale: string) => React.ReactNode
) {
  async function generateMetadata({params}: RouteProps): Promise<Metadata> {
    const {locale} = await params;
    const page = await getMediaPage(slug, locale);

    return {title: documentTitle(page?.titre)};
  }

  async function Page({params}: RouteProps) {
    const {locale} = await params;
    const page = await getMediaPage(slug, locale);

    if (!page) {
      notFound();
    }

    return <MediaPageContent page={page}>{renderExtras?.(locale)}</MediaPageContent>;
  }

  return {generateMetadata, Page};
}
