import type { MetadataRoute } from "next";
import { listPosts, getAllCategories } from "@/lib/cms";
import { prisma } from "@/lib/db";

const SITE = process.env.NEXT_PUBLIC_SITE_URL ?? "https://finzone.io.vn";

export const dynamic = "force-dynamic";
export const revalidate = 600;

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const staticRoutes: MetadataRoute.Sitemap = [
    { url: `${SITE}/`, changeFrequency: "hourly", priority: 1 },
    { url: `${SITE}/tim-kiem`, changeFrequency: "monthly", priority: 0.4 },
  ];

  let catRoutes: MetadataRoute.Sitemap = [];
  let postRoutes: MetadataRoute.Sitemap = [];
  let pageRoutes: MetadataRoute.Sitemap = [];

  try {
    const categories = await getAllCategories();
    catRoutes = categories
      .filter((c) => (c.count ?? 0) > 0)
      .map((c) => ({
        url: `${SITE}/category/${c.slug}`,
        changeFrequency: "hourly" as const,
        priority: 0.7,
      }));
  } catch (e) {
    console.error("[sitemap] categories fetch failed:", e);
  }

  try {
    let page = 1;
    while (page <= 5) {
      const { posts, totalPages } = await listPosts({ perPage: 100, page });
      posts.forEach((p) => {
        // Skip noIndex articles
        if (p.noIndex) return;
        postRoutes.push({
          url: `${SITE}/${p.slug}`,
          lastModified: p.modified,
          changeFrequency: "weekly",
          priority: 0.6,
        });
      });
      if (page >= totalPages) break;
      page++;
    }
  } catch (e) {
    console.error("[sitemap] posts fetch failed:", e);
  }

  try {
    const pages = await prisma.page.findMany({
      where: { status: "published", noIndex: false },
      select: { slug: true, updatedAt: true },
    });
    pageRoutes = pages.map((p) => ({
      url: `${SITE}/${p.slug}`,
      lastModified: p.updatedAt,
      changeFrequency: "monthly" as const,
      priority: 0.5,
    }));
  } catch (e) {
    console.error("[sitemap] pages fetch failed:", e);
  }

  return [...staticRoutes, ...catRoutes, ...pageRoutes, ...postRoutes];
}
