import { PublicLayout } from "@/components/layout/public/public-layout";
import { Metadata } from "next";
import { notFound } from "next/navigation";
import ReviewGrid from "../_components/review-grid";
import { createCaller, createHelpers } from "@/lib/trpc/server";
import { PostOrderEnum, ReviewTypeEnum, TopicsEnum } from "@/config/enums";
import RelatedReview from "../_components/related-review";
import { transformPostsToArticleList, transformPostToArticle } from "@/features/posts/_lib/transformers";
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 = "anmeldelser";

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: ["tags"],
        topic: TopicsEnum.REVIEWS,
        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 ReviewPage({ 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", "review"],
            topic: TopicsEnum.REVIEWS,
            slug
        });

        if (!post) {
            notFound();
        }

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

        const reviewPost = transformPostToArticle(post);

        const [mostRead, relatedReview, lastFilms, lastScenes] = await Promise.all([
            helpers.posts.list.fetch({
                limit: 5,
                reviewType: post.review?.type || ReviewTypeEnum.SCENE,
                topic: TopicsEnum.REVIEWS,
                orderBy: PostOrderEnum.VIEWS
            }),
            helpers.posts.list.fetch({
                limit: 4,
                topic: TopicsEnum.REVIEWS,
                reviewType: post.review?.type || ReviewTypeEnum.SCENE,
                orderBy: PostOrderEnum.POPULAR,
                relateSlug: slug
            }),
            helpers.posts.list.fetch({
                limit: 4,
                topic: TopicsEnum.REVIEWS,
                reviewType: ReviewTypeEnum.FILM,
                orderBy: PostOrderEnum.PUBLISHED_AT
            }),
            helpers.posts.list.fetch({
                reviewType: ReviewTypeEnum.SCENE,
                limit: 2,
                topic: TopicsEnum.REVIEWS,
                orderBy: PostOrderEnum.PUBLISHED_AT
            })
        ]);

        const relatedReviewData = transformPostsToArticleList(relatedReview);
        const lastFilmsData = transformPostsToArticleList(lastFilms);
        const lastScenesData = transformPostsToArticleList(lastScenes);
        const mostReadData = transformPostsToArticleList(mostRead);

        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")
                        }}
                    />
                )}
                <ReviewGrid post={reviewPost} mostRead={mostReadData} />
                <CommentSection background='red' postId={post.id} />
                <RelatedReview
                    data={relatedReviewData}
                    title={`relaterede ${reviewPost.review?.type || ReviewTypeEnum.SCENE}`}
                />
                <RelatedReview data={lastFilmsData} title='seneste film' />
                <RelatedReview data={lastScenesData} title='seneste scene' isInline />
            </PublicLayout>
        );
    } catch {
        notFound();
    }
}
