import { Metadata } from 'next';
import { notFound } from 'next/navigation';
import PostGrid from '../_components/photo-grid';
import { PublicLayout } from '@/components/layout/public/public-layout';
import {
  transformPostsToArticleList,
  transformPostToArticle
} from '@/features/posts/_lib/transformers';
import { createCaller, createHelpers } from '@/lib/trpc/server';
import { PostOrderEnum, TopicsEnum } from '@/config/enums';
import MemberBlock from '@/components/shared/member-block';
import RelatedVision from '@/components/shared/post-sections/related-vision';
import RelatedPhoto from '@/components/shared/post-sections/related-photo';
import CommentSection from '@/components/shared/comments/comment-section';
import { adaptPostToContentData } from '@/lib/meta-tags';
import { buildMetadataFromContent, generateMetaTags } from '@/lib/meta-tags/server';

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

const BASE_PATH = 'foto';

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

  const helper = await createHelpers();
  const post = await helper.posts.get.fetch({
    with: ['author', 'tags', 'primaryTag'],
    topic: TopicsEnum.PHOTO,
    slug
  });

  if (!post) {
    return {
      title: 'Post Not Found | Magasinet KBH',
      description: 'The requested post could not be found.'
    };
  }

  const contentData = adaptPostToContentData(post, { basePath: BASE_PATH, slug });
  return await buildMetadataFromContent(contentData);
}

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

  try {
    const helpers = await createHelpers();
    const caller = await createCaller();

    const post = await helpers.posts.get.fetch({
      with: ['author', 'tags', 'primaryTag', 'postMedia', 'content'],
      topic: TopicsEnum.PHOTO,
      slug
    });

    if (!post) {
      notFound();
    }

    void caller.analytic.view({
      postId: post.id
    });

    const postData = transformPostToArticle(post);

    const [latestArticle, relatedArticle, relatedVisions] = await Promise.all([
      helpers.posts.list.fetch({
        limit: 4,
        topic: TopicsEnum.PHOTO,
        orderBy: PostOrderEnum.PUBLISHED_AT
      }),
      helpers.posts.list.fetch({
        relateSlug: slug,
        limit: 2,
        topic: TopicsEnum.PHOTO
      }),
      helpers.posts.list.fetch({
        relateSlug: slug,
        limit: 3,
        topic: TopicsEnum.VISIONS
      })
    ]);

    const relatedArticleData = transformPostsToArticleList(relatedArticle);
    const latestArticleData = transformPostsToArticleList(latestArticle);
    const relatedVisionData = transformPostsToArticleList(relatedVisions);

    const contentData = adaptPostToContentData(post, { basePath: BASE_PATH, slug });
    const { jsonLd } = await generateMetaTags(contentData);

    return (
      <PublicLayout>
        {jsonLd && (
          <script
            type="application/ld+json"
            dangerouslySetInnerHTML={{
              __html: JSON.stringify(jsonLd).replace(/</g, '\\u003c')
            }}
          />
        )}
        <PostGrid post={postData} />
        <CommentSection postId={post.id} />
        <MemberBlock />
        <RelatedPhoto title='seneste foto' data={latestArticleData} />
        <RelatedPhoto
          title='relaterede artikler'
          data={relatedArticleData}
          type='large'
        />
        <RelatedVision title='relaterede visioner' data={relatedVisionData} />
      </PublicLayout>
    );
  } catch {
    notFound();
  }
}
