<?php

namespace Modules\Index\WebService;

use Helpers\Outil\Sql;

class Utilisateur
{
    
    private $pdo;

    private bool $modeDeconnexion;

    public function __construct($pdo, bool $modeDeconnexion = false)
    {
        $this->pdo = $pdo;
        $this->modeDeconnexion = $modeDeconnexion;
    }

    // phpcs:ignore
    public function WsdlIdent($ident, $passwd, $langue, $result = [], $autologin = false, $origine = null, $sso = 0)
    {
        $user = new \Modules\Index\Repository\User($this->pdo);
        $wsdl = 'Oxaproc_InfoUser.wsdl';

        $passwd = str_replace("\\'", "'", $passwd);
        
        $this->XmlEntities($ident);
        $this->XmlEntities($passwd);
        
        $envoi = "<UserIn LngUtilisation='{$_SESSION['Session_Langue']}'>";
        $envoi .= "<IdentifiantUser>".strtoupper($ident)."</IdentifiantUser>";
        $envoi .= "<MotdePasse>" .$passwd . "</MotdePasse>";
        
        if (! is_null($origine) || isset($_SESSION['MobileTypeConnexion'])) {
            $envoi .= "<Origine>" . ((isset($_SESSION['MobileTypeConnexion']))? 'MPROC' : $origine) . "</Origine>";
        }
        // Spec 3156
        $envoi .= "<AdrIP>{$_SERVER['REMOTE_ADDR']}</AdrIP>";
        
        // Spec 3489 + SI forceModeNTLM alors Il faut envoyer permettant ainsi coté magic de ne pas lancer d'authentification LDAP ...
        $envoi .= '<ssontlm>'.$sso.'</ssontlm>';
        $envoi .= '<idsession>' . session_id() . '</idsession>';
        
        if (isset($langue) && is_string($langue)) {
            $envoi .= "<Langue>$langue</Langue>";
        }
        
        /**
         * Traitement du cas des backups
         */
        // Si l'on se deconnecte du mode backup alors pourbackup à false et pas de controle de mot de passe dossier 26189
        if ($this->modeDeconnexion) {
            $envoi .= '<PourBackUp>false</PourBackUp>';
            $envoi .= '<Autologin>true</Autologin>'; // Demande en auto login
        } else {         // Si le mode backup est activé, on passe le flag "PourBackUp" à true
            if (isset($_SESSION['MODE_BACKUP']) && $_SESSION['MODE_BACKUP']) {
                $envoi .= '<PourBackUp>true</PourBackUp>';
                // Dossier 26189 : on récupère les données qui sont attachées au profil de l'utilisateur qui a donné le backup
                $reqSqlBackup = $user->rqGetTypeBackupForUser($ident, $_SESSION['user_origine']);
                if (is_array($reqSqlBackup)) {
                    // @phpstan-ignore-next-line
                    $envoi .= '<BackupAchat>' . Sql::boolXml($reqSqlBackup['ACHAT']) . '</BackupAchat>';
                    // @phpstan-ignore-next-line
                    $envoi .= '<BackupResponsable>' . Sql::boolXml($reqSqlBackup['SUPHIER']) . '</BackupResponsable>';
                }
            } else {
                $envoi .= '<PourBackUp>false</PourBackUp>';
            }
        }
        
        /**
         * Fin du traitement des cas des backups
         */
        /**
         * Prise en compte de l'AutoLogin (Pas de Mot de passe) mis en place pour le Portail
         */
        // Si le mode autologin est activé, on passe le flag "Autologin" à true
        if ((isset($autologin) && $autologin == true)) {
            $envoi .= '<Autologin>true</Autologin>';
        } else {
            $envoi .= '<Autologin>false</Autologin>';
        }
        
        /**
         * Fin Prise en compte de l'AutoLogin
         */
        $envoi .= '</UserIn>';
        
        $_SESSION['ERREUR_WEBSERVICE'] = false;
        
        // $result = $client->call('OXAPRC_LOGUSR_XML', $envoi, 'http://tempuri.org', '', false, null, 'rpc', 'UTF-8');
        
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_LOGUSR_XML', $envoi, false);
    }

    // phpcs:ignore
    public function XmlEntities(&$array)
    {
        // Si array est un tableau
        if (is_array($array)) {
            // Alors on appelle la fonction XmlEntities de manière récursive pour explorer tout le tableau
            foreach ($array as & $data) {
                // @phpstan-ignore-next-line
                XmlEntities($data);
            }
        } else {
            // On neutralise les caractères &, <, > qui pourraient être interprétés comme des tags
            $array = htmlspecialchars($array);
        }
    }
    
    public function motdePasseOublier($mode, $data)
    {
        $this->XmlEntities($data);
        
        if ($mode == 'MAIL') {
            $envoi = "<Utilisateur></Utilisateur><Email>$data</Email>";
        } elseif ($mode == 'LOGIN') {
            $envoi = "<Utilisateur>$data</Utilisateur><Email></Email>";
        }
        
        $envoi = "<OubliMdpIn LngUtilisation='{$_SESSION['Session_Langue']}'>$envoi</OubliMdpIn>";
            
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_MDPOUBLIE', $envoi, false);
    }
}
