export const dynamic = "force-dynamic";

import NovelPage from "@/components/novel/novelPage";
import { getGenre } from "@/libs/axios/modules/genre";
import { getPosts } from "@/libs/axios/modules/post";
import { getTag } from "@/libs/axios/modules/tag";
import { queryNovels } from "@/libs/query/novelQuery";
import { GenreModel, TagModel } from "@/models";
import type { Metadata } from "next";
import { cookies } from "next/headers";

export async function generateMetadata({
    params,
}: {
    params: Promise<{ locale: string }>;
}): Promise<Metadata> {
    const { locale } = await params;
    const isEn = locale === "en";

    const title = isEn ? "Browse Novels - KutuBuku" : "Jelajahi Novel - KutuBuku";
    const description = isEn
        ? "Browse and filter thousands of novels by genre and tag on KutuBuku."
        : "Jelajahi dan filter ribuan novel berdasarkan genre dan tag di KutuBuku.";
    const canonical = `/${locale}/novel`;

    return {
        title: { absolute: title },
        description,
        alternates: { canonical },
        openGraph: { title, description, url: canonical },
        twitter: { card: "summary_large_image", title, description },
    };
}

export default async function Novel({
    searchParams,
}: {
    searchParams: Promise<{
        sort?: string;
        genre?: string;
        tag?: string;
        page?: string;
        search?: string;
    }>;
}) {
    const params = await searchParams;
    const cookieStore = await cookies();

    const userCookie = cookieStore.get("user")?.value;
    const user = userCookie ? JSON.parse(userCookie) : null;

    const onboardingCookie = cookieStore.get("onboarding")?.value;
    const onboarding = onboardingCookie ? JSON.parse(onboardingCookie) : null;

    const [genres, tags]: [GenreModel[], TagModel[]] = await Promise.all([
        getGenre({ limit: 0, page: 1 }).then((res) => res.data.data),
        getTag({ limit: 0, page: 1 }).then((res) => res.data.data),
    ]);

    const sort = params.sort || "all";
    const genre = params.genre || "";
    const tag = params.tag || "";
    const page = Number(params.page || 1);
    const search = params.search || "";

    const filter = {
        title: search,
        title_en: search,
        title_no: search,
        genre_id: genre,
        "tags.id": tag,
        "user.username": search,
    };


    const novels = await queryNovels({
        sort,
        page,
        limit: 12,
        filter,
        user,
        onboarding,
    });

    const { data: response } = await getPosts({
        page: 1,
        limit: 1,
        filter,
    });

    const totalItems = response?.pagination?.total ?? 0;
    const totalPages = Math.ceil(totalItems / 12);


    return <NovelPage novels={novels} genres={genres} tags={tags} totalPages={totalPages} />;
}
