<?php
/**
 * View: Demo Oracle — mise en page commune des rapports.
 *
 * ── D'ou vient la barre laterale ────────────────────────────────────────────
 *
 * Le module Oracle complet recoit la sienne du COEUR : mon-appli/includes/
 * header.php code en dur un `<aside class="oracle-sidebar">` des que
 * `oracle_url()` existe et qu'une base est selectionnee. Le module PostgreSQL
 * a droit au meme traitement. Un troisieme module ne peut pas s'y ajouter sans
 * modifier le depot principal, ce qui briserait l'autonomie de celui-ci.
 *
 * Il rend donc sa PROPRE barre, ici, en reutilisant les classes du coeur
 * (`oracle-sidebar`, `oracle-dropdown`…). Ce n'est pas un detournement : le
 * module s'appuie deja sur `card`, `btn`, `data-table`, `cfg-*`, `sql-tab-*` —
 * toutes definies dans le meme main.css. Reutiliser les classes du rail, plutot
 * que d'en dupliquer soixante lignes, garantit que la demonstration suivra
 * l'apparence du module complet sans entretien.
 *
 * Deux pieces manquent, que le coeur ne pose que pour ses deux modules :
 *
 *   - la classe `has-oracle-sidebar` sur le `<body>`, qui decale `.site-main`
 *     de 52 px. Impossible de l'ajouter : le `<body>` est ecrit par header.php
 *     avant que ce fichier ne prenne la main. La regle equivalente est donc
 *     reposee dans le bloc <style> ci-dessous — en CSS et non en JavaScript,
 *     pour qu'elle s'applique avant le premier rendu et non apres.
 *   - le bouton de repli, qui vit dans la barre de titre. Il est injecte par
 *     le petit script de fin de fichier, AVANT que main.js ne s'execute :
 *     celui-ci le retrouve par son identifiant et lui greffe la persistance du
 *     repli, comme pour les deux autres modules.
 *
 * Le reste est deja generique dans le coeur : `ociToggle()` ouvre n'importe
 * quel `.oracle-dropdown`, et `--ora-header-h` est calcule pour tout le monde.
 *
 * Variables : $mode, $partial, $section, $sections, $menus, $oraDb,
 *             $csrfToken, $pageTitle
 */
/*
 * Le titre de l'onglet ne porte que le nom du rapport : le nom de
 * l'installation figure deja en pied de page, et ces pages sont exposees
 * publiquement. Le coeur honore ce drapeau depuis mon-appli/includes/
 * header.php ; sur un deploiement plus ancien, le suffixe reste simplement la.
 */
$pageTitleNoApp = true;

include WEBROOT_PATH . '/includes/header.php';

$currentMenu = $sections[$section]['menu'] ?? '';

/** Premiere section visible d'un menu — la cible de son icone. */
$firstOf = function (string $menu) use ($sections): string {
    foreach ($sections as $path => $s) {
        if ($s['menu'] === $menu && ($s['nav'] ?? true)) return $path;
    }
    return '';
};
?>

<style>
/* Decalage du contenu : equivalent de `body.has-oracle-sidebar .site-main`,
   que ce module ne peut pas declencher (cf. l'en-tete du fichier). La regle
   se neutralise d'elle-meme quand le rail est replie, exactement comme celle
   du coeur. */
body:not(.oracle-sidebar-collapsed) .site-main {
    margin-left: 52px;
    transition: margin-left .2s ease;
}
@media (max-width: 720px) {
    body:not(.oracle-sidebar-collapsed) .site-main { margin-left: 0; }
}
</style>

<?php /* ── Rail des rapports ──────────────────────────────────────────────
         Une icone par menu, sous-menu en survol a droite. Une section absente
         de la demonstration reste listee, avec un cadenas : la masquer
         priverait le visiteur de l'information la plus utile — ce que fait la
         version complete. */ ?>
<aside class="oracle-sidebar" id="oracle-sidebar" aria-label="<?= htmlspecialchars(t('demo_oracle.nav_reports')) ?>">
    <nav class="oracle-sidebar-nav">
        <?php foreach ($menus as $key => $m):
            $menuId = 'demo-menu-' . $key;
            $on     = ($key === $currentMenu);
        ?>
        <div class="oracle-dropdown" id="<?= $menuId ?>">
            <button type="button" class="oracle-dropdown-btn <?= $on ? 'active' : '' ?>"
                    onclick="ociToggle('<?= $menuId ?>', event)"
                    title="<?= htmlspecialchars(t($m['label'])) ?>"><?= $m['icon'] ?></button>
            <div class="oracle-dropdown-menu">
                <?php foreach ($sections as $path => $s):
                    if ($s['menu'] !== $key || !($s['nav'] ?? true)) continue;
                ?>
                <a href="<?= demo_oracle_url('report', ['section' => $path]) ?>"
                   <?= $path === $section ? 'class="active"' : '' ?>
                   <?= $s['demo'] ? '' : 'title="' . htmlspecialchars(t('demo_oracle.full_only')) . '"' ?>>
                    <?= htmlspecialchars(t($s['label'])) ?><?php if (!$s['demo']): ?> &#128274;<?php endif; ?>
                </a>
                <?php endforeach; ?>
            </div>
        </div>
        <?php endforeach; ?>
    </nav>
    <?php /* Le rail ne porte que les menus. Le retour au module passe par son
             entree dans la barre de navigation, et la deconnexion par la page
             d'accueil du module, qui l'offre deja sous le rappel de la base
             connectee. */ ?>
</aside>

<?php /* Pas de ligne de titre ici : chaque rapport porte deja la sienne, et le
         nom de la base figure dans la barre de navigation. La repeter faisait
         deux titres l'un au-dessus de l'autre. Le retour a l'accueil et la
         deconnexion ont rejoint le bas du rail. */ ?>

<?php
switch ($mode) {
    case 'overview':
        include __DIR__ . '/overview.php';
        break;

    case 'locked':
        /* L'en-tete est pose ici, pas dans DemoOracleDemo::page() : cette
           methode sert aussi les onglets verrouilles du detail SQL, ou un
           titre de page n'aurait rien a faire au milieu d'un panneau. */
        echo '<div class="page-header"><h1 style="margin:0">'
           . htmlspecialchars($pageTitle) . '</h1></div>';
        echo DemoOracleDemo::page($pageTitle);
        break;

    case 'partial':
        include $partial;
        break;

    default:
        echo '<div class="page-header"><h1 style="margin:0">'
           . htmlspecialchars($pageTitle) . '</h1></div>'
           . '<div class="card"><p>' . htmlspecialchars(t('demo_oracle.section_wip')) . '</p></div>';
}
?>

<script>
/*
 * Injecte dans la barre de titre le bouton de repli et le nom de la base, que
 * le coeur ne pose que pour ses deux modules. Ce script s'execute AVANT
 * main.js : celui-ci retrouvera le bouton par son identifiant et lui greffera
 * la persistance du repli.
 *
 * Si la barre de titre change de structure, l'injection echoue sans bruit et
 * le rail reste simplement deplie — degrader, pas casser.
 */
(function () {
    var left = document.querySelector('.main-nav .nav-left');
    if (!left || document.getElementById('oracle-sidebar-toggle')) return;

    var label = <?= json_encode(t('demo_oracle.nav_reports')) ?>;

    var btn = document.createElement('button');
    btn.type = 'button';
    btn.id = 'oracle-sidebar-toggle';
    btn.className = 'oracle-sidebar-toggle';
    btn.title = label;
    btn.setAttribute('aria-label', label);
    btn.textContent = '☰';

    // Le nom du module n'est pas repete ici : son entree est deja mise en
    // evidence dans la barre de navigation.
    var name = document.createElement('span');
    name.className = 'oracle-nav-label';
    name.innerHTML = '\u{1F5C4} <strong></strong> ';
    name.querySelector('strong').textContent = <?= json_encode((string)($oraDb['name'] ?? '')) ?>;

    var badge = document.createElement('span');
    badge.className = 'badge badge-info';
    badge.style.fontSize = '.7em';
    badge.textContent = <?= json_encode(t('demo_oracle.nav_readonly')) ?>;
    name.appendChild(badge);

    var sep = document.createElement('span');
    sep.className = 'oracle-nav-sep';

    left.insertBefore(sep,  left.firstChild);
    left.insertBefore(name, left.firstChild);
    left.insertBefore(btn,  left.firstChild);
})();
</script>

<?php include __DIR__ . '/_nav_end.php'; ?>
<?php include WEBROOT_PATH . '/includes/footer.php'; ?>
