<?php

namespace Modules\Commande\WebService;

use Helpers\CaracCompl\CaracCompl;
use Helpers\Outil\Sql;
use Helpers\Webservice\Wsdl;

class Commande
{
    
    public function suppresionCommande($numCde)
    {
        $envoi = '<CdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                    <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                    <NumCde>'.$numCde.'</NumCde>
                  </CdeIn>';
        
        return new \Helpers\Webservice\Wsdl('Oxaproc_Commande.wsdl', 'OXAPRC_CDE_SUPPRIM', $envoi, false);
    }
    
    public function devaliderCommande($numCde)
    {
        $envoi = '<CdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                    <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                    <NumCde>'.$numCde.'</NumCde>
                  </CdeIn>';

        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_CDE_DEVALID', $envoi, false);
    }
        
    /**
     * annulerCommande
     *
     * @param  int $numCde
     * @param  string|null $commentaire
     * @return mixed
     */
    public function annulerCommande($numCde, $commentaire = null)
    {
        $envoi = '<CdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                    <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                    <NumCde>'.$numCde.'</NumCde>
                    <Commentaire>'.$commentaire.'</Commentaire>
                  </CdeIn>';
        
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_CDE_ANNULATION', $envoi, false);
    }

    public function signatureCommande($array)
    {
        $envoi = '  <SigCdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                      <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                      <UserConnecte>' . (array_key_exists("MODE_BACKUP", $_SESSION) && $_SESSION['MODE_BACKUP'] ? $_SESSION['user_origine'] : $_SESSION['Session_Login']) . '</UserConnecte>
                      <MotdePasse>'.\htmlspecialchars($array['MotdePasse'], ENT_XML1, 'UTF-8').'</MotdePasse>
                      <Mode>'.\htmlspecialchars($array['Mode'], ENT_XML1, 'UTF-8').'</Mode>
                      <NumCde>'.\htmlspecialchars($array['NumCde'], ENT_XML1, 'UTF-8').'</NumCde>
                      <Signataire>'.\htmlspecialchars($array['Signataire'], ENT_XML1, 'UTF-8').'</Signataire>
                      <Comment>'.\htmlspecialchars(($array['Comment']??''), ENT_XML1, 'UTF-8').'</Comment>';
        if ($array['Mode']=='M') {
            $envoi .= '    <NvSignataire>'.$array['NvSignataire'].'</NvSignataire>';
        }
        
        $envoi .= '    <Confirm>'.$array['Confirm'].'</Confirm>
                    </SigCdeIn>';
        
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_SIGNCDE', $envoi, false);
    }

    /**
     * @param \PDO $pdo
     * @param string $idDoc
     * @param string $signatire
     * @param array<mixed> $array
     * @param boolean $confirm
     * @return wsdl
     */
    public function modifierEtSignature($pdo, $idDoc, $signatire = null, $array = [], $confirm = false) : wsdl
    {
        $envoi = '<SigCdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                    <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                    <UserConnecte>' . (array_key_exists("MODE_BACKUP", $_SESSION) && $_SESSION['MODE_BACKUP'] ? $_SESSION['user_origine'] : $_SESSION['Session_Login']) . '</UserConnecte>
                    <MotdePasse>'.\htmlspecialchars($array['password'], ENT_XML1, 'UTF-8').'</MotdePasse>
                    <Mode>'.\htmlspecialchars($array['mode'], ENT_XML1, 'UTF-8').'</Mode>
                    <NumCde>'.\htmlspecialchars($idDoc, ENT_XML1, 'UTF-8').'</NumCde>
                    <Signataire>'.\htmlspecialchars($signatire, ENT_XML1, 'UTF-8').'</Signataire>
                    <Comment>'.\htmlspecialchars($array['commentaire'], ENT_XML1, 'UTF-8').'</Comment>
                    <ModifDocument>true</ModifDocument>
                    <Document>
                        <SectImp>'.\htmlspecialchars($array['SECTIMP'], ENT_XML1, 'UTF-8').'</SectImp>
                        <CodeComp>'.\htmlspecialchars($array['CODECOMP'], ENT_XML1, 'UTF-8').'</CodeComp>
                        <SCptAna>'.\htmlspecialchars($array['SSCPTEANA'], ENT_XML1, 'UTF-8').'</SCptAna>
                        <CodeGest>'.\htmlspecialchars($array['CODGES'], ENT_XML1, 'UTF-8').'</CodeGest>
                        <ListChpSup>';

        foreach ($array['CS'] as $k => $cs) {
            $envoi .= '  <ChpSup>
                                            <CSNumFixe>'.$k.'</CSNumFixe>
                                            <CSValeur>'.\htmlspecialchars($cs, ENT_XML1, 'UTF-8').'</CSValeur>
                                        </ChpSup>';
        }

            $envoi .= '</ListChpSup>
                       <ListLignes>';

        foreach ($array['ligne'] as $idLign => $ligne) {
            $envoi .= ' <Ligne>
                                        <NumLigne>'.\htmlspecialchars($idLign, ENT_XML1, 'UTF-8').'</NumLigne>
                                        <SectImp>'.\htmlspecialchars($ligne['SECTIMP'], ENT_XML1, 'UTF-8').'</SectImp>
                                        <CodeComp>'.\htmlspecialchars($ligne['CODECOMP'], ENT_XML1, 'UTF-8').'</CodeComp>
                                        <SCptAna>'.\htmlspecialchars($ligne['SSCPTEANA'], ENT_XML1, 'UTF-8').'</SCptAna>
                                        <CodeGest>'.\htmlspecialchars($ligne['CODGES'], ENT_XML1, 'UTF-8').'</CodeGest>
                                        <ListChpSup>';
            foreach ($ligne['CS'] as $k => $cs) {
                  $envoi .= '  <ChpSup>
                                                            <CSNumFixe>'.$k.'</CSNumFixe>
                                                            <CSValeur>'.\htmlspecialchars($cs, ENT_XML1, 'UTF-8').'</CSValeur>
                                                        </ChpSup>';
            }
                 $envoi .= '</ListChpSup>
                                        <ListCarComp>';

                         $cc = new CaracCompl($pdo);
                         $listeCC = $cc->getCCDocc('CDE', $idDoc, $idLign, '0');

            foreach ($listeCC as $cc) {
                               $value = $ligne['CC'][$cc['CC_ID']]??'';
                               $envoi .= " <CarComp> 
                                                            <CC_ID>".$cc['CC_ID']."</CC_ID>
                                                            <CC_FREE>".Sql::convertBooleenCheckboxForWsdl($cc['CC_FREE'])."</CC_FREE>
                                                            <CC_DISPLAY_NUM>".$cc['CC_DISPLAY_NUM']."</CC_DISPLAY_NUM>
                                                            <CC_IS_TITLE>".Sql::convertBooleenCheckboxForWsdl($cc['CC_IS_TITLE'])."</CC_IS_TITLE>
                                                            <CC_NAME>".htmlspecialchars($cc['NOM'])."</CC_NAME>
                                                            <CC_TYPE>".$cc['CC_TYPE']."</CC_TYPE>
                                                            <CC_UPD_ONLY_RECEIPT>".Sql::convertBooleenCheckboxForWsdl($cc['CC_UPD_ONLY_RECEIPT'])."</CC_UPD_ONLY_RECEIPT>
                                                            <CC_INVIS_RECEIPT>".Sql::convertBooleenCheckboxForWsdl($cc['CC_INVIS_RECEIPT'])."</CC_INVIS_RECEIPT>
                                                            <CC_REQUIRED>".Sql::convertBooleenCheckboxForWsdl($cc['CC_REQUIRED'])."</CC_REQUIRED>
                                                            <CC_PRINTED_OF>".Sql::convertBooleenCheckboxForWsdl($cc['CC_PRINTED_OF'])."</CC_PRINTED_OF>
                                                            <CC_CALC>".Sql::convertBooleenCheckboxForWsdl($cc['CC_CALC'])."</CC_CALC>
                                                            <CC_CALC_EXP>".htmlspecialchars($cc['CC_CALC_EXP'])."</CC_CALC_EXP>
                                                            <CC_VALUE>".htmlspecialchars($value)."</CC_VALUE> 
                                                        </CarComp>";
            }
                                          $envoi .= ' </ListCarComp>
                                    </Ligne>';
        }
                       $envoi .= '</ListLignes>
                        <ListPJ>';
        foreach ($array['pj'] as $pj) {
            $envoi .= ' <PJ>
                                            <TypePJ>'.\htmlspecialchars($pj['typePj'], ENT_XML1, 'UTF-8').'</TypePJ>
                                            <Titre>'.\htmlspecialchars($pj['titreDoc'], ENT_XML1, 'UTF-8').'</Titre>
                                            <NomFichier>'.\htmlspecialchars($pj['new_name'], ENT_XML1, 'UTF-8').'</NomFichier>
                                            <NomFichierOrigine>'.\htmlspecialchars($pj['NOM_ORI'], ENT_XML1, 'UTF-8').'</NomFichierOrigine>
                                            <Verrou>false</Verrou>
                                            <LectureSeule>'.($pj['LECTURE']?'true':'false').'</LectureSeule>
                                            <ImprimerSurDoc>'.($pj['IMP_PJ']?'true':'false').'</ImprimerSurDoc>
                                            <ImprimerTitreSurDoc>'.($pj['IMP_TITRE']?'true':'false').'</ImprimerTitreSurDoc>
                                        </PJ>';
        }
            $envoi .= '</ListPJ>
                    </Document>
                    <Confirm>'.($confirm? 'true':'false').'</Confirm>
                </SigCdeIn>';


                return new \Helpers\Webservice\Wsdl('', 'OXAPRC_SIGNCDE', $envoi, false);
    }

    /**
     * @param array<string> $listCommandeId
     * @param array<mixed> $post
     */
    public function signatureMultiCommande(string $motDePasse, string $mode, string $signataire, array $listCommandeId, bool $confirm, string $comment = '', $post = []) :Wsdl
    {
        $envoi = '<SigCdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
            <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
            <UserConnecte>' . (array_key_exists("MODE_BACKUP", $_SESSION) && $_SESSION['MODE_BACKUP'] ? $_SESSION['user_origine'] : $_SESSION['Session_Login']) . '</UserConnecte>
            <MotdePasse>'.\htmlspecialchars($motDePasse, ENT_XML1, 'UTF-8').'</MotdePasse>
            <Mode>'.\htmlspecialchars($mode, ENT_XML1, 'UTF-8').'</Mode>
            <MultiCde>true</MultiCde>
            <ListeCde>';

        foreach ($listCommandeId as $numCde) {
            $algoSpec = json_decode(($post['algoSpecif'][$numCde]??''), true);
            if (!$algoSpec) {
                $algoSpec = '';
            }

            $specifique = new \Helpers\Additional\Specifique\Specifique();
            $namespaceSpecifique = $specifique->specifiqueFunction('\\Modules\\Signature\\Service\\WorkflowSpecifique');
            if (class_exists($namespaceSpecifique)) {
                $algoSpec = \Helpers\Additional\Specifique\Specifique::specifique('\\Modules\\Signature\\Service\\WorkflowSpecifique', 'strReplaceSpecif', $algoSpec);
            }

            $envoi .= '<Cde>
                                <NumCde>'.\htmlspecialchars($numCde, ENT_XML1, 'UTF-8').'</NumCde>
                                '.(isset($post['algoSpecif'][$numCde])? '<AlgoSpecif>'.\htmlspecialchars($algoSpec).'</AlgoSpecif>':'').'
                                '.(isset($post['NvSignataire'][$numCde])? '<NvSignataire>'.\htmlspecialchars($post['NvSignataire'][$numCde]).'</NvSignataire>':'').'
                            </Cde>';
        }
        $envoi .= '</ListeCde>
            <Signataire>'.\htmlspecialchars($signataire, ENT_XML1, 'UTF-8').'</Signataire>
            <Comment>'.\htmlspecialchars(($comment), ENT_XML1, 'UTF-8').'</Comment>
            <Confirm>'.($confirm ? 'true' : 'false').'</Confirm>
        </SigCdeIn>';
        
        return new Wsdl('', 'OXAPRC_SIGNCDE', $envoi, false, true);
    }
    
    public function soldePhysiquementCommande($complet, $num_cde, $array, $solde = false, $br = false)
    {

        $liste_ligne = $array['listeLigne'];
        
        $mode = 'false';
        
        if ($br) {
            $mode = 'true';
        }
        
        
        $envoi = '  <CdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                        <DescriptionIncident>'.htmlspecialchars($array['DescriptionIncident']).'</DescriptionIncident>
                        <CommentaireIncident>'.htmlspecialchars($array['CommentaireIncident']).'</CommentaireIncident>
                        <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                        <NumCde>'.$num_cde.'</NumCde>
                        <ExclureRecAuto>'.$mode.'</ExclureRecAuto>';
        if ($complet) {
            foreach ($liste_ligne as $ligne) {
                $envoi .= '     <Lignes>
                                    <NumLigne>'.$ligne['NO_PO'].'</NumLigne>
                                    <Operation>'.($solde? 'S':'D').'</Operation>
                                    <DescriptionIncident></DescriptionIncident>
                                    <CommentaireIncident></CommentaireIncident>
                                </Lignes>';
            }
        } else {
            foreach ($liste_ligne as $ligne) {
                $envoi .= '     <Lignes>
                                    <NumLigne>'.$ligne['NO_PO'].'</NumLigne>
                                    <Operation>'.$ligne['Operation'].'</Operation>
                                    <DescriptionIncident>'.htmlspecialchars($ligne['DescriptionIncident']).'</DescriptionIncident>
                                    <CommentaireIncident>'.htmlspecialchars($ligne['CommentaireIncident']).'</CommentaireIncident>
                                </Lignes>';
            }
        }
                        
        $envoi .= '  </CdeIn>';

        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_CDE_SOLDEPHYSIQUE', $envoi, false);
    }
    
    public function impressionPDF($numCde, $NonChiffree)
    {
        
        $envoi = '  <CdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                        <NumeroCde>'.$numCde.'</NumeroCde>
                        <NonChiffree>'.($NonChiffree? 'true':'false').'</NonChiffree>
                    </CdeIn>';
        
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_IMPRIMECDE', $envoi, false);
    }

    /**
     * Fonction permettant d'afficher une prévisualisation d'une commande fictuve afin que l'utilisateur puisse visualiser
     * sa nouvelle image de signature
     */
    public static function previewImgSignOnCde(string $userId) :\SimpleXMLElement
    {
        // TODO : are those usefull ?
        // $tbl = array(
        //     'CtrLivraison' => $EntetePanier->getLIV_CTR(),
        //     'SectImp' => $EntetePanier->getSI_CODE(),
        //     'AdrLivr' => $EntetePanier->getLIV_ADR(),
        //     'VilleLivr' => $EntetePanier->getLIV_VILLE(),
        //     'PaysLivr' => $EntetePanier->getLIV_PAYS(),
        //     'ContactLivr' => $EntetePanier->getCTC_NOM(),
        //     'FonctionContactLivr' => $EntetePanier->getCTC_FCT(),
        //     'TelContLivr' => $EntetePanier->getCTC_TEL(),
        //     'FaxContLivr' => $EntetePanier->getCTC_FAX(),
        //     'PortContLivr' => $EntetePanier->getCTC_GSM(),
        //     'MailContLivr' => $EntetePanier->getCTC_MAIL(),
        //     'ListChpSup' => '',
        //     'RefPanier' => '999999999',
        //     'Utilisateur' => $_SESSION['Session_Login'],
        //     'DelaiLiv' => ''
        // );

        return new \SimpleXMLElement(
            (new Wsdl(
                'Oxaproc_Commande.wsdl',
                'OXAPRC_IMPRIMECDE',
                '<CdeIn LngUtilisation="'.$_SESSION['Session_Langue'].'">'
                    // . $tbl
                    . '<Utilisateur>'.htmlentities($userId).'</Utilisateur>
                    <Cde>
                        <ListProduit>
                            <Produit>
                                <CodeArticle>Code article fictif</CodeArticle>
                                <RefFournisseur>Réf fournisseur fictive</RefFournisseur>
                                <RefFabricant/>
                                <CodeFabricant/>
                                <SousFamille>Sous-famille pour test de signature</SousFamille>
                                <DesArticle>Test de signature</DesArticle>
                                <DesCompl>Test de signature</DesCompl>
                                <QteDemande>10</QteDemande>
                                <CodeUnit>U</CodeUnit>
                                <PxDemande>10</PxDemande>
                                <AccordCadre/>
                                <SectImp>Imputation test de signature</SectImp>
                                <CodeComp/>
                                <SCptAna/>
                                <CodeGest/>
                                <LibCodeGest/>
                                <IdCodeGest/>
                                <DelaiLiv>'.date('Ymd').'</DelaiLiv>
                                <CtrLivraison>' . ''/*XmlEntities($EntetePanier->getLIV_CTR())*/ . '</CtrLivraison>
                                <Budget>100</Budget>
                                <IdLigne>9999999999</IdLigne>
                                <ModeTransport></ModeTransport>
                                <ChpSpecif1/>
                            </Produit>
                        </ListProduit>
                    </Cde></CdeIn>',
                false
            ))->responseData
        );
    }

    /**
     * @return \Helpers\Webservice\Wsdl
     */
    public function validateCommande(string $noCde, bool $confirm = false, int $etape = 0, string $algo = null, string $signataire = null)
    {
        $envoi = '  <CdeValIn LngUtilisation="'.$_SESSION['Session_Langue'].'">
                        <Utilisateur>'.$_SESSION["Session_Login"].'</Utilisateur>
                        <NumCde>'.$noCde.'</NumCde>
                        <ForcerValidation>'.($confirm? 'true':'false').'</ForcerValidation>
                        <NumeroEtape>'.$etape.'</NumeroEtape>
                        <AlgoSpecif>'.$algo.'</AlgoSpecif>
                        <Signataire>'.$signataire.'</Signataire>
                    </CdeValIn>';
        
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_CDE_VALID', $envoi, false);
    }

    /**
     * @return \Helpers\Webservice\Wsdl
     * @param array<mixed> $listeLigne
     */
    public function soldeFinancier(string $noCde, bool $operationGlobal = true, string $operation = '', $listeLigne = [], string $message = '')
    {
        $envoi = "  <SoldeFinCde_In LngUtilisation='".$_SESSION['Session_Langue']."'>
                        <Utilisateur>".$_SESSION["Session_Login"]."</Utilisateur>
                        <Operation>$operation</Operation>
                        <NumCde>$noCde</NumCde>
                        <Commentaire>".htmlspecialchars($message)."</Commentaire>
                        <OperationGlobal>".($operationGlobal? 'TRUE':'FALSE')."</OperationGlobal>
                        <ListLignes>";

        foreach ($listeLigne as $ligne) {
            $envoi .= "
                                <Ligne>
                                    <NumLigne>".$ligne['NO_PO']."</NumLigne>
                                    <Operation>".($ligne['SOLDER']?'S':'D')."</Operation>
                                </Ligne>
                            ";
        }
        $envoi .= "      </ListLignes>
                    </SoldeFinCde_In>";

        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_CDE_SOLDEFINANCIER', $envoi, false);
    }

    /**
     * @return \Helpers\Webservice\Wsdl
     * @param string $order
     */
    public function editSheet(string $order)
    {
        $envoi = "<FrnListeIncidents_In LngUtilisation='".$_SESSION['Session_Langue']."'>
                        <Utilisateur>".$_SESSION["Session_Login"]."</Utilisateur>
                        <CodeFournMin>Code fournisseur</CodeFournMin>
                        <CodeFournMax>Code fournisseur</CodeFournMax>
                        <DateIncMin>Date de l'incident</DateIncMin>
                        <DateIncMax>Date de l'incident</DateIncMax>
                        <CodeIncMin>Code de l'incident</CodeIncMin>
                        <CodeIncMax>Code de l'incident</CodeIncMax>
                        <NiveauIncMin>Niveau de l'incident. Entier de 0 à 99.</NiveauIncMin>
                        <NiveauIncMax>Niveau de l'incident. Entier de 0 à 99.</NiveauIncMax>
                        <NumCdeMin>N° de la commande</NumCdeMin>
                        <NumCdeMax>N° de la commande</NumCdeMax>
                        <AvecDetails>true</AvecDetails>
                    </FrnListeIncidents_In>";

        return new Wsdl('', 'OXAPRC_FRN_LISTE_INCIDENTS', $envoi, false);
    }
}
