import type { MetadataRoute } from "next";
import { extractDomain } from "../lib/utils/domain";
import { getProgramsAction } from "../lib/actions/programsAction";
import { fetchWorkshopActivities } from "../lib/actions/workshopAction";
import { detailHref } from "../lib/utils/detailHref";

// Per-tenant sitemap: lists this franchisee's static pages plus every program
// and workshop, generated live from the backend per request domain. URLs use
// the same `detailHref` slug convention as the site's links + canonicals.
export const dynamic = "force-dynamic";

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  let domain = "web.youngengineers.org";
  try {
    domain = await extractDomain();
  } catch {
    // Headers unavailable (e.g. build) — fall back to the default host.
  }

  const baseUrl = `https://${domain}`;
  const now = new Date();

  const staticEntries: MetadataRoute.Sitemap = [
    { url: `${baseUrl}/`, lastModified: now, changeFrequency: "weekly", priority: 1 },
    { url: `${baseUrl}/about`, lastModified: now, changeFrequency: "monthly", priority: 0.7 },
    { url: `${baseUrl}/programs`, lastModified: now, changeFrequency: "weekly", priority: 0.9 },
    { url: `${baseUrl}/workshops`, lastModified: now, changeFrequency: "weekly", priority: 0.9 },
    { url: `${baseUrl}/class-registration`, lastModified: now, changeFrequency: "weekly", priority: 0.8 },
    { url: `${baseUrl}/privacy-policy`, lastModified: now, changeFrequency: "yearly", priority: 0.3 },
    { url: `${baseUrl}/terms-of-use`, lastModified: now, changeFrequency: "yearly", priority: 0.3 },
  ];

  // Fetch the program & workshop lists (per-domain). Failures degrade to empty
  // so the static sitemap still serves.
  const [programsRes, workshopsRes] = await Promise.all([
    getProgramsAction().catch(() => null),
    fetchWorkshopActivities().catch(() => null),
  ]);

  const programEntries: MetadataRoute.Sitemap =
    programsRes?.success && Array.isArray(programsRes.data)
      ? programsRes.data
          .filter((p) => p?.id)
          .map((p) => ({
            url: `${baseUrl}${detailHref("/programs", p.id, p.slug)}`,
            lastModified: now,
            changeFrequency: "weekly" as const,
            priority: 0.8,
          }))
      : [];

  const workshopEntries: MetadataRoute.Sitemap =
    workshopsRes?.success && Array.isArray(workshopsRes.data)
      ? workshopsRes.data
          .filter((w) => w?.id)
          .map((w) => ({
            url: `${baseUrl}${detailHref("/workshops", w.id, w.slug)}`,
            lastModified: now,
            changeFrequency: "weekly" as const,
            priority: 0.8,
          }))
      : [];

  return [...staticEntries, ...programEntries, ...workshopEntries];
}
