<?php
namespace Helpers\Roles;
use Helpers\Log\LogSysteme;
// phpcs:ignoreFile

// Commenter car on doit tester le hors connexion
// define ('DB_MYSQL',19);
// define('DB_MSSQL', 21);
// define('DB_ORA', 14);

// define('DB_OXASQLDB', 'OXASQLDB');
// define('DB_OXACATDB', 'OXACATDB');
// define('DB_OXAPROCDB', 'OXAPROCDB');
// define('DB_OXASVDB', 'OXASVDB');
// define('DB_OXALINKDB', 'OXALINKDB');

defined('DB_OXASQLDB') or define('DB_OXASQLDB', 'OXASQLDB');
defined('DB_OXACATDB') or define('DB_OXACATDB', 'OXACATDB');
defined('DB_OXAPROCDB') or define('DB_OXAPROCDB', 'OXAPROCDB');
defined('DB_OXALINKDB') or define('DB_OXALINKDB', 'OXALINKDB');
defined('DB_OXADDWB') or define('DB_OXADDWB', 'OXADWDB');
defined('DB_OXASVDB') or define('DB_OXASVDB', 'OXASVDB');
defined('DB_OXAFTDB') or define('DB_OXAFTDB', 'OXAFTDB');
defined('DB_OXADWDB') or define('DB_OXADWDB', 'OXADWDB');

// CONEXION PDO
defined('DB_OXASQLDB_PDO') or define('DB_OXASQLDB_PDO', 'OXASQLDB_PDO');
defined('DB_OXACATDB_PDO') or define('DB_OXACATDB_PDO', 'OXACATDB_PDO');
defined('DB_OXAPROCDB_PDO') or define('DB_OXAPROCDB_PDO', 'OXAPROCDB_PDO');
defined('DB_OXADWDB_PDO') or define('DB_OXADWDB_PDO', 'OXADWDB_PDO');
defined('DB_OXAFTDB_PDO') or define('DB_OXAFTDB_PDO', 'OXAFTDB_PDO');


class ParseConfigFile
{

    
    // Propriétés
    // chemin d'accés au fichier base1.ini
    private string $chemin;
    // tableau associatif qui contiendra les noms logiques recherchés associés é leur valeurs
    // ce tableau est construit é partir du tableau LogicNames
    /** @var array<mixed> */
    private array $var_ini;

    // Méthodes
    // Constructeur
    public function __construct(string $chemin)
    {

        $this->chemin = $chemin;
        $logic_names = array(
            'tmp' => 'O',
            'tmpweb' => 'N',

            'OXALINKDB' => 'O',
            'OXALINKDB_P' => 'O',
            'OXALINKDB_HOST' => 'O',
            
            'OXACATDB' => 'O',
            'OXACATDB_P' => 'O',
            'OXACATDB_HOST' => 'O',
            
            'OXAPROCDB' => 'O',
            'OXAPROCDB_P' => 'O',
            'OXAPROCDB_HOST' => 'O',
            
            'OXASQLDB' => 'O',
            'OXASQLDB_P' => 'O',
            'OXASQLDB_HOST' => 'O',

            'OXASVDB' => 'O',
            'OXASVDB_P' => 'O',

            'OXADWDB' => 'O',
            'OXADWDB_P' => 'O',
            'OXADWDB_HOST' => 'O',
            
            'OXAFTDB' => 'O',
            'OXAFTDB_P' => 'O',
            'OXAFTDB_PASSWORD' => 'O',
            
            'serveurweb' => 'O',
            'oxadataweb' => 'O',
            'brokernumber' => 'O',
            'HTTPS' => 'O',
            'haplusweb' => 'O',
            'ispi' => 'O',
            '_etc' => 'O',
            'PHP_PATH' => 'O',
            '_log' => 'N',
            'fic_pj' => 'O',
            'FicPJHTM' => 'O',
            'INTUITION_SERVER' => 'O',
            'INTUITION_PORT' => 'O',
            'INTUITION_CAT' => 'O',
            'INTUITION_FMT' => 'O',
            'INTUITION_HAP' => 'O',
            'INTUITION_USER' => 'O',
            'INTUITION_STK' => 'O',
            '_images' => 'N',
            'ImgartHTM' => 'O',
            'ENV_NAME' => 'N',
            '_debug' => 'N', // Utilisé uniquement pour le dev afin de passer le debug à true
            'MEMCACHE_HOST' => 'N', // Serveur exécutant le service MEMCACHE
            'MEMCACHE_PORT' => 'N', // Port d'accès au service MEMCACHE
            'OXAREPORTS_SERVER' => 'N',
            'OXAREPORTS_NUM' => 'N',
            'oxadata' => 'O',
            'VERSION' => 'O'
        );
        // Tableau associatif contenant tous les noms logiques et qui contiendra leurs valeurs associées
        foreach ($logic_names as $key => $value) {
            $this->var_ini[$key] = '';
        }
    }

    // Ouverture du fichier config.ini et récupération des variables
    // retourne false si le fichier config.ini n'a pu étre ouvert
    public function getConfigContents() :bool
    {
        $e ='';
        //On détermine ici si le memcache est activé et on l'enregistre dans une variable de session
        if (extension_loaded('memcache')) {
            $memcache = new \Memcache;
            try {
                if (@$memcache->connect('localhost', 11211) !== true) {
                    $_SESSION['base1']['memcache'] = 0;
                    throw new \Exception($e);
                } else {
                    $_SESSION['base1']['memcache'] = 1;
                }
            } catch (\Exception $e) {
            }
        } else {
            $_SESSION['base1']['memcache'] = 0;
        }

        try {
            //Ouverture du fichier
            if ($f = fopen($this->chemin, 'r')) {
                //Parse du fichier
                while (!feof($f)) { // jusqu'a la fin du fichier
                    $chTmp = fgets($f, 4096); // on recupére jusqu'à 4096 caractère sur la ligne
                    if ($chTmp === false) { // feof return false despite fgets having nothing left to read
                        continue;
                    }
                    // On supprime tous les espaces présents au niveau de la ligne
                    $ch = str_ireplace(' ', '', $chTmp);
                    if (mb_substr($ch, 0, 1) != ';' && count_chars($ch) > 0 && str_word_count($ch) > 0) {// si la ligne n'est pas en commentaire et contient des caractéres
                        foreach ($this->var_ini as $key => $values) {// on bouble sur le tableau associatif des noms logiques
                            if (stripos($ch, $key . '=') !== false) { // on teste si un nom logique est présent sur cette ligne
                                // Traitement si le nom logique est celui d'une connexion db
                                if (stripos($ch, '[MAGIC_DATABASES]') !== false && $this->ctrlLogicalNames($ch, $key, 'database') && (strcasecmp($key, DB_OXASQLDB) == 0 || strcasecmp($key, DB_OXACATDB) == 0 || strcasecmp($key, DB_OXAFTDB) == 0 || strcasecmp($key, DB_OXAPROCDB) == 0 || strcasecmp($key, DB_OXASVDB) == 0 || strcasecmp($key, DB_OXADWDB) == 0 || strcasecmp($key, DB_OXALINKDB) == 0)) { //@phpstan-ignore-line
                                    // Explode permet de découper la chaine selon un délimiteur
                                    $array = explode(',', $ch);

                                    $chaine = trim($array[0]);
                                    $regexFindVarHost = '/^\%[a-zA-Z]+DB_HOST\%$/i';

                                    // On teste si la version de Magic est V9 ou V10, pour cela on se base sur la présence du DBMS en première position de la chaine
                                    // Si 'DBMS' est présent alors il s'agit d'une version Magic V10
                                    if ('DBMS' == mb_substr($chaine, strpos($chaine, '*') + 1)) {
                                        /**
                                         * Exemple de ligne :
                                         * [MAGIC_DATABASES]OXASQLDB=*DBMS,21,OXADEV10, ,ORLY, ,haplus,%OXASQLDB_PASSWORD%,NoMagicRecordLock, ChangeFileInToolkit, NoCheckDefinition, NoCheckKey, NoFileLocks, SQL_PHYSICAL_LOCKING=Y, , CheckExist, 0, , NoXATrans, NoAS400SrvrSort,,
                                         */
                                        $_SESSION['base1'][$key . '_TYPE'] = trim($array[1]);

                                        // Récupération du nom de base que l'on stocke dans le tableau superglobal
                                        $_SESSION['base1'][$key . '_NAME'] = trim($array[2]);
                                            
                                        if ($key == 'OXASVDB') {
                                            $_SESSION['base1'][$key. '_P_PASSWORD'] = trim($array[7]);
                                        }

                                        if ($key == 'OXAFTDB') {
                                            //$_SESSION['base1'][$key. '_P_PASSWORD'] = trim($array[7]);
                                        }

                                        // Récupération du nom de serveur que l'on stocke dans la session
                                        switch ($key) {
                                            case DB_OXAFTDB:
                                            case DB_OXASQLDB: // On passe le nom du serveur en minuscule
                                                $server = strtolower(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtolower(trim(preg_replace($regexFindVarHost, $_SESSION['base1'][$var.'_SERVER'], $array[4])));
                                                }
                                                $_SESSION['base1'][$key . '_SERVER'] = $server;
                                                break;

                                            case DB_OXACATDB: // On passe le nom du serveur en majuscule
                                                $server = strtoupper(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtoupper(trim(preg_replace($regexFindVarHost, $_SESSION['base1'][$var.'_SERVER'] ,$array[4])));
                                                }
                                                $_SESSION['base1'][$key . '_SERVER'] = $server;
                                                break;
                                            case DB_OXAPROCDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                            case DB_OXASVDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                            case DB_OXADWDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                                $server = ucfirst(strtolower(trim($array[4])));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = ucfirst(strtolower(trim(preg_replace($regexFindVarHost, $_SESSION['base1'][$var.'_SERVER'], $array[4]))));
                                                }
                                                $_SESSION['base1'][$key . '_SERVER'] = $server;
                                                break;
                                        }

                                        // Récupération du login que l'on stocke dans le tableau superglobal
                                        $_SESSION['base1'][$key . '_LOGIN'] = trim($array[6]);
                                    }
                                    // Sinon il s'agit d'une version V9
                                    else {
                                        /**
                                         * Exemple de ligne :
                                         * [MAGIC_DATABASES]OXAPROCDB=*21,OXAPROC_950, , ,PAU\SQLEXPRESS, ,haplus,%OXAPROCDB_PASSWORD%,NoMagicRecordLock, ChangeFileInToolkit, NoCheckDefinition, NoCheckKey, NoFileLocks, , SQL_PHYSICAL_LOCKING=Y, , CheckExist, 0, , NoXATrans, NoAS400SrvrSort,
                                         */
                                        $_SESSION['base1'][$key . '_TYPE'] = mb_substr($chaine, strpos($chaine, '*') + 1);

                                        // Récupération du nom de base que l'on stocke dans le tableau superglobal
                                        $_SESSION['base1'][$key . '_NAME'] = trim($array[1]);

                                        // Récupération du nom de serveur que l'on stocke dans la session
                                        switch ($key) {
                                            case DB_OXASQLDB: // On passe le nom du serveur en minuscule
                                                $server = strtolower(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtolower(trim(preg_replace($regexFindVarHost, $_SESSION['base1'][$var.'_SERVER'], $array[4])));
                                                }
                                                $_SESSION['base1'][$key . '_SERVER'] = $server;
                                                break;

                                            case DB_OXACATDB: // On passe le nom du serveur en majuscule
                                                $server = strtoupper(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtoupper(trim(preg_replace($regexFindVarHost, $_SESSION['base1'][$var.'_SERVER'] ,$array[4])));
                                                }
                                                $_SESSION['base1'][$key . '_SERVER'] = $server;
                                                break;
                                            case DB_OXAFTDB:
                                            case DB_OXAPROCDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                            case DB_OXASVDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                            case DB_OXADWDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                                $server = ucfirst(strtolower(trim($array[4])));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = ucfirst(strtolower(trim(preg_replace($regexFindVarHost, $_SESSION['base1'][$var.'_SERVER'], $array[4]))));
                                                }
                                                $_SESSION['base1'][$key . '_SERVER'] = $server;
                                                break;
                                        }

                                        // Récupération du login que l'on stocke dans le tableau superglobal
                                        $_SESSION['base1'][$key . '_LOGIN'] = trim($array[6]);
                                    }
                                } elseif ($key === 'HTTPS') {
                                    $chaine = trim($ch);
                                    $_SESSION['base1']['oxa_prc_https'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif ($key === 'brokernumber') {
                                    $chaine = trim($ch);
                                    $_SESSION['base1']['_brokernumber'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif ($key === 'VERSION') {
                                    $chaine = trim($ch);
                                    $_SESSION['base1']['VERSIONINI'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif (stripos($key, 'DB_HOST') !== false) {
                                    $chaine = trim($ch);
                                    $result = explode(',', $chaine);
                                    if (!empty($result[1])) { // 1 = port
                                        $_SESSION['base1'][$key.'_SERVER'] = mb_substr($result[0], strpos($result[0], '*') + 1) .','.$result[1];
                                    } else {
                                        $_SESSION['base1'][$key.'_SERVER'] = mb_substr($result[0], strpos($result[0], '=') + 1);
                                    }
                                } elseif ($key === 'serveurweb') {
                                    $chaine = trim($ch);
                                    $_SESSION['base1']['_serveurweb'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif ($key === 'oxadataweb') {
                                    $chaine = trim($ch);
                                    $_SESSION['base1']['_oxadataweb'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                    $_SESSION['base1']['oxadataweb'] = str_replace("\r", '', str_replace("\n", '', str_replace('*', '', mb_substr($ch, strpos($ch, '=') + 1))));
                                } elseif ($key == 'haplusweb') {
                                    $chaine = trim($ch);

                                    if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                        $_SESSION['base1']['_haplusweb'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                    } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                        $_SESSION['base1']['_haplusweb'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                    }
                                } elseif (strcasecmp($key, 'ispi') == 0) {
                                    if ($this->checkVar($ch, $key)) {
                                        $chaine = trim($ch);
                                        if (mb_substr($chaine, strpos($chaine, '*') + 1) == '') {
                                            LogSysteme::prefixErrorLog('Erreur : Le paramètre ispi n\'est pas renseigné dans le fichier wsdl.ini !');
                                        } else {
                                            $_SESSION['base1']['wsdlurl'] = mb_substr($chaine, strpos($chaine, '*') + 1) . '?appname=Oxaproc&PRGNAME=WSDL&ARGUMENTS=-A';
                                            $_SESSION['base1']['ispiurl'] = mb_substr($chaine, strpos($chaine, '*') + 1) . '?appname=Oxaproc';
                                        }
                                    }
                                }  elseif (strcasecmp($key, 'PHP_PATH') == 0) {
                                    if ($this->checkVar($ch, $key)) {
                                        $_SESSION['base1']['PHP_PATH'] = trim($ch);
                                       
                                    }
                                } elseif ($key == 'oxadata') {
                                    $chaine = trim($ch);
                                    if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                        $_SESSION['base1']['oxadata'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                    } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                        $_SESSION['base1']['oxadata'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                    }
                                } else {
                                    // Initialsation de la ligne du fichier base1.ini en cours de lecture avec suppression des espaces aux extremités
                                    $chaine = trim($ch);

                                    if ($this->checkVar($ch, $key)) {
                                        if ($this->ctrlLogicalNames($chaine, $key) && strcasecmp($key, '_images') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['base1']['_images'] = substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && strcasecmp($key, 'ImgartHTM') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['base1']['_imagesHTTP'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            $_SESSION['base1']['ImgartHTM'] = mb_substr($chaine, strpos($chaine, '*') + 1);

                                            if ('/' != mb_substr($_SESSION['base1']['_imagesHTTP'], mb_strlen($_SESSION['base1']['_imagesHTTP']) - 1, 1)) {
                                                $_SESSION['base1']['_imagesHTTP'].= '/';
                                                $_SESSION['base1']['ImgartHTM'] .=  '/';
                                            }
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && strcasecmp($key, 'fic_pj') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['base1']['chemin_pj'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && strcasecmp($key, 'FicPJHTM') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['base1']['url_pj'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && strcasecmp($key, 'tmp') == 0) {
                                            $_SESSION['base1']['dir_tmp'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && strcasecmp($key, 'tmpweb') == 0) {
                                            $_SESSION['base1']['url_tmp'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && (strcasecmp($key, '_log') == 0 ) && mb_substr($chaine, strpos($chaine, '*') + 1) != '' || (strcasecmp($key, 'tmpweb') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif ($this->ctrlLogicalNames($chaine, $key) && (strcasecmp($key, '_debug') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '' || (strcasecmp($key, 'tmpweb') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                        }
                                        // Ici on récupère les paramétres de connexion à la Base de données
                                        elseif (stripos($chaine, '[MAGIC_LOGICAL_NAMES]') !== false && $this->ctrlLogicalNames($chaine, $key) && (strcasecmp($key, 'OXASQLDB_P') == 0 || strcasecmp($key, 'OXAPROCDB_P') == 0 || strcasecmp($key, 'OXACATDB_P') == 0 || strcasecmp($key, 'OXASVDB_P') == 0 || strcasecmp($key, 'OXADWDB_P') == 0 || strcasecmp($key, 'OXAFTDB_P') == 0)) {
                                            // On récupère le nom logique de la base
                                            //$chaine_base = explode('_', $key);
                                            //$base = $chaine_base[0];
                                            // et le mot de passe associé
                                            $pass_crypt = mb_substr($chaine, strpos($chaine, '=') + 1);

                                            // Découpage du password dans un tableau
                                            $array_encode = str_split($pass_crypt, 3);
                                            $password = '';

                                            // On teste si la chaine de mot de passe à décrypter n'est pas vide
                                            if (mb_strlen($pass_crypt) > 0) {
                                                for ($i = 0; $i < count($array_encode); $i++) {
                                                    $tmp = ((int)$array_encode[$i] - ($i + 1)); // Modulo sur le code ASCII 256
                                                    $password.= chr($tmp);
                                                }

                                                $_SESSION['base1'][$key . '_PASSWORD'] = $password;
                                            }
                                        }// fin du traitement du connectbdd
                                        elseif (strcasecmp($key, 'INTUITION_SERVER') == 0 || strcasecmp($key, 'INTUITION_PORT') == 0 || strcasecmp($key, 'INTUITION_CAT') == 0 || strcasecmp($key, 'INTUITION_FMT') == 0 || strcasecmp($key, 'INTUITION_HAP') == 0 || strcasecmp($key, 'INTUITION_USER') == 0 || strcasecmp($key, 'INTUITION_STK') == 0) {
                                            // Ici on prend en compte la valeur de la variable intuition qu'elle commence ou non par le caractère *
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                        }
                                        // Récupération dans le base1.ini du nom de l'environnement
                                        elseif (strcasecmp($key, 'ENV_NAME') == 0) {
                                            // Ici on prend en compte la valeur de la variable intuition qu'elle commence ou non par le caractère *
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                        } elseif (strcasecmp($key, '_etc') == 0) {
                                            // Ici on prend en compte la valeur de la variable intuition qu'elle commence ou non par le caractère *
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }

                                            //on recupere le chemin physique vers le répertoire Haplus
                                            $decoupTmp = explode('etc', $_SESSION['base1'][$key]);
                                            //On remplace les * éventuelles par des blancs
                                            $decoup = str_replace('*', '', $decoupTmp);
                                            $_SESSION['base1']['application'] = $decoup[0];
                                        } elseif (strcasecmp($key, 'OXAREPORTS_SERVER') == 0 || strcasecmp($key, 'OXAREPORTS_NUM') == 0) {
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }

                                            if (strcasecmp($key, 'OXAREPORTS_NUM') == 0) {
                                                $_SESSION['base1']['OXAREPORTS_NUM_INIT'] = $_SESSION['base1'][$key];

                                                if ($_SESSION['base1']['OXAREPORTS_NUM'] == 1) {
                                                    $_SESSION['base1']['OXAREPORTS_NUM'] = '';
                                                }
                                            }
                                        }
                                        // Récupération des paramètres liés à MEMCACHE
                                        elseif (strcasecmp($key, 'MEMCACHE_HOST') == 0 || strcasecmp($key, 'MEMCACHE_PORT') == 0) {
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION['base1'][$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                        }
                                        // Si la variable d'environnement est obligatoire et non renseignée
                                        // Alors on enregistre un avertissement
                                        elseif ('O' === $values) {
                                            LogSysteme::prefixErrorLog("Avertissement : Le parametre $key n'est pas renseigne !");
                                        }
                                    }
                                }
                            }// fin du if
                        }// fin du for
                    }// fin du if
                }// fin du while

                $_SESSION['base1']['_etc'] = str_replace('%VERSION%', ($_SESSION['base1']['VERSIONINI']??''), $_SESSION['base1']['_etc']);
                $_SESSION['base1']['application'] = str_replace('%VERSION%', ($_SESSION['base1']['VERSIONINI']??''), $_SESSION['base1']['application']);

                return true;
            } else {
                LogSysteme::prefixErrorLog(new \Exception('Le fichier de configuration base1.ini est manquant'));
                $_SESSION['base1']['MESSAGE_ERREUR_CONNEXION'] = 'Le fichier de configuration base1.ini est manquant';
            }
        }// fin try
            // Erreur renvoyée si fichier inexistant
        catch (\Exception $e) {
            LogSysteme::prefixErrorLog((string) $e);
        }
        LogSysteme::prefixErrorLog((string) new \Exception('Fail to parse file "'.$this->chemin.'"'));
        return false;
    }

    //fin de la fonction

    /**
     * @return bool|int
     */
    public function checkVar(string $ch, string $key)
    {
        return preg_match('/(])[\040]*' . $key . '[\040]*[=]/i', $ch);
    }

    /**
     * @return bool|int
     */
    public function ctrlLogicalNames(string $ch, string $logicalName, string $type = 'logical')
    {
        $type_variable = 'NULL';
        if ($type=='logical') {
            $type_variable = 'MAGIC_LOGICAL_NAMES';
        } elseif ($type=='database') {
            $type_variable = 'MAGIC_DATABASES';
        }
            
        return (preg_match('/^[\040]*[\[]'.$type_variable.'{1}[\]][\040]*'.$logicalName.'[\040]*[=]{1}/', $ch));
    }
    
    /**
     * Cette function permet d'avoir un projet en multitenant hermetique.
     */
    public static function getDirectoryBase1() : string
    {
        return self::getIniDirectory().'/base1.ini';
    }

    static public function getIniDirectory() :string
    {
        $blocOk = false;
        if(isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] != NULL) {
            $urlBase = (string) str_replace('/oxaproc', '',$_SERVER['REQUEST_URI']);
            $urlBase = (string) str_replace('/oxaprocsso', '',$urlBase);
            $numBroker = explode('/',$urlBase)[0];
        } else {
            $numBroker = $_POST['numBroker'];
        }
        
        $content = \Helpers\Fichier\Fichier::getContentFile(
            "oxaversion.oxa",
            dirname(__DIR__)."../../../../etc/"
        );

        if ($content) {
            $contentExplode = explode('|', $content);
            $mrgbFilePath = dirname(__DIR__)."../../../../../../../magic/".$contentExplode[1]."/mgrb".$numBroker.".ini";
            if ($f = @fopen($mrgbFilePath, 'r')) {
                //Parse du fichier
                while (!feof($f)) {
                    $ch = fgets($f, 4096);

                    if ($ch) {
                        if($blocOk == true && strpos($ch, 'Oxaproc') !== false && strpos($ch, '/ini=') !== false)
                        {
                            $string = $ch;
                            $regex = '/\/ini=(.*?)\s/';

                            if (preg_match($regex, $string, $matches)) {
                                $result = $matches[1];
                                return $_SESSION['env']['envRoot'] = substr($result, 0, (int)strripos($result,'\\'));
                            }
                        }

                        if(strpos($ch, '[APPLICATIONS_LIST]') !== false)
                        {
                            $blocOk = true;
                        }
                    }

                }
            } else {
                LogSysteme::prefixErrorLog('mrgb file not found "'.$mrgbFilePath.'"');
            }
        }
        
        return $_SESSION['env']['envRoot'] = dirname(__DIR__).'../../../../ini';
    }

    /**
     * @return array<mixed>
     */
    static public function getConfigFileIni() :array
    {
        if (isset($_SESSION['configfile_ini'])) {
            return $_SESSION['configfile_ini'];
        }

        $content = @file_get_contents(self::getIniDirectory() . '/CONFIG_FILE.ini');

        // Case : default config
        if ($content === false) {
            return $_SESSION['configfile_ini'] = [
                'SERVERWEBHTTP' => $_SERVER['HTTP_HOST'],
                'SERVERWEBHTTP_FRONTAL' => $_SERVER['HTTP_HOST'],
            ];
        } elseif (stripos($content, 'SERVERWEBHTTP_FRONTAL') === false) {
            $toAdd = [
                'SERVERWEBHTTP_FRONTAL' => $_SERVER['HTTP_HOST']
            ];
        }

        $res = [];
        foreach (explode("\r\n", $content) as $line) {
            if (str_starts_with($line,'[')) { // Ignore title (eg: '[SERVER]')
                continue;
            }
            list($key,$value) = explode('=', $line);
            $res[ $key ] = $value;
        }

        if(isset($toAdd)) {
            $res = array_merge($res, $toAdd);
        }

        return $_SESSION['configfile_ini'] = $res;
    }
}
