<?php
/**
 * Demo Oracle — routeur des rapports.
 *
 * Le module complet route par URL propres (`/oracle/report/config/tablespaces`)
 * grace a un front-controller et a une reecriture Apache, tous deux poses dans
 * le depot du coeur. Ce module vit dans son propre depot et doit s'installer
 * seul : il route donc lui-meme, par `?section=`.
 *
 * Ce fichier ne contient AUCUN gestionnaire d'action, et c'est delibere : le
 * report.php du module complet en compte une vingtaine (kill de session,
 * ALTER SYSTEM, resize de datafile, DBMS_STATS, profils SQL, points de
 * restauration, politiques d'audit...). Les retirer de l'interface sans les
 * retirer du serveur n'aurait rien protege — ils ne sont pas ici.
 */
require_once dirname(__DIR__, 2) . '/bootstrap.php';
require_once __DIR__ . '/lib/boot.php';

$auth->requireRole('demo_oracle_admin', 'demo_oracle_user');

if (!$moduleRegistry->canAccess('demo_oracle', $currentUser)) {
    http_response_code(403);
    include WEBROOT_PATH . '/includes/403.php';
    exit;
}

// Toute lecture suppose une base selectionnee.
$oraDb = Session::get('demo_oracle_selected_db');
if (!$oraDb) {
    Session::setFlash('error', t('demo_oracle.select_db_first'));
    header('Location: ' . demo_oracle_url('home'));
    exit;
}

if (!Session::has('csrf_token')) {
    Session::set('csrf_token', bin2hex(random_bytes(32)));
}

$sections = demo_oracle_sections();
$section  = (string)($_GET['section'] ?? '');

// Section inconnue : on ramene a la vue d'ensemble plutot que d'afficher une
// erreur. Un lien perime doit degrader, pas casser.
if ($section !== '' && !isset($sections[$section])) {
    $section = '';
}
$meta = $sections[$section] ?? null;

/*
 * Point de donnees des rapports auto-rafraichis (temps reel, sessions,
 * verrous). Il doit repondre AVANT toute mise en page : le partiel HTML est
 * inclus depuis layout.php, donc apres l'envoi des en-tetes et du <head>.
 * Emettre du JSON depuis un partiel produirait une page HTML contenant du
 * JSON, ce que le JS ne saurait pas lire.
 *
 * En lecture seule et sans effet de bord : aucun POST n'est accepte ici, pas
 * plus qu'ailleurs dans ce module.
 */
if (($_GET['format'] ?? '') === 'json') {
    header('Content-Type: application/json; charset=utf-8');

    if ($meta === null || !$meta['demo']) {
        http_response_code(404);
        echo json_encode(['error' => t('demo_oracle.full_only')]);
        exit;
    }
    $dataFile = __DIR__ . '/_data_' . str_replace('/', '_', $section) . '.php';
    if (!is_file($dataFile)) {
        http_response_code(404);
        echo json_encode(['error' => t('demo_oracle.section_wip')]);
        exit;
    }
    require $dataFile;   // doit se terminer par exit
    exit;
}

/*
 * Trois cas, resolus ici pour que la mise en page reste un seul fichier :
 *   overview  vue d'ensemble de la base connectee
 *   locked    section absente de la demonstration
 *   partial   section servie, deleguee a son partiel _report_*.php
 */
if ($section === '') {
    $mode    = 'overview';
    $partial = '';
} elseif (!$meta['demo']) {
    $mode    = 'locked';
    $partial = '';
} else {
    $partial = __DIR__ . '/_report_' . str_replace('/', '_', $section) . '.php';
    // Etat transitoire du portage progressif (cf. README) : une section
    // annoncee dans la carte mais pas encore portee le dit franchement,
    // plutot que de rendre une page vide.
    $mode    = is_file($partial) ? 'partial' : 'wip';
}

View::display(__DIR__ . '/views/report/layout.php', [
    'mode'       => $mode,
    'partial'    => $partial,
    'section'    => $section,
    'sections'   => $sections,
    'menus'      => demo_oracle_menus(),
    'oraDb'      => $oraDb,
    'csrfToken'  => Session::get('csrf_token'),
    'pageTitle'  => $meta ? t($meta['label']) : t('demo_oracle.report_overview'),
]);
