import type { MetadataRoute } from "next";
import { IS_STAGING } from "@/lib/environment";
import { siteConfig } from "@/data/site";
import { localCategories } from "@/data/mpc-content";
import { routeAtlasGuides } from "@/data/route-atlas";
import { getAdminState } from "@/lib/admin-store";
import { defaultAdminState } from "@/lib/default-admin-state";
import { selectedListingPath, selectedListingsFromState } from "@/lib/selected-listings";
import { kidzBundles, kidzProducts } from "@/data/kidz-products";

export const dynamic = "force-dynamic";

const staticVisitorRoutes = [
  "/",
  "/about",
  "/stay",
  "/accommodation",
  "/accommodation/featured",
  "/accommodation/top-featured",
  "/accommodation/basic",
  "/local",
  "/local-options",
  "/services",
  "/restaurants",
  "/safari-drives",
  "/guides",
  "/visitor-help",
  "/partner-with-mpc",
  "/list-your-business",
  "/list-your-holiday-home",
  "/free-guides",
  "/free-guides/kruger-visitor-map",
  "/route-atlas",
  "/kidz",
  "/kidz/passport",
  "/kidz/spotting",
  "/kidz/car-safari",
  "/kidz/missions",
  "/kidz/explorer-school",
  "/kidz/rainy-day",
  "/kidz/journal",
  "/kidz/products",
  "/kidz/free",
  "/kidz/printables",
  "/kidz/digital",
  "/kidz/junior-ranger",
  "/kidz/activities",
  "/kidz/bundles",
  "/kidz/parents",
  "/kidz/safety",
  "/kidz/conservation",
  "/first-time-marloth-kruger",
  "/international-visitors-guide",
  "/plan-my-visit",
  "/contact",
  "/payment",
  "/privacy",
  "/terms",
  "/delivery-refunds",
  "/supplier-terms",
  "/legal",
  "/trust",
];

const redirectedLocalCategorySlugs = new Set([
  "security",
  "visitor-stay-services",
  "food-dining",
  "safari-drives",
  "places-to-stay",
  "cleaning",
  "gardening",
  "laundry",
  "pool-service",
  "property-management",
  "home-care",
]);

function entry(path: string, priority = 0.7, changeFrequency: MetadataRoute.Sitemap[number]["changeFrequency"] = "weekly") {
  return {
    url: new URL(path, siteConfig.url).toString(),
    changeFrequency,
    priority,
  };
}

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  if (IS_STAGING) return [];
  const state = await getAdminState().catch(() => defaultAdminState);
  const selectedListingRoutes = selectedListingsFromState(state).map((listing) => selectedListingPath(listing));

  const routes = new Set<string>([
    ...staticVisitorRoutes,
    ...routeAtlasGuides.map((guide) => `/route-atlas/${guide.slug}`),
    ...kidzProducts.map((product) => `/kidz/products/${product.slug}`),
    ...kidzBundles.map((bundle) => `/kidz/bundles/${bundle.slug}`),
    ...localCategories
      .filter((category) => !redirectedLocalCategorySlugs.has(category.slug))
      .map((category) => `/local/${category.slug}`),
    ...selectedListingRoutes,
  ]);

  routes.delete("/accommodation/marlothi-safari-home");
  return [...routes]
    .sort((a, b) => a.localeCompare(b))
    .map((path) => entry(path, path === "/" ? 1 : 0.72, path === "/" ? "daily" : "weekly"));
}
