<?php
declare(strict_types=1);

require_once __DIR__ . '/../app/db.php';

$config = require __DIR__ . '/../config.php';
$base = rtrim((string)($config['base_path'] ?? ''), '/');
if ($base === '') $base = rtrim(dirname($_SERVER['SCRIPT_NAME'] ?? ''), '/');

$appUrl = rtrim((string)($config['app_url'] ?? ''), '/');
if ($appUrl === '') {
  // fallback local
  $appUrl = 'http://localhost';
}

// IMPORTANT: URL racine publique
$site = $appUrl . $base;

// XML header
header('Content-Type: application/xml; charset=utf-8');

function xml(string $s): string {
  return htmlspecialchars($s, ENT_QUOTES | ENT_XML1, 'UTF-8');
}

$now = date('c');

// --- URLs à inclure ---
$urls = [];

// Home
$urls[] = [
  'loc' => $site . '/',
  'lastmod' => $now,
  'changefreq' => 'daily',
  'priority' => '1.0',
];

// Catégories
$cats = db()->query("SELECT slug, created_at FROM categories ORDER BY id")->fetchAll();
foreach ($cats as $c) {
  $slug = (string)($c['slug'] ?? '');
  if ($slug === '') continue;

  // URL query (compatible sans rewrite)
  $loc = $site . '/category.php?slug=' . rawurlencode($slug);

  $urls[] = [
    'loc' => $loc,
    'lastmod' => !empty($c['created_at']) ? date('c', strtotime((string)$c['created_at'])) : $now,
    'changefreq' => 'daily',
    'priority' => '0.8',
  ];
}

// Sous-catégories
$subs = db()->query("
  SELECT s.slug AS sub_slug, c.slug AS cat_slug, s.created_at
  FROM subcategories s
  JOIN categories c ON c.id = s.category_id
  ORDER BY c.id, s.id
")->fetchAll();

foreach ($subs as $s) {
  $catSlug = (string)($s['cat_slug'] ?? '');
  $subSlug = (string)($s['sub_slug'] ?? '');
  if ($catSlug === '' || $subSlug === '') continue;

  $loc = $site . '/subcategory.php?c=' . rawurlencode($catSlug) . '&s=' . rawurlencode($subSlug);

  $urls[] = [
    'loc' => $loc,
    'lastmod' => !empty($s['created_at']) ? date('c', strtotime((string)$s['created_at'])) : $now,
    'changefreq' => 'daily',
    'priority' => '0.7',
  ];
}

// ✅ Optionnel: Annonces actives (limite pour rester léger)
$ads = db()->query("
  SELECT id, updated_at, created_at
  FROM ads
  WHERE status='active'
  ORDER BY COALESCE(updated_at, created_at) DESC
  LIMIT 2000
")->fetchAll();

foreach ($ads as $a) {
  $id = (int)($a['id'] ?? 0);
  if ($id <= 0) continue;

  $last = (string)($a['updated_at'] ?? '');
  if ($last === '') $last = (string)($a['created_at'] ?? '');
  $lastmod = $last ? date('c', strtotime($last)) : $now;

  $urls[] = [
    'loc' => $site . '/ad.php?id=' . $id,
    'lastmod' => $lastmod,
    'changefreq' => 'weekly',
    'priority' => '0.6',
  ];
}

// ---- Output sitemap XML ----
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
echo "<urlset xmlns=\"https://www.sitemaps.org/schemas/sitemap/0.9\">\n";

foreach ($urls as $u) {
  echo "  <url>\n";
  echo "    <loc>" . xml($u['loc']) . "</loc>\n";
  echo "    <lastmod>" . xml($u['lastmod']) . "</lastmod>\n";
  echo "    <changefreq>" . xml($u['changefreq']) . "</changefreq>\n";
  echo "    <priority>" . xml($u['priority']) . "</priority>\n";
  echo "  </url>\n";
}

echo "</urlset>";
