import { NextResponse } from "next/server";
import { getSupabaseClient } from "@/lib/supabase";

/**
 * Indice de sitemaps do dominio.
 *
 * O robots.txt aponta um sitemap so, e daqui o Google segue para o sitemap de
 * cada loja. Sem esse indice cada lojista teria que cadastrar a propria URL no
 * Search Console para ser descoberto.
 *
 * Loja com "nao indexar" fica de fora — quem pediu para nao aparecer nao entra
 * nem na lista.
 */
export const dynamic = "force-dynamic";

const BASE_URL = String(
  process.env.NEXT_PUBLIC_PUBLIC_CATALOG_BASE_URL || "https://ktalogu.com.br"
).replace(/\/$/, "");

function escapeXml(value: string) {
  return value
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&apos;");
}

export async function GET() {
  let entries: Array<{ slug: string; updatedAt?: string | null }> = [];

  try {
    const supabase = getSupabaseClient();
    const { data } = await supabase
      .from("profiles")
      .select("slug,updated_at,catalog_noindex,catalog_access_mode,catalog_status")
      .not("slug", "is", null)
      .neq("slug", "")
      .limit(5000);

    entries = (data || [])
      .filter(
        (profile) =>
          !profile.catalog_noindex &&
          profile.catalog_access_mode !== "clients" &&
          profile.catalog_status !== "closed" &&
          String(profile.slug || "").trim()
      )
      .map((profile) => ({ slug: String(profile.slug), updatedAt: profile.updated_at }));
  } catch {
    entries = [];
  }

  const body = `<?xml version="1.0" encoding="UTF-8"?>\n<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${entries
    .map((entry) => {
      const lastmod = entry.updatedAt
        ? `\n    <lastmod>${escapeXml(new Date(entry.updatedAt).toISOString())}</lastmod>`
        : "";
      return `  <sitemap>\n    <loc>${escapeXml(`${BASE_URL}/${entry.slug}/sitemap.xml`)}</loc>${lastmod}\n  </sitemap>`;
    })
    .join("\n")}\n</sitemapindex>`;

  return new NextResponse(body, {
    status: 200,
    headers: {
      "content-type": "application/xml; charset=utf-8",
      "cache-control": "public, max-age=0, s-maxage=3600, stale-while-revalidate=86400",
    },
  });
}
