<?php

namespace Modules\Panier\Service;

use Helpers\Outil\Sql;
use Entity\Model\OxaUserPanier;

class ListeClauseWhere
{
    private $pdo;
    
    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    
    /**
     * Fonction permettant de récupérer la clause where paramétrée pour la liste des centres ou des codes complémentaires dans le cadre du panier
     *
     * @param string $tablePrincipale
     *            : table principale, correspond à l'id2 du paramétrage PARAMDICO
     * @param array $aliasTable
     *            : correspondance entre l'alias de la table du paramétrage et l'alias de la table dans la requête
     * @param int $idUser
     *            : id utilisateur pour le panier
     * @param bool $clauseExistante
     *            : clause where déjà présente dans la requête principale
     * @param int $id_panier
     *            : id du panier, par défaut 0 correspondant au panier en cours
     * @param string $SICode
     *            : code SI - Code envoyé si présence d'éclatement des axes d'imputation dans le panier
     * @return string : Retourne la condition where à ajouter à la requête
     */
    public function generateClauseWhere(string $tablePrincipale, array $aliasTable, int $idUser, bool $clauseExistante = true, int $id_panier = 0, ?string $SICode = null)
    {
        $entetePanier = new OxaUserPanier($this->pdo);
        $entetePanier = $entetePanier->find([
            'id_panier' => $id_panier,
            'id_user' =>  (int)$idUser,
        ]);

        $sqlDynamic = '';

        // Recherche dans SRM la clause sql à prendre en compte pour la requete
        $clauseWhere = Sql::paramDico($this->pdo, 'OXAPROC_WHERE', 'P', 'COMMENTAIRE', $tablePrincipale);

        if ($clauseWhere != '') {
            $sqlDynamic = $clauseWhere;
            
            /** @phpstan-ignore-next-line */
            if ($sqlDynamic != '') {
                // Remplacement des alias de table
                foreach ($aliasTable as $aliasTableParametrage => $aliasTableRequete) {
                    $sqlDynamic = str_replace('[@TABLE_' . $aliasTableParametrage . ']', $aliasTableRequete . '.', $sqlDynamic);
                }
                
                /**
                 * Analyse de la chaine et remplacement des tag en question
                 * les tags commencent toujours par [@DATA_ et finissent par ]
                 */
                $idebut = 0;
                while (true) {
                    if ($idebut === false) {
                        break;
                    }

                    $idebut = stripos($sqlDynamic, '[@DATA_', $idebut);
                    
                    // On sort de la boucle lorsqu'il n'y a plus aucune occurence
                    if ($idebut === false) {
                        break;
                    }
                    
                    $fin = stripos($sqlDynamic, ']', $idebut + 1);

                    $mot = substr($sqlDynamic, $idebut + 6 + 1, $fin - $idebut - 1 - 6);
                    switch ($mot) {
                        case 'UTILISATEUR':
                            $replaceMot = $_SESSION['Session_Login'];
                            break;
                        case 'CENTRE_E':
                            $replaceMot = $entetePanier['OUPA_CENTRE_EMETTEUR'];
                            break;
                        case 'CENTRE_R':
                            $replaceMot = $entetePanier['LIV_CTR'];
                            break;
                        case 'SECTIMPU':
                            if (is_null($SICode)) {
                                $replaceMot = $entetePanier['SI_CODE'];
                            } else {
                                $replaceMot = $SICode;
                            }
                            break;
                        case 'SOCIETE':
                            $replaceMot = $entetePanier['CODE_STE'];
                            break;
                        default:
                            $replaceMot = '';
                    }
                    
                    if ($replaceMot != '') {
                        $sqlDynamic = substr($sqlDynamic, 0, $idebut) . $replaceMot . substr($sqlDynamic, $fin + 1);
                        $idebut = $idebut + 3;
                    } else {
                        $idebut = $fin;
                    }
                }
            }
        }
        
        // A la fin on retourne la chaine qui sera inserée dans la requête générale
        if ($sqlDynamic != '') {
            if ($clauseExistante) {
                $reqWhere = " AND ";
            } else {
                $reqWhere = " WHERE";
            }
            $sqlDynamic = $reqWhere . $sqlDynamic;
        }

        return $sqlDynamic;
    }
}
