import HomePage from "@/components/home/homePage";
import NovelPage from "@/components/novel/novelPage";
import { getBannerOneModal, getBannerTopPosition } from "@/libs/axios/modules/banner";
import { getGenre } from "@/libs/axios/modules/genre";
import { getTag } from "@/libs/axios/modules/tag";
import { getPostDetail } from "@/libs/axios/modules/post";
import {
  getFinishedCerpens,
  getForbiddenAreaCerpens,
  getFunniestCerpens,
  getHistoriesCerpens,
  getHorrorsCerpens,
  getMostViewsCerpens,
  getNewestCerpens,
  getCerpens,
  getPreferenceCerpens,
  getRankingCerpens,
  getStrongestCerpens,
  getTrendingCerpens,
} from "@/libs/axios/modules/cerpen";
import { queryCerpens } from "@/libs/query/cerpenQuery";
import { getFollowing, getProfile } from "@/libs/axios/modules/user";
import { AuthorModel, BannerModel, GenreModel, PostModel, TagModel, UserModel } 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
    ? "KutuBuku Cerpen - Read Excitingly and get MONEY!"
    : "KutuBuku Cerpen - Baca Seru Dapat CUAN!";
  const description = isEn
    ? "Discover thousands of free short stories on KutuBuku - romance, horror, fantasy and more. Read for free or start writing and earn."
    : "Temukan ribuan cerpen gratis di KutuBuku - romance, horror, fantasy, dan masih banyak lagi. Baca gratis atau mulai menulis dan hasilkan cuan.";
  const canonical = `/${locale}/cerpen`;

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

export default async function Cerpen({
  searchParams,
}: {
  searchParams: Promise<{
    sort?: string;
    genre?: string;
    tag?: string;
    page?: string;
    search?: string;
  }>;
}) {
  const params = await searchParams;
  const isBrowsing = !!(params.search || params.genre || params.tag || (params.sort && params.sort !== "all"));

  const cookieStore = await cookies();
  const token = cookieStore.get("token");
  const rawToken = token?.value?.slice(1, -1);

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

  let user: UserModel | null = null;
  let isTokenInvalid = false;

  if (rawToken) {
    try {
      const profileRes = await getProfile(rawToken);
      user = profileRes.data.data ?? null;
    } catch {
      isTokenInvalid = true;
    }
  }

  const isValidToken = !!user;

  // Search/genre/tag/sort present: same content, rendered as a filterable
  // browse grid instead of the curated home sections (mirrors /novel).
  if (isBrowsing) {
    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 cerpens = await queryCerpens({
      sort,
      page,
      limit: 12,
      filter,
      user,
      onboarding,
    });

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

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

    return (
      <NovelPage
        novels={cerpens}
        genres={genres}
        tags={tags}
        totalPages={totalPages}
        apiBasePath="cerpen"
        title="Cerpen"
      />
    );
  }

  const fallback = { data: { data: [] } };

  const [
    bannerRes,
    bannerModalRes,
    trendingRes,
    newestRes,
    finishedRes,
    mostViewsRes,
    funniestRes,
    horrorRes,
    strongestRes,
    forbiddenAreaRes,
    followingRes,
    rankingRes,
    historiesRes,
    recommendationRes,
    tagsRes,
  ] = await Promise.all([
    getBannerTopPosition({ limit: 15 }).catch(() => fallback),
    getBannerOneModal().catch(() => fallback),
    getTrendingCerpens({ limit: 15 }).catch(() => fallback),
    getNewestCerpens({ limit: 15 }).catch(() => fallback),
    getFinishedCerpens({ limit: 15 }).catch(() => fallback),
    getMostViewsCerpens({ limit: 15 }).catch(() => fallback),
    getFunniestCerpens({ limit: 15 }).catch(() => fallback),
    getHorrorsCerpens({ limit: 15 }).catch(() => fallback),
    getStrongestCerpens({ limit: 15 }).catch(() => fallback),
    getForbiddenAreaCerpens({ limit: 15 }).catch(() => fallback),
    isValidToken
      ? getFollowing(rawToken!).catch(() => fallback)
      : Promise.resolve(fallback),
    getRankingCerpens({ limit: 0 }).catch(() => fallback),
    isValidToken
      ? getHistoriesCerpens(rawToken!, { limit: 15 }).catch(() => fallback)
      : Promise.resolve(fallback),
    getPreferenceCerpens({
      limit: 15,
      sex: user?.preference?.sex ?? onboarding?.sex ?? null,
      start: user?.preference?.age?.start ?? onboarding?.ageRange?.start ?? null,
    }).catch(() => fallback),
    getTag({ limit: 20 }).catch(() => fallback),
  ]);

  const banner: BannerModel[] = bannerRes.data.data;
  const bannerModal: BannerModel = bannerModalRes.data.data;
  const trending: PostModel[] = trendingRes.data.data;
  const newest: PostModel[] = newestRes.data.data;
  const finished: PostModel[] = finishedRes.data.data;
  const mostViews: PostModel[] = mostViewsRes.data.data;
  const funniest: PostModel[] = funniestRes.data.data;
  const horror: PostModel[] = horrorRes.data.data;
  const strongest: PostModel[] = strongestRes.data.data;
  const forbiddenArea: PostModel[] = forbiddenAreaRes.data.data;
  const following: AuthorModel[] = followingRes.data.data;
  const ranking: PostModel[] = rankingRes.data.data;
  const histories: PostModel[] = historiesRes.data.data;
  const recommendation: PostModel[] = recommendationRes.data.data;
  const tags: TagModel[] = tagsRes.data.data;

  if (bannerModal?.meta?.id) {
    try {
      const linkedPost: PostModel = (await getPostDetail(bannerModal.meta.id)).data.data;
      bannerModal.meta.slug = linkedPost.slug;
    } catch {
      // linked post couldn't be resolved, fall back to a bare-id link
    }
  }

  return (
    <HomePage
      banner={banner}
      bannerModal={bannerModal}
      tags={tags}
      following={following}
      ranking={ranking}
      recommendation={recommendation}
      trending={trending}
      newest={newest}
      finished={finished}
      mostViews={mostViews}
      histories={histories}
      funniest={funniest}
      horror={horror}
      strongest={strongest}
      forbiddenArea={forbiddenArea}
      invalidToken={isTokenInvalid}
    />
  );
}
