<?php
/**
 * Demo Oracle — point de donnees du SQL Monitor (JSON).
 *
 * Appele par report.php quand ?format=json, AVANT toute mise en page.
 *
 * Les parametres passent par DemoOracleSqlMonFilters::parse(), qui plafonne :
 * une URL forgee (?limit=500&refresh=1) rend la meme chose qu'un clic. Ce
 * fichier est atteignable directement — griser les boutons cote page ne
 * protegerait rien.
 *
 * PAS DE CACHE, contrairement a _data_realtime.php : chaque appel est un
 * ECHANTILLON de GV$SESSION, et c'est leur accumulation qui fait le rapport.
 * Servir une reponse mise en cache reviendrait a compter deux fois le meme
 * instant, ou a n'en compter aucun.
 *
 * Variables disponibles : $oraDb, $db, $currentUser, $settings.
 * Se termine par exit.
 */
require_once __DIR__ . '/lib/DemoOracleOciConnect.php';
require_once __DIR__ . '/lib/DemoOracleSqlMonSource.php';
require_once __DIR__ . '/lib/DemoOracleSqlMonFilters.php';
require_once __DIR__ . '/lib/DemoOracleSqlMonitorRepository.php';
require_once __DIR__ . '/lib/DemoOracleSqlMonPayload.php';

$f = DemoOracleSqlMonFilters::parse();

if (($_GET['sql_id'] ?? '') !== '' && !$f['sql_id_valid']) {
    echo json_encode(['error' => t('demo_oracle.sqlmon_bad_sqlid')]);
    exit;
}

$ociError = null;
$conn = demo_oracle_oci_open($oraDb, $db, $ociError, '', 'reports/sqlmon/data');
if (!$conn) {
    echo json_encode(['error' => $ociError
        ? ('ORA-' . $ociError['code'] . ': ' . $ociError['message'])
        : t('demo_oracle.connect_error')]);
    exit;
}

$src = DemoOracleSqlMonSource::resolve($conn, ($oraDb['conn_type'] ?? '') === 'cloud');

if ($f['has_exec']) {
    $dbKey = md5(($oraDb['host'] ?? '') . '|' . ($oraDb['service_name'] ?? '')
               . '|' . ($oraDb['username'] ?? ''));

    $payload = DemoOracleSqlMonPayload::build(
        $conn, $src, $dbKey,
        $f['sql_id'], (int)$f['exec_id'], $f['exec_start'],
        $f['phv'], time(), $f['max_plan_lines']);
} else {
    /* Sans pack il n'existe aucun inventaire persistant : la liste ne montre
       que ce qui tourne. C'est la limite honnete de cette source, et la vue
       le dit plutot que de laisser croire a une base au repos. */
    $payload = [
        'updated'    => date('H:i:s'),
        'source'     => $src['source'],
        'licensed'   => !empty($src['licensed']),
        'executions' => DemoOracleSqlMonitorRepository::listExecutionsSession(
            $conn, $f['sql_id'], $f['limit']),
    ];
}

oci_close($conn);
echo json_encode($payload);
exit;
