<?php
/**
 * Demo Oracle — generation des URL du module.
 *
 * Difference majeure avec le module Oracle complet : celui-ci sert des URL
 * propres `/oracle/...` grace a un front-controller (mon-appli/oracle/) et a
 * une regle de reecriture posee dans le `.htaccess` du COEUR. Ces deux
 * elements vivent dans le depot principal, pas dans le module.
 *
 * Le module de demonstration vit dans son propre depot et doit s'installer
 * seul : il ne peut donc rien ajouter au `.htaccess` du coeur. Il route
 * lui-meme, par `report.php?section=...`, comme le fait le module PostgreSQL.
 * Les URL sont moins jolies ; le module est autonome.
 *
 * Safe to include multiple times (guard sur function_exists).
 */

// Defini AVANT le guard : les definitions de fonctions etant hoistees, le
// guard court-circuite le reste du fichier des le premier include, et un
// define place apres serait ignore.
if (!defined('DEMO_ORACLE_BASE')) {
    define('DEMO_ORACLE_BASE', '/modules/demo_oracle');
}

if (function_exists('demo_oracle_url')) return;

/**
 * Sections de rapport, et pour chacune : sa cle i18n de titre, et si elle est
 * reellement servie par la demonstration ou remplacee par une page
 * d'indisponibilite.
 *
 * C'est la carte de reference du module : la barre de menus, le routeur et la
 * documentation la lisent tous les trois. Une section ajoutee ici apparait
 * partout ; une section oubliee n'apparait nulle part.
 *
 * Une entree peut porter `'nav' => false` : elle est servie par le routeur
 * mais n'apparait dans aucune rangee de menu. C'est le cas du detail SQL, qui
 * n'a de sens qu'avec un SQL_ID et se rejoint depuis les rapports.
 *
 * @return array<string, array{menu: string, label: string, demo: bool, nav?: bool}>
 */
function demo_oracle_sections(): array
{
    return [
        // Configuration
        'config'               => ['menu' => 'config',   'label' => 'demo_oracle.report_config',        'demo' => true],
        'config/tablespaces'   => ['menu' => 'config',   'label' => 'demo_oracle.ts_report',            'demo' => true],
        'config/memory'        => ['menu' => 'config',   'label' => 'demo_oracle.mem_title',            'demo' => true],
        'config/alertlog'      => ['menu' => 'config',   'label' => 'demo_oracle.alertlog_title',       'demo' => false],
        'config/indicators'    => ['menu' => 'config',   'label' => 'demo_oracle.indicators_title',     'demo' => true],
        'config/stats'         => ['menu' => 'config',   'label' => 'demo_oracle.cfgstats_title',       'demo' => true],
        'config/sqltune'       => ['menu' => 'config',   'label' => 'demo_oracle.cfgsqlt_title',        'demo' => true],
        'config/restorepoints' => ['menu' => 'config',   'label' => 'demo_oracle.restorepoints_title',  'demo' => false],
        'config/audit'         => ['menu' => 'config',   'label' => 'demo_oracle.cfgaudit_title',       'demo' => false],

        // Temps reel
        'realtime'             => ['menu' => 'realtime', 'label' => 'demo_oracle.report_realtime',      'demo' => true],
        'realtime/sessions'    => ['menu' => 'realtime', 'label' => 'demo_oracle.sess_title',           'demo' => true],
        'realtime/locks'       => ['menu' => 'realtime', 'label' => 'demo_oracle.locks_title',          'demo' => true],

        // Detail d'un SQL_ID — hors menu : on y arrive depuis les rapports.
        'sql/detail'           => ['menu' => 'realtime', 'label' => 'demo_oracle.sqld_title',           'demo' => true, 'nav' => false],

        // Historique
        'history'              => ['menu' => 'history',  'label' => 'demo_oracle.report_history',       'demo' => true],
        'history/detail'       => ['menu' => 'history',  'label' => 'demo_oracle.ash_detail_nav',       'demo' => true],

        // Rapports Oracle — ASH et AWR appellent DBMS_WORKLOAD_REPOSITORY,
        // qui releve du Diagnostic Pack : ils restent verrouilles.
        // Le SQL Monitor, lui, est reconstruit a partir des vues : la
        // demonstration le sert sans aucune licence.
        'reports/ash'          => ['menu' => 'reports',  'label' => 'demo_oracle.reports_ash',          'demo' => false],
        'reports/awr'          => ['menu' => 'reports',  'label' => 'demo_oracle.reports_awr',          'demo' => false],
        'reports/sqlmon'       => ['menu' => 'reports',  'label' => 'demo_oracle.reports_sqlmon',       'demo' => true],

        // Diagnostic — inchange
        'diag/slowdown'        => ['menu' => 'diag',     'label' => 'demo_oracle.diag_slowdown_title',  'demo' => true],
        'diag/ora1555'         => ['menu' => 'diag',     'label' => 'demo_oracle.diag_ora1555_title',   'demo' => true],
        'diag/ora4030'         => ['menu' => 'diag',     'label' => 'demo_oracle.diag_ora4030_title',   'demo' => true],
        'diag/ora4031'         => ['menu' => 'diag',     'label' => 'demo_oracle.diag_ora4031_title',   'demo' => true],

        // Dashboards
        'dash/backup_summary'  => ['menu' => 'dash',     'label' => 'demo_oracle.dash_bksum_title',     'demo' => true],
        'dash/licenses'        => ['menu' => 'dash',     'label' => 'demo_oracle.dash_licenses_title',  'demo' => false],
        'dash/scheduler'       => ['menu' => 'dash',     'label' => 'demo_oracle.dash_scheduler_title', 'demo' => false],
        'dash/exports'         => ['menu' => 'dash',     'label' => 'demo_oracle.dash_exports_title',   'demo' => true],
        'dash/stats'           => ['menu' => 'dash',     'label' => 'demo_oracle.dash_stats_title',     'demo' => false],
        'dash/tde_wallets'     => ['menu' => 'dash',     'label' => 'demo_oracle.dash_tde_title',       'demo' => true],
    ];
}

/** Les six menus, dans l'ordre d'affichage, avec leur icone et leur titre. */
function demo_oracle_menus(): array
{
    return [
        'config'   => ['icon' => '&#9881;',  'label' => 'demo_oracle.report_config'],
        'realtime' => ['icon' => '&#9889;',  'label' => 'demo_oracle.report_realtime'],
        'history'  => ['icon' => '&#128197;', 'label' => 'demo_oracle.report_history'],
        'reports'  => ['icon' => '&#128209;', 'label' => 'demo_oracle.reports_menu'],
        'diag'     => ['icon' => '&#129658;', 'label' => 'demo_oracle.diag_menu'],
        'dash'     => ['icon' => '&#128202;', 'label' => 'demo_oracle.dash_menu'],
    ];
}

/** Cette section existe-t-elle, et est-elle servie par la demonstration ? */
function demo_oracle_section_is_demo(string $section): bool
{
    $all = demo_oracle_sections();
    return (bool)($all[$section]['demo'] ?? false);
}

function demo_oracle_url(string $route, array $p = []): string
{
    $B = DEMO_ORACLE_BASE;

    switch ($route) {
        case 'home':       return $B . '/';
        case 'db.list':    return $B . '/databases.php';
        case 'db.new':     return $B . '/databases.php?action=new';
        case 'db.edit':    return $B . '/databases.php?action=edit&id=' . (int)($p['id'] ?? 0);
        case 'connect':    return $B . '/connect.php';
        case 'disconnect': return $B . '/disconnect.php';
        case 'admin':      return $B . '/admin.php';
        case 'test':       return $B . '/test_connection.php';

        case 'report':
            $section = (string)($p['section'] ?? '');
            $url     = $B . '/report.php';
            $query   = [];
            if ($section !== '') $query['section'] = $section;
            foreach ($p as $k => $v) {
                if ($k === 'section' || is_array($v) || $v === null || $v === '') continue;
                $query[$k] = is_bool($v) ? ($v ? '1' : '0') : (string)$v;
            }
            return $query ? $url . '?' . http_build_query($query) : $url;

        default:
            return $B . '/';
    }
}
