<?php
/**
 * sitemap.php — Sitemap XML dynamique IPTV Premium
 * ─────────────────────────────────────────────────────────────
 * • Génère automatiquement le XML à chaque requête
 * • Ajoute un nouvel article = sitemap mis à jour instantanément
 * • Supporte : images, hreflang, news (extensible)
 * • Cache : headers HTTP Cache-Control 24h (évite surcharge serveur)
 * • Google Search Console : soumettre https://purevisioniptv.net/sitemap.php
 * ─────────────────────────────────────────────────────────────
 */

// ── CONFIG ────────────────────────────────────────────────────
define('SITE_URL',  'https://purevisioniptv.net');
define('SITE_NAME', 'IPTV Premium');

// ── CACHE HTTP 24H ────────────────────────────────────────────
// Évite de régénérer le sitemap à chaque visite de bot
$cache_duration = 86400; // 24h en secondes
header('Content-Type: application/xml; charset=utf-8');
header('X-Robots-Tag: noindex'); // le sitemap lui-même n'est pas indexé
header('Cache-Control: public, max-age=' . $cache_duration);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $cache_duration) . ' GMT');

// ─────────────────────────────────────────────────────────────
//  PAGES STATIQUES
//  slug     → URL relative ('' = accueil)
//  lastmod  → date de dernière modification (YYYY-MM-DD)
//  freq     → changefreq Google : always|hourly|daily|weekly|monthly|yearly|never
//  priority → 0.0 à 1.0 (accueil = 1.0, articles = 0.9, légal = 0.2)
//  image    → ['loc'=>'', 'title'=>'', 'caption'=>''] ou null
// ─────────────────────────────────────────────────────────────
$pages_statiques = [
  [
    'slug'     => '',
    'lastmod'  => '2026-03-10',
    'freq'     => 'weekly',
    'priority' => '1.0',
    'image'    => [
      'loc'     => SITE_URL . '/assets/images/iptv-premium-hero.webp',
      'title'   => 'Abonnement IPTV Premium 4K — 80 000 chaînes & VOD',
      'caption' => 'Interface IPTV Premium avec chaînes HD et 4K',
    ],
  ],
  [
    'slug'     => 'blog/index.php',
    'lastmod'  => '2026-03-10',
    'freq'     => 'weekly',
    'priority' => '0.8',
    'image'    => null,
  ],
  [
    'slug'     => 'mentions-legales.php',
    'lastmod'  => '2026-03-10',
    'freq'     => 'yearly',
    'priority' => '0.2',
    'image'    => null,
  ],
];

// ─────────────────────────────────────────────────────────────
//  ARTICLES DE BLOG
//  → Ajouter un article ici = sitemap mis à jour automatiquement
//  → Ordre : du plus récent au plus ancien
// ─────────────────────────────────────────────────────────────
$articles_blog = [
  [
    'slug'     => 'pourquoi-mon-iptv-coupe-le-soir-solution-anti-freeze',
    'lastmod'  => '2026-03-14',
    'freq'     => 'monthly',
    'priority' => '0.9',
    'image'    => [
      'loc'     => SITE_URL . '/blog/images/pourquoi-mon-iptv-coupe-le-soir-solution-anti-freeze.webp',
      'title'   => 'IPTV qui coupe le soir — Solution Anti-Freeze PureVisionIPTV CDN',
      'caption' => 'Pourquoi l\'IPTV freeze à 21h et comment y remédier avec un CDN dédié',
    ],
  ],
  [
    'slug'     => 'iptv-gratuit-piege-securite-2026',
    'lastmod'  => '2026-03-13',
    'freq'     => 'monthly',
    'priority' => '0.9',
    'image'    => [
      'loc'     => SITE_URL . '/blog/images/iptv-gratuit-piege-securite-2026.webp',
      'title'   => 'IPTV Gratuit danger sécurité 2026 — PureVisionIPTV',
      'caption' => 'Pourquoi l\'IPTV gratuit expose vos données et comment s\'en protéger',
    ],
  ],
  [
    'slug'     => 'ligue-champions-ligue1-iptv-premium-4k',
    'lastmod'  => '2026-03-10',
    'freq'     => 'monthly',
    'priority' => '0.9',
    'image'    => [
      'loc'     => SITE_URL . '/blog/images/ligue-champions-ligue1-iptv-premium-4k.webp',
      'title'   => 'Regarder la Ligue des Champions et Ligue 1 en IPTV Premium 4K sans latence',
      'caption' => 'Streaming 4K IPTV Premium pour le football en direct',
    ],
  ],

  // ── Ajouter les prochains articles ici ──
  // [
  //   'slug'    => 'meilleur-iptv-maroc-2026',
  //   'lastmod' => '2026-03-15',
  //   'freq'    => 'monthly',
  //   'priority'=> '0.9',
  //   'image'   => [
  //     'loc'     => SITE_URL . '/blog/images/meilleur-iptv-maroc-2026.webp',
  //     'title'   => 'Meilleur abonnement IPTV Maroc 2026',
  //     'caption' => 'IPTV Premium au Maroc — chaînes arabes et françaises',
  //   ],
  // ],
];

// ─────────────────────────────────────────────────────────────
//  PAGES GÉO-CIBLÉES (à décommenter quand les pages sont créées)
// ─────────────────────────────────────────────────────────────
$pages_geo = [
  // ['slug'=>'iptv-maroc',    'lastmod'=>'2026-03-10', 'freq'=>'monthly', 'priority'=>'0.85'],
  // ['slug'=>'iptv-belgique', 'lastmod'=>'2026-03-10', 'freq'=>'monthly', 'priority'=>'0.85'],
  // ['slug'=>'iptv-algerie',  'lastmod'=>'2026-03-10', 'freq'=>'monthly', 'priority'=>'0.85'],
  // ['slug'=>'iptv-suisse',   'lastmod'=>'2026-03-10', 'freq'=>'monthly', 'priority'=>'0.85'],
];

// ─────────────────────────────────────────────────────────────
//  HELPER — Échapper les caractères XML
// ─────────────────────────────────────────────────────────────
function xml_esc(string $str): string {
  return htmlspecialchars($str, ENT_XML1 | ENT_QUOTES, 'UTF-8');
}

// ─────────────────────────────────────────────────────────────
//  HELPER — Générer un bloc <url>
// ─────────────────────────────────────────────────────────────
function render_url(array $entry, string $base_url, bool $is_blog = false): string {
  $slug = $entry['slug'] ?? '';

  // Construire l'URL propre
  if ($is_blog && $slug !== '') {
    $loc = $base_url . '/blog/' . $slug . '.php';
  } elseif ($slug === '') {
    $loc = $base_url . '/';
  } else {
    $loc = $base_url . '/' . $slug;
  }

  $out  = "  <url>\n";
  $out .= "    <loc>" . xml_esc($loc) . "</loc>\n";
  $out .= "    <lastmod>" . xml_esc($entry['lastmod']) . "</lastmod>\n";
  $out .= "    <changefreq>" . xml_esc($entry['freq']) . "</changefreq>\n";
  $out .= "    <priority>" . xml_esc($entry['priority']) . "</priority>\n";

  // Image optionnelle
  if (!empty($entry['image'])) {
    $img = $entry['image'];
    $out .= "    <image:image>\n";
    $out .= "      <image:loc>" . xml_esc($img['loc']) . "</image:loc>\n";
    if (!empty($img['title'])) {
      $out .= "      <image:title>" . xml_esc($img['title']) . "</image:title>\n";
    }
    if (!empty($img['caption'])) {
      $out .= "      <image:caption>" . xml_esc($img['caption']) . "</image:caption>\n";
    }
    $out .= "    </image:image>\n";
  }

  $out .= "  </url>\n";
  return $out;
}

// ─────────────────────────────────────────────────────────────
//  GÉNÉRATION DU XML
// ─────────────────────────────────────────────────────────────
$base = SITE_URL;

echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>' . "\n";
echo '<urlset' . "\n";
echo '  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"' . "\n";
echo '  xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"' . "\n";
echo '  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' . "\n";
echo '  xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9' . "\n";
echo '    http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' . "\n\n";

// Pages statiques
echo "  <!-- ═══ PAGES STATIQUES ═══ -->\n";
foreach ($pages_statiques as $page) {
  echo render_url($page, $base);
}

// Articles blog
if (!empty($articles_blog)) {
  echo "\n  <!-- ═══ ARTICLES BLOG (" . count($articles_blog) . ") ═══ -->\n";
  foreach ($articles_blog as $article) {
    echo render_url($article, $base, true);
  }
}

// Pages géo
if (!empty($pages_geo)) {
  echo "\n  <!-- ═══ PAGES GÉO-CIBLÉES (" . count($pages_geo) . ") ═══ -->\n";
  foreach ($pages_geo as $geo) {
    echo render_url($geo, $base);
  }
}

echo "\n</urlset>\n";
