<?php
// Contrôleur unique de tous les sites du réseau : le site est choisi selon le domaine (table `sites`).
//   domaine/                      -> redirection vers /<langue>/
//   domaine/<lang>/               accueil de la ville
//   domaine/<lang>/all/           tous les hébergements        ?tri=&page=
//   domaine/<lang>/stars-<n>/     par nombre d'étoiles (0 = non classés)
//   domaine/<lang>/type/<slug>/   par type d'hébergement
//   domaine/<lang>/theme/<clé>/   par thème (inc/data.php themes())
//   domaine/<lang>/facility/<slug>/  par équipement
//   domaine/<lang>/near/<slug>-<poi_id>/  près d'un lieu
//   domaine/<lang>/things-to-do/[<type>/]  activités (inc/activites.php), /activity/<slug>/ fiche activité
//   <page_name>.domaine/<lang>/   fiche hôtel (ou domaine/<lang>/hotel/<page_name>/ si sous-domaines désactivés)
//   domaine/<lang>/around/  hébergements des communes voisines (< 15 km)
//   domaine/<lang>/where-to-stay/  dans quel quartier loger (secteurs calculés)
//   domaine/<lang>/when-to-book/  quand réserver (prix par mois, jour d'arrivée, semaines et week-ends)
//   domaine/<lang>/event/<slug>/  événement (marché de Noël…) : disponibilités et prix calculés
//   domaine/<lang>/about/ | contact/ | legal-notice/ | privacy/   pages d'information (inc/info.php)
//   domaine/robots.txt, domaine/sitemap.xml
declare(strict_types=1);

require dirname(__DIR__) . '/inc/bootstrap.php';
require dirname(__DIR__) . '/inc/data.php';
require dirname(__DIR__) . '/inc/icones.php';
require dirname(__DIR__) . '/inc/schema.php';
require dirname(__DIR__) . '/inc/activites.php';
require dirname(__DIR__) . '/inc/voiture.php';
require dirname(__DIR__) . '/inc/guide.php';
require dirname(__DIR__) . '/inc/info.php';
require dirname(__DIR__) . '/inc/evenement.php';
require dirname(__DIR__) . '/inc/quand.php';
require dirname(__DIR__) . '/inc/quartiers.php';
require dirname(__DIR__) . '/inc/faits_pages.php';
require dirname(__DIR__) . '/inc/autour.php';

// Sonde du load balancer : répond 200 quel que soit le domaine (vérifie aussi la base)
if (parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) === '/healthz') {
    header('Content-Type: text/plain');
    header('Cache-Control: no-store');
    try {
        db()->query('SELECT 1');
        echo 'OK';
    } catch (Throwable $e) {
        http_response_code(503);
        echo 'DB KO';
    }
    exit;
}

$SITE = site_courant();
$LANG = null;
if (!$SITE) {
    erreur(404, 'Site inconnu');
}

$chemin = (string)parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);

if ($chemin === '/robots.txt') {
    header('Content-Type: text/plain; charset=utf-8');
    header('Cache-Control: public, max-age=3600');
    echo "User-agent: *\n" . ($SITE['apercu'] ? "Disallow: /\n" : "Disallow: /api/\nDisallow: /go/\nSitemap: " . url_absolue('/sitemap.xml') . "\n");
    exit;
}
if (str_starts_with($chemin, '/go/')) {  // clic vers Booking : enregistrement puis redirection (inc/go.php)
    require ROOT . '/inc/go.php';
    go($chemin);
}
if ($chemin === '/api/calendar') {  // prix par jour d'un hôtel (appelé par la fiche, aussi sur sous-domaine)
    require ROOT . '/inc/calendrier.php';
    api_calendrier();
}
if ($chemin === '/api/faits-pages') {  // faits des listes pour listes_ia.py (serveur lui-même uniquement)
    api_faits_pages();
}
if ($chemin === '/sitemap.xml' && !$SITE['fiche']) {
    require ROOT . '/inc/sitemap.php';
    exit;
}
if ($chemin === '/' || $chemin === '') {
    $LANG = langue_navigateur($SITE);
    header('Cache-Control: private, no-store');  // dépend de la langue du navigateur : jamais en cache partagé
    redirection('/' . $LANG . '/', 302);
}
if (!preg_match('#^/([a-z]{2}(?:-[a-z]{2,4})?)(/.*)?$#', $chemin, $m) || !in_array($m[1], $SITE['langs'], true)) {
    $LANG = $SITE['lang_defaut'] ?: $SITE['langs'][0];
    erreur(404);
}
$LANG = $m[1];
$reste = $m[2] ?? '';
if ($reste === '' || substr($reste, -1) !== '/') {  // URL canonique avec / final
    $q = $_SERVER['QUERY_STRING'] ?? '';
    redirection($chemin . '/' . ($q !== '' ? '?' . $q : ''));
}
$reste = trim($reste, '/');

$hotels = hotels_ville();
if (!$hotels) {
    erreur(404);
}
$VILLE = reset($hotels)['city_name'];

// ---- fiche hôtel sur sous-domaine
if ($SITE['fiche']) {
    if ($reste !== '') {
        erreur(404);
    }
    require ROOT . '/inc/page_hotel.php';
    page_hotel($SITE['fiche']);
    exit;
}

// ---- pages de la ville
if ($reste === '') {
    require ROOT . '/inc/page_accueil.php';
    exit;
}
if (preg_match('#^hotel/([a-z0-9_-]+)$#', $reste, $m)) {
    require ROOT . '/inc/page_hotel.php';
    if ($SITE['fiches_sous_domaine'] && !$SITE['apercu'] && sous_domaine_possible($m[1])) {
        redirection(url_hotel($m[1]));
    }
    page_hotel($m[1]);
    exit;
}
if (preg_match('#^things-to-do(?:/([a-z0-9_-]+))?$#', $reste, $m)) {
    page_activites($m[1] ?? '');
    exit;
}
if ($reste === 'guide') {  // guides éditoriaux (rédigés et relus dans l'admin)
    page_guides();
    exit;
}
if (preg_match('#^guide/([a-z0-9-]+)$#', $reste, $m)) {
    page_guide($m[1]);
    exit;
}
if ($reste === 'car-rental') {  // location de voiture : agences OSM, gare, aéroports, lien Booking
    page_voiture();
    exit;
}
if ($reste === 'around') {  // hébergements des communes voisines (inc/autour.php)
    page_autour();
    exit;
}
if ($reste === 'where-to-stay') {  // dans quel quartier loger : secteurs de la ville (inc/quartiers.php)
    page_quartiers();
    exit;
}
if ($reste === 'when-to-book') {  // quand réserver : prix par mois, jour, semaine (inc/quand.php)
    page_quand();
    exit;
}
if (preg_match('#^event/([a-z0-9-]+)$#', $reste, $m)) {  // événement : disponibilités et prix (inc/evenement.php)
    page_evenement($m[1]);
    exit;
}
if (in_array($reste, PAGES_INFO, true)) {  // à propos, contact, mentions légales, confidentialité
    page_info($reste);
    exit;
}
if (preg_match('#^activity/([a-z0-9-]+)$#', $reste, $m)) {
    page_activite($m[1]);
    exit;
}
require ROOT . '/inc/page_liste.php';
page_liste($reste);
