<?php
/**
 * Demo Oracle — point de donnees du rapport ASH detaille (JSON).
 *
 * Appele par report.php quand ?format=json, avant toute mise en page. Le
 * navigateur reclame la periode par tranches successives ; chacune passe ici.
 *
 * C'est precisement pourquoi le plafond de 24 h est applique ICI et pas
 * seulement dans le formulaire : sans cela, une boucle de tranches forgees
 * aurait redonne acces a n'importe quelle amplitude.
 *
 * Variables : $oraDb, $db, $currentUser, $settings. Se termine par exit.
 */
require_once __DIR__ . '/lib/DemoOracleOciConnect.php';
require_once __DIR__ . '/lib/DemoOracleAshSource.php';
require_once __DIR__ . '/lib/DemoOracleAshDetailFilters.php';
require_once __DIR__ . '/lib/DemoOracleAshDetailRepository.php';

$p = DemoOracleAshDetailFilters::parsePeriod(true);
if (!$p['valid']) {
    http_response_code(400);
    echo json_encode(['error' => t('demo_oracle.ash_bad_period'), 'rows' => []]);
    exit;
}

/*
 * La taille d'intervalle vient du client — elle est calculee sur la duree
 * TOTALE de la periode, pas sur celle de la tranche, sans quoi deux tranches
 * consecutives ne s'aligneraient pas sur la meme grille. Elle est neanmoins
 * validee contre une liste fermee : c'est une valeur qui entre dans le SQL.
 */
$bucketSecs = (int)($_GET['bucket_secs'] ?? 0);
if (!in_array($bucketSecs, [10, 60, 600], true)) {
    $bucketSecs = DemoOracleAshDetailFilters::bucketSecs($p['begin'], $p['end']);
}

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

$src = DemoOracleAshSource::resolve($conn, ($oraDb['conn_type'] ?? '') === 'cloud');
if ($src['source'] === '') {
    oci_close($conn);
    /* `license: false` est ce que le JS attend pour afficher son encadre
       « pas de source ASH » — le protocole du module complet est conserve. */
    echo json_encode([
        'error'   => t('demo_oracle.ash_no_license'),
        'license' => false,
        'rows'    => [],
    ]);
    exit;
}

/*
 * $queryError distingue « aucun echantillon » de « la requete a echoue ».
 * Sans lui, les deux rendaient un tableau vide et la page restait muette :
 * une table du snapper invisible depuis ce compte produisait exactement le
 * meme ecran qu'une periode calme. Le JavaScript sait deja lever sur `error`
 * — c'est le serveur qui ne le renseignait jamais.
 */
$queryError = null;
$rows = DemoOracleAshDetailRepository::fetchRows(
    $conn, $src['source'], $p['begin'], $p['end'], $bucketSecs, $queryError
);
oci_close($conn);

if ($queryError !== null) {
    echo json_encode([
        'rows'       => [],
        'error'      => 'ORA-' . $queryError['code'] . ': ' . $queryError['message'],
        'license'    => true,
        'dataSource' => $src['source'],
    ]);
    exit;
}

echo json_encode([
    'rows'       => $rows,
    'error'      => null,
    'license'    => true,
    'dataSource' => $src['source'],
    'clamped'    => $p['clamped'],
]);
exit;
