<?php

namespace Modules\API\APIInterne\OxaMobility\Controller;

use Attachement;
use Entity\Model\OxaUserPanier;
use Helpers\Log\LogSysteme;

use Helpers\Outil\Outils;
use Modules\Panier\Service\PanierService;
use SimpleXMLElement;
use Helpers\Outil\Sql;
use Helpers\Trad\Trad;
use Skeleton\Controller\Controller;
use Helpers\Fichier\Fichier;
use Helpers\Fichier\Gestion_Fic_PJ;
use Modules\Commande\Repository\PJ;
use TypeSuivi;
use OpenApi\Annotations as OA;

// phpcs:ignore
class CDE_COMPTOIR_PAR_MNTController extends Controller
{

    public function init()
    {
    }

    /**
     * @OA\Post(
     *      path="/cde_comptoir_par_mtn/creat",
     *      summary="Crée une nouvelle commande comptoir",
     *      tags={"Commandes comptoir"},
     *      @OA\RequestBody(
     *          description="Numéro de commande",
     *          required=true,
     *          @OA\MediaType(
     *              mediaType="application/xml",
     *          )
     *      ),
     *      @Oa\Response(
     *          response="200",
     *          description="Nouveau bon de réception",
     *          @OA\XmlContent(
     *             type="array",
     *             @OA\items(
     *                  type="string"))
     *       ),
     *       security={{
     *          "ApiKeyAuth": {}
     *      }}
     * )
     */

    public function CREATAction($body = [], $jwtPayload = [], $json = true)
    {

        $contents = file_get_contents(session_save_path() . '\\sess_' . $jwtPayload['sessionId']);
        @session_name('__OxaProc-PHPSESSID');
        @session_start();
        session_decode($contents);
        $return = [];
        $trad = $this->getTranslationService();

        // on modifie les informations de session
        $_SESSION['Session_SocUsr'] = $body['codeSoc'];
        $_SESSION['Session_CodeCtrEmetteur'] = $body['CtrEmetteur'];
        $_SESSION['Session_CodeCtrLivraison'] = $body['CtrLivraison'];
        
        $body['SI_CODE'] = is_array($body['SI_CODE']) ? '' : $body['SI_CODE'];
        $body['CDC_CODE'] = is_array($body['CDC_CODE']) ? '' : $body['CDC_CODE'];
        $body['SCA_CODE'] = is_array($body['SCA_CODE']) ? '' : $body['SCA_CODE'];

        $montantMax = Sql::paravrac($this->pdo, 'OXAMPROC', 'MNT_MAX_CDE_COMPTOIR');
        $articleCdeComptoir = Sql::paravrac($this->pdo, 'OXAMPROC', 'CDE_COMPTOIR_PAR_MONTANT_CODE_ART');

        $montantMax = trim($montantMax);
        $montantMax = str_replace(' ', '', $montantMax);

        $body['MntHT'] = trim($body['MntHT']);
        $body['MntHT'] = str_replace(' ', '', $body['MntHT']);

        //On vérifie que les commandes comptoir sont bien activé (On controle aussi que le parametrage soit complet)
        $cdeComptoirActif = Sql::paravrac($this->pdo, 'OXAMPROC', 'CDE_COMPTOIR_PAR_MONTANT_ACTIVE');
        $pjObli = Sql::paravrac($this->pdo, 'OXAMPROC', 'CDE_COMPTOIR_PAR_MONTANT_PJ_OBLIG')=='O'? true:false;
        if (count($body['ListePJ']['PJ']??[])==0 && $pjObli) {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Dans le cas de la commande comptoir, il est obligatoire d\'attacher une pièce jointe');
        } elseif ($cdeComptoirActif != 'O' || (trim($articleCdeComptoir) == '' || !$articleCdeComptoir)) {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Les commandes comptoir par montant ne sont pas activées.');
        } elseif ($montantMax < $body['MntHT']) {
            //On verifie que la commande comptoir ne depasse pas le montant parametré
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Le montant dépasse la limite pour les commandes comptoir.');
        } else {
            // Si les deux contrôles précédents sont OK, alors on peut vider/créer/soumettre le panier

            //TODO V12
            //(new PanierService($this->pdo))->delete('0', $this->getTranslationService());

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_COOKIESESSION, true);
            curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
            curl_setopt($ch, CURLOPT_URL, Outils::getRootUrl(true) . $this->contenaire->get('base') . 'passerelleV1V2.php?sessionId=' . session_id() . '&fonction=SupprimerPanier');
            session_write_close();
            curl_exec($ch);
            curl_close($ch);

            $oxaUserPanier = new OxaUserPanier($this->pdo);
            $oxaUserPanier->update([
                'SI_CODE' => $body['SI_CODE'],
                'SCA_CODE' => $body['SCA_CODE'],
                'CDC_CODE' => $body['CDC_CODE'],
            ], [
                'id_panier' => $_SESSION['id_panier'],
                'id_user'   => $_SESSION['id_user'],
            ]);

            /* Appel V1 Création ligne panier */
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_COOKIESESSION, true);
            curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
            curl_setopt($ch, CURLOPT_URL, Outils::getRootUrl(true) . $this->contenaire->get('base') . 'passerelleV1V2.php?sessionId=' . session_id() . '&fonction=InsertLigneArticle&codeArticles=' . $articleCdeComptoir . '&codeFournisseur=' . $body['CodeFourn']. '&SI=' . $body['SI_CODE']. '&CDC=' . $body['CDC_CODE']. '&SCA=' . $body['SCA_CODE'] . '&prixArticles=' . $body['MntHT'] . '&dateLivraison=now&mode=CdeComptoir');
            session_write_close();
            curl_exec($ch);
            curl_close($ch);

            /* Appel V1 soumission panier */
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_COOKIESESSION, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
            curl_setopt($ch, CURLOPT_URL, Outils::getRootUrl(true) . $this->contenaire->get('base') . 'passerelleV1V2.php?sessionId=' . session_id() . '&fonction=ValidationPanier&codeAdresse=' . ($body['COD_ADR'] ?? ''));
            session_write_close();
            $response = curl_exec($ch);
            curl_close($ch);
            $ArrayString = '';

            $responseXML = new \SimpleXMLElement($response);
            // Si on a une liste de commande, c'est que notre commande a pu être créée
            $numCde = '';

            if (trim((string)$responseXML->ListCdes->Cde) != '') {
                $numCde = (string) $responseXML->ListCdes->Cde;
            } elseif (trim((string)$responseXML->ListeCde->Cde) != '') {
                $numCde = (string)$responseXML->ListeCde->Cde;
            }

            if ($numCde) {
                $return['Statut'] = 'O';
                $return['MsgErreur'] = '';
                $return['NumCde'] = $numCde;
            } elseif ($responseXML->RecapGlobalAnomalies) {
                //Si on a le récap global, c'est qu'il y a une anomalie bloquante dans la 1ere soumission
                foreach ($responseXML->RecapGlobalAnomalies->DetailAnomalie as $ano) {
                    if ($ano->AnomalieBloquante == 'true') {
                        $ArrayString .= "<DetailAnomalie>
                                            <TypeObjet>" . $ano->TypeObjet . "</TypeObjet>
                                            <CRITERE_REGROUP_ANO>" . $ano->CRITERE_REGROUP_ANO . "</CRITERE_REGROUP_ANO>
                                            <NoLigPanier>" . $ano->NoLigPanier . "</NoLigPanier>
                                            <TxtAnomalie>" . \htmlspecialchars($ano->TxtAnomalie, ENT_XML1, 'UTF-8') . "</TxtAnomalie>
                                            <AnomalieBloquante>" . \htmlspecialchars($ano->AnomalieBloquante, ENT_XML1, 'UTF-8') . "</AnomalieBloquante>
                                        </DetailAnomalie>";
                    }
                }
            }

            //SUITE : Si on a le récap global, c'est qu'il y a une anomalie bloquante dans la 1ere soumission
            if ($ArrayString) {
                $return['Statut'] = 'E';
                $return['MsgErreur'] = '';
                $return['RecapGlobalAnomalies'] = 'replace1';
            } elseif ($responseXML->DA || $responseXML->ListeDA) {
                // Si la 1ere soumission crée une DA, alors erreur (les commandes comptoir ne peuvent être que des CDE)
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $trad->t('Votre panier ne peut pas créer de commande.');
            } elseif ($responseXML->ERREUR) {
                //Si une erreur est remonté dans les contrôles PHP
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $responseXML->ERREUR;
            } elseif ($responseXML->CauseErreur) {
                //Si une erreur est remonté dans les contrôles PHP
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $responseXML->CauseErreur;
            } elseif (!$numCde) {
                //Si autre erreur
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $trad->t('Une erreur est survenue.');
            }
        }

        /***************************** copy attachments from /tmp to /fic_pj  **********************************/
        if (isset($body['ListePJ']) && (count($body['ListePJ']) > 0) && isset($numCde) && $numCde != '') {
            $i = 2;
            if (isset($body['ListePJ']['PJ'][0])) {
                foreach ($body['ListePJ']['PJ'] as $pieceJointe) {
                    /* on copie le fichier depuis le dossier tmp vers le dossier fic_pj, sous-dossier nommé d'après le numéro de commande */
                    $file = \pathinfo($pieceJointe['NomFichier']);
                    $file = $file['basename'];
                    $gestionFicPj = new Gestion_Fic_PJ($this->pdo);
                    $newFile = $gestionFicPj->insertFichier($file);

                    /* si le fichier existe et a bien été déplacé dans le dossier fic_pj, on insère la pièce jointe dans la table CA_PIJO */
                    $arrayReq = [
                        'NO_CA'        => $numCde,
                        'NO_ORDRE'     => $i,
                        'TYPE_PJ'      => 'PJ',
                        'TITRE'        => $pieceJointe['NomFichierAff'],
                        'COPIE'        => '0x54',
                        'IMP_PJ'       => '0x54',
                        'IMP_TITRE'    => '0x54',
                        'NOM_FIC'      => $newFile,
                        'NOM_ORI'      => $pieceJointe['NomFichierAff']
                    ];
                    $i++;
                    $pj = new PJ($this->pdo);
                    $pj->insertSinglePJ($arrayReq);
                }
            } else {
                /* on copie le fichier depuis le dossier tmp vers le dossier fic_pj, sous-dossier nommé d'après le numéro de commande */
                $pieceJointe = $body['ListePJ']['PJ'];
                $file = \pathinfo($pieceJointe['NomFichier']);
                $file = $file['basename'];
                $gestionFicPj = new Gestion_Fic_PJ($this->pdo);
                $newFile = $gestionFicPj->insertFichier($file);

                /* si le fichier existe et a bien été déplacé dans le dossier fic_pj, on insère la pièce jointe dans la table CA_PIJO */
                $arrayReq = [
                    'NO_CA'        => $numCde,
                    'NO_ORDRE'     => $i,
                    'TYPE_PJ'      => 'PJ',
                    'TITRE'        => $pieceJointe['NomFichierAff'],
                    'COPIE'        => '0x54',
                    'IMP_PJ'       => '0x54',
                    'IMP_TITRE'    => '0x54',
                    'NOM_FIC'      => $newFile,
                    'NOM_ORI'      => $pieceJointe['NomFichierAff']
                ];
                $i++;
                $pj = new PJ($this->pdo);
                $pj->insertSinglePJ($arrayReq);
            }
        }

        if ($json) {
            $retourJSON['MPROC_Out'] = $return;
            header('content-type:application/json');
            if ($_SESSION['_debug'] == true) {
                Fichier::createFichierTmp(LogSysteme::getServerName().'.'.str_replace('|', '_', $body['Action']) . '_Out.json', (string)json_encode($retourJSON));
            }
            return json_encode($retourJSON);
        }

        $xml = new SimpleXMLElement('<MPROC_Out/>');
        header('Content-Type: application/xml; charset=utf-8');
        \Helpers\Outil\Outils::array_to_xml($return, $xml, $body['Action']);
        $domxml = new \DOMDocument('1.0');
        $domxml->preserveWhiteSpace = false;
        $domxml->formatOutput = true;
        if ($ArrayString??[]) {
            $domxml->loadXML(str_replace('replace1', $ArrayString, $xml->asXML()));
        } else {
            $domxml->loadXML($xml->asXML());
        }

        $return = $domxml->saveXML();

        if ($_SESSION['_debug'] == true) {
            Fichier::createFichierTmp(LogSysteme::getServerName().'.'.str_replace('|', '_', $body['Action']) . '_Out.xml', (string)$return);
        }
        return $return;
    }
}
