import { createClient } from "@supabase/supabase-js";

const SITE_URL = "https://nextgamemarket.com";

const supabase = createClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL,
  process.env.SUPABASE_SERVICE_ROLE_KEY
);

function slugify(value = "") {
  return value
    .toString()
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .toLowerCase()
    .trim()
    .replace(/[^a-z0-9]+/g, "-")
    .replace(/^-+|-+$/g, "");
}

export default async function sitemap() {
  const now = new Date();

  const staticPages = [
    {
      url: `${SITE_URL}/`,
      lastModified: now,
      changeFrequency: "daily",
      priority: 1,
    },
    {
      url: `${SITE_URL}/ventes`,
      lastModified: now,
      changeFrequency: "daily",
      priority: 0.9,
    },
    {
      url: `${SITE_URL}/echanges`,
      lastModified: now,
      changeFrequency: "daily",
      priority: 0.85,
    },
    {
      url: `${SITE_URL}/vendre`,
      lastModified: now,
      changeFrequency: "weekly",
      priority: 0.8,
    },
    {
      url: `${SITE_URL}/cgv`,
      lastModified: now,
      changeFrequency: "yearly",
      priority: 0.5,
    },
    {
      url: `${SITE_URL}/confidentialite`,
      lastModified: now,
      changeFrequency: "yearly",
      priority: 0.4,
    },
    {
      url: `${SITE_URL}/plan-du-site`,
      lastModified: now,
      changeFrequency: "monthly",
      priority: 0.5,
    },
  ];

  const { data: ventes } = await supabase
    .from("vente")
    .select("title, brand, updated_at, created_at")
    .eq("status", "active")
    .limit(5000);

  const searchTerms = new Map();

  for (const vente of ventes || []) {
    const title = vente.title || "";
    const brand = vente.brand || "";
    const lastModified = vente.updated_at || vente.created_at || now;

    const titleWords = title
      .toLowerCase()
      .split(/[^a-zA-Z0-9À-ÿ]+/)
      .filter((word) => word.length >= 3);

    for (const word of titleWords) {
      const slug = slugify(word);
      if (!slug) continue;

      if (!searchTerms.has(slug)) {
        searchTerms.set(slug, lastModified);
      }
    }

    if (brand) {
      const brandSlug = slugify(brand);
      if (brandSlug && !searchTerms.has(brandSlug)) {
        searchTerms.set(brandSlug, lastModified);
      }
    }
  }

  const dynamicSearchPages = Array.from(searchTerms.entries())
  .slice(0, 1000)
  .map(([term, lastModified]) => ({
    url: `${SITE_URL}/recherche/${term}`,
    lastModified: new Date(lastModified),
    changeFrequency: "daily",
    priority: 0.75,
  }));

// === Pages jeux ===
const gamePages = new Map();

for (const vente of ventes || []) {
  const title = vente.title || "";
  if (!title) continue;

  const slug = slugify(title);
  if (!slug) continue;

  const lastModified =
    vente.updated_at || vente.created_at || now;

  if (!gamePages.has(slug)) {
    gamePages.set(slug, lastModified);
  }
}

const dynamicGamePages = Array.from(gamePages.entries())
  .slice(0, 5000)
  .map(([slug, lastModified]) => ({
    url: `${SITE_URL}/jeu/${slug}`,
    lastModified: new Date(lastModified),
    changeFrequency: "daily",
    priority: 0.8,
  }));

return [
  ...staticPages,
  ...dynamicSearchPages,
  ...dynamicGamePages,
];
}