<?php
/**
 * Demo Oracle — parametres du SQL Monitor, et leur plafonnement.
 *
 * Meme role que DemoOracleRealtimeFilters, meme raison d'etre : la page et le
 * point de donnees JSON sont deux fichiers distincts, et la validation doit
 * vivre dans un troisieme — sinon le plafonnement ne tiendrait que d'un cote.
 *
 * `parse()` IGNORE ce qui depasse et retombe sur la valeur autorisee. Une URL
 * forgee a la main — ?limit=500&refresh=1 — rend exactement la meme chose
 * qu'un clic. Griser un bouton ne protege rien.
 *
 * Safe to include multiple times (guard sur class_exists).
 */
/*
 * Les dependances sont chargees AVANT la garde, et c'est indispensable.
 *
 * PHP lie les declarations de classe a la COMPILATION du fichier, donc avant
 * d'en executer la premiere instruction. Quand la garde s'evalue, la classe
 * definie plus bas existe deja : la garde `return` systematiquement, et tout
 * ce qui la suit est du code mort. Un require_once place apres elle ne
 * s'execute jamais.
 */
require_once __DIR__ . '/DemoOracleConfig.php';

if (class_exists('DemoOracleSqlMonFilters')) return;

class DemoOracleSqlMonFilters
{
    /**
     * Lit $_GET et rend des valeurs deja plafonnees et validees.
     *
     * @return array{sql_id:string, sql_id_valid:bool, exec_id:?int,
     *               exec_start:string, phv:string, inst_id:int,
     *               has_exec:bool, limit:int, refresh:int, max_plan_lines:int}
     */
    public static function parse(): array
    {
        $sqlId = trim((string)($_GET['sql_id'] ?? ''));
        $valid = $sqlId !== '' && (bool)preg_match('/^[a-z0-9]{1,13}$/i', $sqlId);
        if (!$valid) $sqlId = '';

        $execRaw = trim((string)($_GET['exec_id'] ?? ''));
        $execId  = ctype_digit($execRaw) ? (int)$execRaw : null;

        /*
         * exec_start arrive du navigateur et part dans un TO_DATE. Le bind
         * interdit l'injection ; la forme est validee pour ne pas transformer
         * une valeur fantaisiste en ORA-01861 illisible.
         */
        $execStart = trim((string)($_GET['exec_start'] ?? ''));
        if (!preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $execStart)) {
            $execStart = '';
        }

        $phv    = preg_replace('/\D/', '', (string)($_GET['phv'] ?? ''));
        $instId = max(0, min(255, (int)($_GET['inst_id'] ?? 0)));

        /* Les trois vont ensemble : sql_exec_id seul ne designe rien, il est
           reattribue d'une execution a l'autre. */
        $hasExec = $valid && $execId !== null && $execStart !== '';

        return [
            'sql_id'         => $sqlId,
            'sql_id_valid'   => $valid,
            'exec_id'        => $execId,
            'exec_start'     => $execStart,
            'phv'            => (string)$phv,
            'inst_id'        => $instId,
            'has_exec'       => $hasExec,
            /* Plafonds : la valeur demandee n'est meme pas lue. */
            'limit'          => DEMO_ORACLE_SQLMON_MAX_EXECUTIONS,
            'refresh'        => DEMO_ORACLE_SQLMON_REFRESH_SECONDS,
            'max_plan_lines' => DEMO_ORACLE_SQLMON_MAX_PLAN_LINES,
        ];
    }
}
