<?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 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 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 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 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('CA', $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 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 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 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 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 Wsdl('', 'OXAPRC_CDE_VALID', $envoi, false);
    }

    /**
     * @return 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 Wsdl('', 'OXAPRC_CDE_SOLDEFINANCIER', $envoi, false);
    }

    /**
     * @return 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);
    }
}
