import { MetadataRoute } from "next";
import { client } from "@/app/lib/sanity";

const BASE_URL = "https://riyasgems.com";

async function getProducts() {
  const query = `*[_type == "product" && defined(slug.current) && slug.current != ""] {
    "slug": slug.current,
    _updatedAt
  }`;
  return await client.fetch(query);
}

async function getCategories() {
  // Pulls every category that actually has products AND a valid slug —
  // add a new gem type in Sanity and it appears here automatically.
  const query = `*[_type == "category" && defined(slug.current) && slug.current != ""
    && count(*[_type == "product" && references(^._id)]) > 0] {
    "slug": slug.current,
    _updatedAt
  }`;
  return await client.fetch(query);
}

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const [products, categories] = await Promise.all([
    getProducts(),
    getCategories(),
  ]);

  const staticRoutes: MetadataRoute.Sitemap = [
    {
      url: `${BASE_URL}/`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 1.0,
    },
    {
      url: `${BASE_URL}/gems`,
      lastModified: new Date(),
      changeFrequency: "daily",
      priority: 0.9,
    },
    {
      url: `${BASE_URL}/about-us`,
      lastModified: new Date(),
      changeFrequency: "monthly",
      priority: 0.6,
    },
    {
      url: `${BASE_URL}/blog`,
      lastModified: new Date(),
      changeFrequency: "weekly",
      priority: 0.7,
    },
  ];

  const categoryRoutes: MetadataRoute.Sitemap = categories.map(
    (category: { slug: string; _updatedAt: string }) => ({
      url: `${BASE_URL}/${category.slug}`,
      lastModified: new Date(category._updatedAt),
      changeFrequency: "weekly",
      priority: 0.8,
    }),
  );

  const productRoutes: MetadataRoute.Sitemap = products.map(
    (product: { slug: string; _updatedAt: string }) => ({
      url: `${BASE_URL}/product/${product.slug}`,
      lastModified: new Date(product._updatedAt),
      changeFrequency: "weekly",
      priority: 0.7,
    }),
  );

  return [...staticRoutes, ...categoryRoutes, ...productRoutes];
}