import { NextRequest, NextResponse } from 'next/server';

// type Params = { slug: string };

function stripXml(idOrXml: string) {
  return idOrXml.endsWith('.xml') ? idOrXml.slice(0, -4) : idOrXml;
}

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

function joinUrl(base: string, path: string) {
  if (!base.endsWith('/') && !path.startsWith('/')) return `${base}/${path}`;
  if (base.endsWith('/') && path.startsWith('/')) return `${base}${path.slice(1)}`;
  return `${base}${path}`;
}

export async function GET(_req: NextRequest, { params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params;
  const id = stripXml(slug);

  if (!id) return new NextResponse('id is required', { status: 400 });

  const base = process.env.API_BASE_URL;
  if (!base) return new NextResponse('API_BASE_URL is not configured', { status: 500 });

  const url = joinUrl(base, `common/sitemap/${id}`);

  try {
    const res = await fetch(url, { cache: 'no-store', headers: { Accept: 'application/json' } });
    if (!res.ok) return new NextResponse(`Upstream error (${res.status})`, { status: 502 });

    const data: any[] = await res.json();

    const head =
      `<?xml version="1.0" encoding="UTF-8"?>` +
      `<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ` +
      `xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" ` +
      `xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 ` +
      `http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd ` +
      `http://www.google.com/schemas/sitemap-image/1.1 ` +
      `http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" ` +
      `xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`

    const body = (data ?? [])
      .filter(p => p?.url)
      .map(p => {
        const loc = `<loc>${escapeXml(p.url)}</loc>`;
        const lastmod = p.lastmod ? `<lastmod>${escapeXml(p.lastmod)}</lastmod>` : '';
        return `<url>${loc}${lastmod}</url>`;
      })
      .join('');

    const xml = `${head}${body}</urlset>`;

    return new NextResponse(xml, {
      headers: {
        'Content-Type': 'application/xml; charset=utf-8',
        'Cache-Control': 'public, s-maxage=0, max-age=0, must-revalidate',
      },
    });
  } catch {
    return new NextResponse('Error generating sitemap', { status: 500 });
  }
}
