<?php

namespace Modules\Facture\WebService;

use Helpers\Webservice\Wsdl;

class GestionFacture
{
    public static function clotureLitige(string $numFacture, string $codeIncident, string $comment = '') :\SimpleXMLElement
    {
        $res = self::litige($numFacture, $comment, $codeIncident, 'S', '', []);
        return new \SimpleXMLElement($res->responseData);
    }
    
    /**
     * @param array<string> $listMailComptable
     */
    public static function createLitige(
        string $numFacture,
        string $comment,
        string $codeIncident,
        string $responsable,
        array $listMailComptable
    ) :\SimpleXMLElement {
        $res = self::litige(
            $numFacture,
            $comment,
            $codeIncident,
            'L',
            $responsable,
            $listMailComptable
        );
        return new \SimpleXMLElement($res->responseData);
    }

    /**
     * @param array<string> $listMailComptable
     */
    public static function litige(
        string $numFacture,
        string $commentaire,
        string $codeIncident,
        string $mode,
        string $responsable,
        array $listMailComptable
    ) :Wsdl {
        $xml =  '<LitigeBAPIn LngUtilisation="'.htmlspecialchars($_SESSION['Session_Langue']).'">
                    <Utilisateur>'.htmlspecialchars($_SESSION['Session_Login']).'</Utilisateur>
                    <Mode>'.$mode.'</Mode> <!-- valeurs possibles : "L" pour mise en litige, "S" pour suppression du litige -->
                    <NumFact>'.htmlspecialchars($numFacture).'</NumFact>
                    <Comment>'.htmlspecialchars($commentaire).'</Comment>
                    <CodeIncident>'.htmlspecialchars($codeIncident).'</CodeIncident>
                    <RespIncident>'.htmlspecialchars($responsable).'</RespIncident>
                    <MailContactFournisseur>'.htmlspecialchars(implode(',', $listMailComptable)).'</MailContactFournisseur>
                </LitigeBAPIn>';
        
        return new Wsdl('Oxaproc_Gen.wsdl', 'OXAPRC_LITIGEBAP', $xml, false);
    }
    
    public static function supprimer($numFacture)
    {
        \Helpers\Webservice\Wsdl::XmlEntities($array);
        
        $xml =  '<FactureSupprime_In LngUtilisation="'.htmlspecialchars($_SESSION['Session_Langue']).'">
                    <Utilisateur>'.$_SESSION['Session_Login'].'</Utilisateur>
                    <NUM_FACT>'.$numFacture.'</NUM_FACT>
                </FactureSupprime_In>';
        
        return new \Helpers\Webservice\Wsdl('Oxaproc_Gen.wsdl', 'OXAPRC_FACT_SUPPRESSION', $xml, false);
    }

    /**
     * Undocumented function
     *
     * @param array<mixed> $array
     * @return Wsdl
     */
    public function signatureFacture($array)
    {
        //   <MotdePasse></MotdePasse>
        $envoi =
        '<SigBAPIn 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>'.htmlentities($array['MotdePasse']).'</MotdePasse>
            <Mode>'.$array['Mode'].'</Mode>
            <NumFact>'.$array['NumFact'].'</NumFact>
            <Signataire>'.$array['Signataire'].'</Signataire>
            <Comment>'.($array['Comment'] ?? '').'</Comment>';
        
        if (isset($array['NvSignataire'])) {
            $envoi .= '<NvSignataire>'.$array['NvSignataire'].'</NvSignataire>';
        }
        
        // TODO SIGN_SPECIF_BOEH_INVEST ??
        

            $envoi .='<Confirm>'.($array['Confirm'] ?? 'false').'</Confirm>';
        
        // TODO ??
        // Si le champ lié à la notation fournisseur existe alors on l'ajoute au wsdl de signature
        // if (! is_null($this->notation_fournisseur))
        //     $envoi .= "<SPECIFCLIENT>{$this->notation_fournisseur}</SPECIFCLIENT>";

        $envoi .= '</SigBAPIn>';
        
        return new \Helpers\Webservice\Wsdl('', 'OXAPRC_SIGNBAP', $envoi, false);
    }

    /**
     * @param array<string> $listFacId
     * @param array<mixed> $post
     */
    public function signatureMultiFac(string $motDePasse, string $mode, string $signataire, array $listFacId, bool $confirm, string $comment = '', $post = []) :Wsdl
    {
        $envoi = '<SigBAPIn 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>
            <MultiFact>true</MultiFact>
            <ListeFact>
                '.join('', array_map(function ($fac) {
                    return '<Fact>
                        <NumFact>'.\htmlspecialchars($fac, ENT_XML1, 'UTF-8').'</NumFact>
                    </Fact>';
        }, $listFacId)).'
            </ListeFact>
            <Signataire>'.\htmlspecialchars($signataire, ENT_XML1, 'UTF-8').'</Signataire>
            <Comment>'.\htmlspecialchars(($comment), ENT_XML1, 'UTF-8').'</Comment>
            <Confirm>'.($confirm ? 'true' : 'false').'</Confirm>'
            .($mode == 'R'/* Refus */ ?
                '<Incident>
                    <Code>'.htmlspecialchars($post['Incident']['CODE']).'</Code>
                    <Responsable>'.htmlspecialchars($post['Incident']['INCF_USER']).'</Responsable>
                    <MailContactFournisseur >'.htmlspecialchars(implode(',', $post['ListContactFournisseur'])).'</MailContactFournisseur>
                </Incident>' : ''
            )
            .'
        </SigBAPIn>';
        
        return new Wsdl('', 'OXAPRC_SIGNBAP', $envoi, false, true);
    }
}
