import type { MetadataRoute } from "next";

import { routes } from "@/config/routes";
import { getAllLieuSlugs } from "@/lib/wp/queries/lieu";
import { getAllWpPageUris } from "@/lib/wp/queries/page";
import { getAllPostSlugs } from "@/lib/wp/queries/post";
import { HARDCODED_URIS, normalizeUri } from "@/lib/wp/hardcodedUris";
import { I18N_ROUTES } from "@/config/i18nRoutes";
import { WP_I18N_ENABLED } from "@/lib/wp/flags";

const SITE_URL = "https://www.covalba.fr";

// Triple FR/EN/ES indexé par URI FR, hors index blog (EN/ES front-only non rendu ;
// FR blog réconcilié sur /guides).
const TRIPLES = I18N_ROUTES.filter((t) => t.fr !== "/guides");
const tripleByFr = new Map(TRIPLES.map((t) => [t.fr, t]));

/** alternates.languages (hreflang) pour une URI FR du jeu i18n, sinon undefined. */
function languagesFor(frUri: string): Record<string, string> | undefined {
  const t = tripleByFr.get(frUri);
  if (!t) return undefined;
  return {
    fr: `${SITE_URL}${t.fr}`,
    en: `${SITE_URL}${t.en}`,
    es: `${SITE_URL}${t.es}`,
  };
}

/**
 * Remplace l'ancien plugin sitemap de vite.config.ts.
 * Source de vérité : src/config/routes.ts (path, priority, changefreq)
 * + les pages SEO locales du CPT WordPress `lieu`
 * + les pages WP créées au BO et servies par le catch-all app/[...slug]
 * + (si i18n activé) les variantes EN/ES des 26 pages avec alternates hreflang.
 */
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const lastModified = new Date();

  const staticEntries: MetadataRoute.Sitemap = routes.map((route) => {
    const languages = WP_I18N_ENABLED ? languagesFor(route.path) : undefined;
    return {
      url: `${SITE_URL}${route.path === "/" ? "" : route.path}`,
      lastModified,
      changeFrequency: route.changefreq,
      priority: route.priority,
      ...(languages ? { alternates: { languages } } : {}),
    };
  });

  // Variantes EN/ES (la variante FR est déjà dans staticEntries avec ses alternates).
  const localizedEntries: MetadataRoute.Sitemap = WP_I18N_ENABLED
    ? TRIPLES.flatMap((t) => {
        const languages = {
          fr: `${SITE_URL}${t.fr}`,
          en: `${SITE_URL}${t.en}`,
          es: `${SITE_URL}${t.es}`,
        };
        return (["en", "es"] as const).map((loc) => ({
          url: `${SITE_URL}${t[loc]}`,
          lastModified,
          changeFrequency: "weekly" as const,
          priority: 0.7,
          alternates: { languages },
        }));
      })
    : [];

  let lieuEntries: MetadataRoute.Sitemap = [];
  try {
    const slugs = await getAllLieuSlugs();
    lieuEntries = slugs.map((slug) => ({
      url: `${SITE_URL}/${slug}`,
      lastModified,
      changeFrequency: "monthly" as const,
      priority: 0.7,
    }));
  } catch (error) {
    console.error("[wp] énumération des lieux indisponible pour le sitemap :", error);
  }

  let wpEntries: MetadataRoute.Sitemap = [];
  try {
    const uris = await getAllWpPageUris();
    wpEntries = uris
      .map(normalizeUri)
      .filter((uri) => uri !== "/" && !HARDCODED_URIS.has(uri))
      .map((uri) => ({
        url: `${SITE_URL}${uri}`,
        lastModified,
        changeFrequency: "monthly" as const,
        priority: 0.6,
      }));
  } catch (error) {
    console.error("[wp] énumération des pages indisponible pour le sitemap :", error);
  }

  let postEntries: MetadataRoute.Sitemap = [];
  try {
    const slugs = await getAllPostSlugs();
    postEntries = slugs.map((slug) => ({
      url: `${SITE_URL}/blog/${slug}`,
      lastModified,
      changeFrequency: "monthly" as const,
      priority: 0.6,
    }));
  } catch (error) {
    console.error("[wp] énumération des articles indisponible pour le sitemap :", error);
  }

  return [...staticEntries, ...localizedEntries, ...lieuEntries, ...wpEntries, ...postEntries];
}
