import HomePage from "@/components/home/homePage";
import { getBannerOneModal, getBannerTopPosition } from "@/libs/axios/modules/banner";
import { getTag } from "@/libs/axios/modules/tag";
import {
  getFinishedPosts,
  getForbiddenAreaPosts,
  getFunniestPosts,
  getHistoriesPosts,
  getHorrorsPosts,
  getMostViewsPosts,
  getNewestPosts,
  getPostDetail,
  getPreferencePosts,
  getRankingPosts,
  getStrongestPosts,
  getTrendingPosts,
} from "@/libs/axios/modules/post";
import { getFollowing, getProfile } from "@/libs/axios/modules/user";
import { AuthorModel, BannerModel, 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 - Read Excitingly and get MONEY!"
    : "KutuBuku - Baca Seru Dapat CUAN!";
  const description = isEn
    ? "Discover thousands of free novels on KutuBuku - romance, horror, fantasy and more. Read for free or start writing and earn."
    : "Temukan ribuan novel gratis di KutuBuku - romance, horror, fantasy, dan masih banyak lagi. Baca gratis atau mulai menulis dan hasilkan cuan.";
  const canonical = `/${locale}`;

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

export default async function Home() {
  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;

  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),
    getTrendingPosts({ limit: 15 }).catch(() => fallback),
    getNewestPosts({ limit: 15 }).catch(() => fallback),
    getFinishedPosts({ limit: 15 }).catch(() => fallback),
    getMostViewsPosts({ limit: 15 }).catch(() => fallback),
    getFunniestPosts({ limit: 15 }).catch(() => fallback),
    getHorrorsPosts({ limit: 15 }).catch(() => fallback),
    getStrongestPosts({ limit: 15 }).catch(() => fallback),
    getForbiddenAreaPosts({ limit: 15 }).catch(() => fallback),
    isValidToken
      ? getFollowing(rawToken!).catch(() => fallback)
      : Promise.resolve(fallback),
    getRankingPosts({ limit: 0 }).catch(() => fallback),
    isValidToken
      ? getHistoriesPosts(rawToken!, { limit: 15 }).catch(() => fallback)
      : Promise.resolve(fallback),
    getPreferencePosts({
      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}
    />
  );
}