<?php
/**
 * sitemap.php — mapa del sitio en XML.
 *
 * Se sirve como /sitemap.xml mediante la regla de reescritura de .htaccess.
 *
 * Se genera desde cache/programas.json, que ya está en disco: no hace ninguna
 * llamada de red, así que responde igual de rápido esté la API arriba o abajo.
 * Con más de 2.200 programas en catálogo, el descubrimiento no puede depender
 * sólo del enlazado interno.
 */

header('Content-Type: application/xml; charset=UTF-8');

$BASE = 'https://esam.edu.bo';

/** Páginas fijas: ruta => [prioridad, frecuencia] */
$estaticas = [
    '/' => ['1.0', 'daily'],
    '/catalogo.php' => ['0.9', 'daily'],
    '/posgrados/' => ['0.9', 'weekly'],
    '/posgrados/todos.php' => ['0.8', 'daily'],
    '/posgrados/programas-a-z.php' => ['0.7', 'weekly'],
    '/ecosistema/' => ['0.8', 'monthly'],
    '/agentes-ia/' => ['0.8', 'monthly'],
    '/agentes-ia/asistente-marketing.php' => ['0.6', 'monthly'],
    '/agentes-ia/copiloto-academico.php' => ['0.9', 'weekly'],
    '/sobre-nosotros/' => ['0.7', 'monthly'],
    '/sedes/' => ['0.7', 'monthly'],
    '/contacto/' => ['0.7', 'monthly'],
    '/biblioteca-virtual/' => ['0.6', 'weekly'],
    '/eventos/' => ['0.6', 'weekly'],
    '/eventos/webinars.php' => ['0.6', 'weekly'],
    '/podcasts/' => ['0.5', 'weekly'],
    '/mira-escucha/' => ['0.6', 'weekly'],
    '/actividades/' => ['0.5', 'weekly'],
    '/calendario-academico/' => ['0.5', 'weekly'],
    '/politica-privacidad/' => ['0.3', 'yearly'],
    '/terminos-condiciones/' => ['0.3', 'yearly'],
];

$hoy = date('Y-m-d');

/**
 * Programas del catálogo. Se deduplica por nombre: un mismo posgrado se
 * publica como varias filas (una por grupo y gestión) y no tiene sentido
 * ofrecer al buscador media docena de URLs con el mismo contenido.
 */
$programas = [];
$archivo = __DIR__ . '/cache/programas.json';

if (is_file($archivo)) {
    require_once __DIR__ . '/helpers/program_helpers.php';

    $datos = json_decode((string) file_get_contents($archivo), true);
    $lista = $datos['data']['programas'] ?? [];

    $vistos = [];
    foreach ($lista as $p) {
        $id = $p['id'] ?? null;
        if (!$id) {
            continue;
        }
        $clave = mb_strtolower(trim(preg_replace(
            '/\s+/u',
            ' ',
            removePrefix($p['postgrado']['nombre'] ?? '')
        )));
        if ($clave === '' || isset($vistos[$clave])) {
            continue;
        }
        $vistos[$clave] = true;

        // La fecha de inicio llega en milisegundos.
        $inicio = $p['fecha_inicio'] ?? null;
        $fecha = $hoy;
        if (is_numeric($inicio)) {
            $seg = $inicio > 9999999999 ? (int) ($inicio / 1000) : (int) $inicio;
            $fecha = date('Y-m-d', $seg);
        }

        $programas[] = ['id' => $id, 'fecha' => $fecha];
    }
}

$url = function ($ruta, $prioridad, $frecuencia, $fecha) use ($BASE) {
    printf(
        "  <url>\n    <loc>%s</loc>\n    <lastmod>%s</lastmod>\n" .
        "    <changefreq>%s</changefreq>\n    <priority>%s</priority>\n  </url>\n",
        htmlspecialchars($BASE . $ruta, ENT_XML1 | ENT_QUOTES, 'UTF-8'),
        $fecha,
        $frecuencia,
        $prioridad
    );
};

echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

foreach ($estaticas as $ruta => [$prioridad, $frecuencia]) {
    $url($ruta, $prioridad, $frecuencia, $hoy);
}

foreach ($programas as $p) {
    // La fecha de inicio no es fecha de modificación, pero es la señal de
    // frescura más fiable que hay: cambia cuando se abre una nueva cohorte.
    $url('/posgrados/info.php?id=' . (int) $p['id'], '0.8', 'weekly', $p['fecha']);
}

echo '</urlset>' . "\n";
