import type { MetadataRoute } from "next";

const API_URL  = process.env.NEXT_PUBLIC_API_URL  ?? "http://localhost:8000";
const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://drivehub.in";

// Revalidate sitemap every hour
export const revalidate = 3600;

const FETCH_OPTS = {
  next: { revalidate: 3600 },
  signal: AbortSignal.timeout(10_000),
} as const;

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  // ── Static routes ─────────────────────────────────────────────────────────
  const staticRoutes: MetadataRoute.Sitemap = [
    { url: BASE_URL,                      lastModified: new Date(), changeFrequency: "daily",   priority: 1.0 },
    { url: `${BASE_URL}/cars`,            lastModified: new Date(), changeFrequency: "hourly",  priority: 0.9 },
    { url: `${BASE_URL}/news`,            lastModified: new Date(), changeFrequency: "hourly",  priority: 0.8 },
    { url: `${BASE_URL}/blogs`,           lastModified: new Date(), changeFrequency: "daily",   priority: 0.7 },
    { url: `${BASE_URL}/compare`,         lastModified: new Date(), changeFrequency: "weekly",  priority: 0.6 },
    { url: `${BASE_URL}/brands`,          lastModified: new Date(), changeFrequency: "weekly",  priority: 0.7 },
    { url: `${BASE_URL}/best-cars`,       lastModified: new Date(), changeFrequency: "weekly",  priority: 0.6 },
    { url: `${BASE_URL}/wishlist`,        lastModified: new Date(), changeFrequency: "monthly", priority: 0.3 },
    { url: `${BASE_URL}/garage`,          lastModified: new Date(), changeFrequency: "monthly", priority: 0.3 },
    { url: `${BASE_URL}/privacy`,         lastModified: new Date(), changeFrequency: "yearly",  priority: 0.2 },
    { url: `${BASE_URL}/terms`,           lastModified: new Date(), changeFrequency: "yearly",  priority: 0.2 },
  ];

  try {
    // Fetch dynamic content in parallel
    const [carsRes, newsRes, blogsRes, brandsRes] = await Promise.allSettled([
      fetch(`${API_URL}/api/cars?limit=500&sortBy=year&sortOrder=-1&fields=id,lastUpdated`, FETCH_OPTS),
      fetch(`${API_URL}/api/news?limit=500&fields=slug,publishedAt`, FETCH_OPTS),
      fetch(`${API_URL}/api/blogs?limit=500&fields=slug,publishedAt`, FETCH_OPTS),
      fetch(`${API_URL}/api/cars/brands`, FETCH_OPTS),
    ]);

    // ── Car pages ───────────────────────────────────────────────────────────
    const carRoutes: MetadataRoute.Sitemap =
      carsRes.status === "fulfilled" && carsRes.value.ok
        ? ((await carsRes.value.json()).cars ?? []).map(
            (car: { id: string; lastUpdated?: string }) => ({
              url: `${BASE_URL}/cars/${car.id}`,
              lastModified: car.lastUpdated ? new Date(car.lastUpdated) : new Date(),
              changeFrequency: "weekly" as const,
              priority: 0.8,
            })
          )
        : [];

    // ── News articles ────────────────────────────────────────────────────────
    const newsRoutes: MetadataRoute.Sitemap =
      newsRes.status === "fulfilled" && newsRes.value.ok
        ? ((await newsRes.value.json()).articles ?? []).map(
            (a: { slug: string; publishedAt?: string }) => ({
              url: `${BASE_URL}/news/${a.slug}`,
              lastModified: a.publishedAt ? new Date(a.publishedAt) : new Date(),
              changeFrequency: "monthly" as const,
              priority: 0.6,
            })
          )
        : [];

    // ── Blog posts ──────────────────────────────────────────────────────────
    const blogRoutes: MetadataRoute.Sitemap =
      blogsRes.status === "fulfilled" && blogsRes.value.ok
        ? ((await blogsRes.value.json()).blogs ?? []).map(
            (b: { slug: string; publishedAt?: string }) => ({
              url: `${BASE_URL}/blogs/${b.slug}`,
              lastModified: b.publishedAt ? new Date(b.publishedAt) : new Date(),
              changeFrequency: "monthly" as const,
              priority: 0.6,
            })
          )
        : [];

    // ── Brand pages ─────────────────────────────────────────────────────────
    const brandRoutes: MetadataRoute.Sitemap =
      brandsRes.status === "fulfilled" && brandsRes.value.ok
        ? ((await brandsRes.value.json()).brands ?? []).map(
            (brand: string) => ({
              url: `${BASE_URL}/brands/${encodeURIComponent(brand.toLowerCase().replace(/\s+/g, "-"))}`,
              lastModified: new Date(),
              changeFrequency: "weekly" as const,
              priority: 0.7,
            })
          )
        : [];

    return [...staticRoutes, ...carRoutes, ...newsRoutes, ...blogRoutes, ...brandRoutes];
  } catch {
    return staticRoutes;
  }
}
