import { Metadata } from 'next';
import { notFound } from 'next/navigation';
import { PublicLayout } from '@/components/layout/public/public-layout';
import { createHelpers } from '@/lib/trpc/server';
import { PostOrderEnum } from '@/config/enums';
import { HydrationBoundary, dehydrate } from '@tanstack/react-query';
import SkribentList from './_components/skribent-list';
import SkribentHeader from './_components/skribent-header';
import { adaptAuthorToContentData, AuthorForAdapter, AuthorProfileInput } from '@/lib/meta-tags';
import { buildMetadataFromContent, generateMetaTags } from '@/lib/meta-tags/server';

type Props = {
  params: Promise<{ slug: string }>;
};

const toAuthorForAdapter = (author: AuthorProfileInput): AuthorForAdapter => ({
  name: author.name,
  bio: author.jobInfo ?? undefined,
  image: author.avatar?.url ?? undefined,
  slug: author.slug
});

export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { slug } = await params;

  const helpers = await createHelpers();
  const author = await helpers.profile.get.fetch({ slug });

  if (!author) {
    return {
      title: `${slug?.replace('-', ' ')} | Magasinet KBH`,
      description: 'Author page on Magasinet KBH'
    };
  }

  const contentData = adaptAuthorToContentData(toAuthorForAdapter(author));
  return await buildMetadataFromContent(contentData);
}

export default async function SkribentPage({ params }: Props) {
  const { slug } = await params;
  const helpers = await createHelpers();

  const author = await helpers.profile.get.fetch({ slug });

  if (!author) {
    notFound();
  }

  await Promise.all([
    helpers.posts.list.prefetch({
      with: ['project', 'tags', 'review', 'primaryTag', 'author', 'vision'],
      authorSlug: slug,
      limit: 8,
      orderBy: PostOrderEnum.PUBLISHED_AT
    }),
    helpers.posts.count.prefetch({
      authorSlug: slug
    })
  ]);

  const contentData = adaptAuthorToContentData(toAuthorForAdapter(author));
  const { jsonLd } = await generateMetaTags(contentData);

  return (
    <PublicLayout>
      {jsonLd && (
        <script
          type="application/ld+json"
          dangerouslySetInnerHTML={{
            __html: JSON.stringify(jsonLd).replace(/</g, '\\u003c')
          }}
        />
      )}
      <HydrationBoundary state={dehydrate(helpers.queryClient)}>
        <SkribentHeader slug={slug} />
        <SkribentList slug={slug} />
      </HydrationBoundary>
    </PublicLayout>
  );
}
