<?php

require_once('../../base/php/classDatabase.php');
require_once('../../outils/php/JsonLogicToSql5.php');
require_once('../../base/php/lib/cti/Database/Database2Factory.class.php');
require_once('../../base/php/lib/cti/Environnement/Environnement.class.php');
require_once('etudes/cardioInterventionnelle/EtudeCardioPost.php');


/**
 * Classe executant les études
 *
 * Cette classe est limitée pour le moment au module PMSI.
 * Pourrait être "multi" module en ajoutant un paramètre à la construction de la classe.
 *
 * Utilise JSONLogic pour décrire les règles
 * @see https://jsonlogic.com/
 *
 * Converti le JSONLogic en SQL grâce à la classe JsonLogicToSql
 *      JsonLogicToSql5 -> PHP 5
 *      JsonLogicToSql  -> PHP 7+
 */
class EtudeManager
{
    /** @var JsonLogicToSql5 */
    private $jsonLogic;

    private $iCTI_connexion;


    public function __construct()
    {
        $this->jsonLogic = new JsonLogicToSql5();
        $this->iCTI_connexion = Database2Factory::getInstance(Environnement::PROVIDER_CTI);
    }

    /**
     * Supprime les anciennes données uniquement si l'étude a une requête de "suppression"
     *
     * @param string $etude
     * @return boolean
     */
    public function clear($etude)
    {
        $res = $this->iCTI_connexion->query("SELECT * FROM pmsi.t_etude WHERE code = '$etude'");
        if (!$res) {
            echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "Error" . "\t" . "Problème dans le clear de l'étude $etude";
            return false;
        }

        $record = $this->iCTI_connexion->fetchAssoc($res);
        if (!$record) {
            echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "WARNING" . "\t" . "L'étude $etude n'existe pas";
            return false;
        }

        $clearCommand = $record["clear_request"];

        if ($clearCommand !== "") {
            $this->iCTI_connexion->query($clearCommand);
            echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "INFO" . "\t" . "Suppression effectuée pour l'étude $etude";
        } else {
            echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "INFO" . "\t" . "Aucune suppression nécessaire pour l'étude $etude";
        }
        return true;
    }

    /**
     * Execute les règles pour une étude donnée
     * Récupère la requête de base et joue successivement la requête avec les clauses where générées par le JSONLogic
     * Les règles sont stockées au format JSONLogic dans la table t_etude_rules
     *
     * @param string $etude
     * @return void
     */
    public function execute($etude)
    {
        $rules = array();
        $queries = array();

        /**
         * Récupération des éléments communs à l'étude (t_etude)
         */
        $res = $this->iCTI_connexion->query("SELECT * FROM pmsi.t_etude WHERE code = '$etude'");
        if (!$res) {
            echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "ERROR" . "\t" . "Problème dans l'exécution dans de l'étude $etude";
            return;
        }

        $record = $this->iCTI_connexion->fetchAssoc($res);
        if (!$record) {
            echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "WARNING" . "\t" . "L'étude $etude n'existe pas";
            return;
        }

        $id = $record["oid"];
        $baseCommand = $record["base_request"];
        $postClass = $record["post_class"];

        /**
         * Récupération et interprétation des règles grace au JSONLogic
         */
        $res = $this->iCTI_connexion->query("SELECT * FROM pmsi.t_etude_rule WHERE etude_id = '$id'");
        while ($row = $this->iCTI_connexion->fetchAssoc($res)) {
            array_push($rules, $this->jsonLogic->apply(json_decode($row["json"], true)));
        }

        /**
         * Constitution des requêtes finales en remplacant le {{ where }} par la clause générées dynamiquement
         * Si l'étude n'a pas de rules particulère on exécute la requête de base
         */
        if (count($rules)) {
            foreach ($rules as $rule) {
                $queries[] = preg_replace("/{{\s?WHERE\s?}}/im", "\n WHERE 1 = 1 AND\n" . $rule, $baseCommand);
            }
        } else {
            $queries[] = $baseCommand;
        }

        /**
         * Execution des requêtes
         */
        foreach ($queries as $query) {
            $res = $this->iCTI_connexion->query($query);
            if (!$res) {
                echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "ERROR" . "\t" . "Erreur lors de l'éxecution d'une règle pour l'étude $etude";
                return;
            }
        }

        /**
         * Execution des post Traitement
         */
        if ($postClass){
            $etudePost = new $postClass;
            $etudePost->execute();
        }
        echo "\r\n" . date("d/m/Y H:i:s") . "\t" . "Execution de l'étude $etude avec succès";

    }
}
