<?php

namespace Modules\Fournisseur\Service;

use Entity\Model\Societe;
use Helpers\Fichier\Fichier;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Helpers\Parametres\Constante;
use Helpers\Session\Session;
use Helpers\Trad\ITrad;
use Modules\Fournisseur\WebService\Fournisseur;

class CreateEditService
{
    private \PDO $pdo;
    /** @phpstan-ignore-next-line */
    private ITrad $trad;

    public function __construct(\PDO $pdo, ITrad $trad)
    {
        $this->pdo = $pdo;
        $this->trad = $trad;
    }
   
    public function initSessionCreation(Session $session) : void
    {
        $session = new Session('Fournisseur', 'Creation');
        $session->setSession('modifFourniss', false);

        $fileNameFrs = $session->getSession('file_save_frs');

        if (!$fileNameFrs) {
            $value=[
                "Langue"      => $_SESSION['Session_Langue'],
                "Login"       => $_SESSION['Session_Login'],
                "no_ao"       => $_SESSION["Session_SocUsr"],
                "codeFrs"     => '',
                'codeDemande' => '',
                'affDemande'  => 'FALSE',
                'mode'        => 'V',
            ];

            $ficheFourniss = new Fournisseur();
            $ficheFourniss = $ficheFourniss->ficheFournisseur($value);
            
            $xmlName = 'fiche_frs_'.Sql::guidGenerate().'.xml';

            Fichier::createFichierTmp($xmlName, $ficheFourniss->responseData);
            $session->setSession('file_save_frs', $xmlName);

            $ficheFourniss = new \SimpleXMLElement($ficheFourniss->responseData);

            $this->initValueSession($session, $ficheFourniss);
            $this->initValueSessionInteraction($session, $ficheFourniss);
            $session->setSession('validation', true);
        }
    }

    public function getFiche() : string
    {
        $session = new Session('Fournisseur');

        return $session->getSession('file_save_frs');
    }

    /**
     * @param \SimpleXMLElement $ficheFourniss
     */
    public function initValueSession(Session $session, $ficheFourniss) : void
    {
        $code = strval($ficheFourniss->Fournisseur->CODE);
        $arrayFrs = [
            'PROSPECT'      => intval($ficheFourniss->Fournisseur->PROSPECT), // logique
            'CODE'          => $code,
            'DTEVALMIN'     => strval($ficheFourniss->Fournisseur->DTEVALMIN),
            'DTEVALMAX'     => strval($ficheFourniss->Fournisseur->DTEVALMAX),

            'ENSCOMM'       => strval($ficheFourniss->Fournisseur->Identity->RS),
            'RS'            => strval($ficheFourniss->Fournisseur->Identity->RS),
            'ADR'           => strval($ficheFourniss->Fournisseur->Identity->ADR),
            'CODE_PAYS'     => strval($ficheFourniss->Fournisseur->Identity->CODE_PAYS),
            'CPOSTAL'       => strval($ficheFourniss->Fournisseur->Identity->CPOSTAL),
            'VILLE1'        => strval($ficheFourniss->Fournisseur->Identity->VILLE1),
            'TEL'           => strval($ficheFourniss->Fournisseur->Identity->TEL),
            'TELEX'         => strval($ficheFourniss->Fournisseur->Identity->TELEX),
            'ADR_COMMANDE'  => intval($ficheFourniss->Fournisseur->Identity->ADR_COMMANDE), // logique
            'DISPO_MOBILITY' => intval($ficheFourniss->Fournisseur->Identity->DISPO_MOBILITY), // logique
            'NO_SIRET'      => strval($ficheFourniss->Fournisseur->Identity->NO_SIRET),
            'TAXE2'         => strval($ficheFourniss->Fournisseur->Identity->TAXE2),
            'TAXE3'         => strval($ficheFourniss->Fournisseur->Identity->TAXE3),
            'TAXE4'         => strval($ficheFourniss->Fournisseur->Identity->TAXE4),
            'NO_TVA_IC'     => strval($ficheFourniss->Fournisseur->Identity->NO_TVA_IC),
            'NO_DUNS'       => strval($ficheFourniss->Fournisseur->Identity->NO_DUNS),
            'ID_EXT'        => strval($ficheFourniss->Fournisseur->Identity->ID_EXT),
            'FOUPPAL'       => strval($ficheFourniss->Fournisseur->Identity->FOUPPAL),
            'FAX'           => strval($ficheFourniss->Fournisseur->Identity->FAX),
            'EMAIL'         => strval($ficheFourniss->Fournisseur->Identity->EMAIL),
            'SITEWEB'       => strval($ficheFourniss->Fournisseur->Identity->SITEWEB),
            'COD_LNG'       => strval($ficheFourniss->Fournisseur->Identity->COD_LNG),
            
            'RS_REGL'       => strval($ficheFourniss->Fournisseur->Reglement->RS_REGL),
            'ADR_REGL'      => strval($ficheFourniss->Fournisseur->Reglement->ADR_REGL),
            'PAYSREGL'      => strval($ficheFourniss->Fournisseur->Reglement->PAYSREGL),
            'CPREGL'        => strval($ficheFourniss->Fournisseur->Reglement->CPREGL),
            'VILREGL'       => strval($ficheFourniss->Fournisseur->Reglement->VILREGL),
            'RESP_FAC'      => strval($ficheFourniss->Fournisseur->Reglement->RESP_FAC),
            'DOM_BK'        => strval($ficheFourniss->Fournisseur->Reglement->DOM_BK),
            'CODE_BK'       => strval($ficheFourniss->Fournisseur->Reglement->CODE_BK),
            'CODE_GUIC'     => strval($ficheFourniss->Fournisseur->Reglement->CODE_GUIC),
            'NO_CPTE'       => strval($ficheFourniss->Fournisseur->Reglement->NO_CPTE),
            'CLE_RIB'       => strval($ficheFourniss->Fournisseur->Reglement->CLE_RIB),
            'IBANPAYS'      => strval($ficheFourniss->Fournisseur->Reglement->IBANPAYS),
            'IBANCLE'       => strval($ficheFourniss->Fournisseur->Reglement->IBANCLE),
            'IBANCPT'       => strval($ficheFourniss->Fournisseur->Reglement->IBANCPT),
            'CODEBIC'       => strval($ficheFourniss->Fournisseur->Reglement->CODEBIC),

            'COND_PAIE'     => strval($ficheFourniss->Fournisseur->Conditions->COND_PAIE),
            'MODE_PAIE'     => strval($ficheFourniss->Fournisseur->Conditions->MODE_PAIE),
            'LIV'           => strval($ficheFourniss->Fournisseur->Conditions->LIV),
            'DEVISE'        => strval($ficheFourniss->Fournisseur->Conditions->DEVISE),
            'TYP_TVA'       => strval($ficheFourniss->Fournisseur->Conditions->TYP_TVA),
            'MNTMINFAC'     => strval($ficheFourniss->Fournisseur->Conditions->MNTMINFAC),
            'CA_MIN_ST'     => strval($ficheFourniss->Fournisseur->Conditions->CA_MIN_ST),
            'CA_MAX_ST'     => strval($ficheFourniss->Fournisseur->Conditions->CA_MAX_ST),
            'RMINCPXN'      => intval($ficheFourniss->Fournisseur->Conditions->RMINCPXN), // logique
            'ZONE_LIB1'     => strval($ficheFourniss->Fournisseur->Conditions->ZONE_LIB2),
            'ZONE_LIB2'     => strval($ficheFourniss->Fournisseur->Conditions->ZONE_LIB2),
            'REMISE'        => strval($ficheFourniss->Fournisseur->Conditions->REMISE),
            'MOTCLE'        => strval($ficheFourniss->Fournisseur->Conditions->MOTCLE),
            
            'FOURPREF'      => intval($ficheFourniss->Fournisseur->Conditions->Eproc->FOURPREF), // logique
            'AUTOCC'        => intval($ficheFourniss->Fournisseur->Conditions->Eproc->AUTOCC), // logique
            'SEUILEPDIF'    => intval($ficheFourniss->Fournisseur->Conditions->Eproc->SEUILEPDIF),  // logique
            'MTMAXCC'       => strval($ficheFourniss->Fournisseur->Conditions->Eproc->MTMAXCC),
            'MTMAXCCHCT'    => strval($ficheFourniss->Fournisseur->Conditions->Eproc->MTMAXCCHCT),
            'NOCCGEN'       => intval($ficheFourniss->Fournisseur->Conditions->Eproc->NOCCGEN),  // logique
            
            'MNTMINFRA'     => strval($ficheFourniss->Fournisseur->Conditions->Franco->MNTMINFRA),
            'RFRACT'        => intval($ficheFourniss->Fournisseur->Conditions->Franco->RFRACT), // logique
            'ARTFRPORT'     => strval($ficheFourniss->Fournisseur->Conditions->Franco->ARTFRPORT),
            'FRPOBLIG'      => intval($ficheFourniss->Fournisseur->Conditions->Franco->FRPOBLIG), // logique

            'DEFTYPDOC'     => strval($ficheFourniss->Fournisseur->Conditions->DEFTYPDOC),

            'CODE_REGR'     => strval($ficheFourniss->Fournisseur->Detail->CODE_REGR),
            'DTE_AGREM'     => strval($ficheFourniss->Fournisseur->Detail->DTE_AGREM),
            'IND_QUALI'     => strval($ficheFourniss->Fournisseur->Detail->IND_QUALI),
            'CERTIF'        => strval($ficheFourniss->Fournisseur->Detail->CERTIF),
            'FRANCTVA'      => intval($ficheFourniss->Fournisseur->Detail->FRANCTVA), // logique
            'NAUTOSFA'      => intval($ficheFourniss->Fournisseur->Detail->NAUTOSFA), // logique
            'NOT_MANU'      => intval($ficheFourniss->Fournisseur->Detail->NOT_MANU), // logique
            'RECEP_AUTO'    => intval($ficheFourniss->Fournisseur->Detail->RECEP_AUTO), // logique
            'PER_REC_AUTO'  => strval($ficheFourniss->Fournisseur->Detail->PER_REC_AUTO),

            'GEREPORTAIL'   => intval($ficheFourniss->Fournisseur->OXALINK->GEREPORTAIL),
        ];

        foreach ($ficheFourniss->Fournisseur->ListChampsSup->ChpSup as $cs) {
            $keyFrs = 'CS_EXTENTION'.Constante::spliter.'FOURNISS'.Constante::spliter.$code.Constante::spliter.strval($cs->NOCS);
            $arrayFrs[$keyFrs] = strval($cs->VALEUR);
        }

        $contact = [];
        foreach ($ficheFourniss->Fournisseur->ListContacts->Contact as $ctc) {
            $contact[] = [
                'ETAT'          => strval($ctc->attributes()->Etat),
                'IND_FOU'       => strval($ctc->IND_FOU),
                'NOM'           => strval($ctc->NOM),
                'FONCTION'      => strval($ctc->FONCTION),
                'TEL'           => strval($ctc->TEL),
                'FAX'           => strval($ctc->FAX),
                'VIBOXAP'       => intval($ctc->VIBOXAP), // logique
                'TELPORT'       => strval($ctc->TELPORT),
                'EMAIL'         => strval($ctc->EMAIL),
                'OXALINK_ID'    => strval($ctc->OXALINK_ID),
                'CTC_OXALINK'   => strval($ctc->OXALINK_ID)? true:false,
            ];
        }

        $adresse = [];
        $zoneGeoAdresse = [];
        foreach ($ficheFourniss->Fournisseur->ListAdresses->Adresse as $adr) {
            $codeAdresse = strval($adr->COD_ADR);

            $adresse[] = [
                'COD_ADR'       => $codeAdresse,
                'ETAT'          => strval($adr->attributes()->Etat),
                'RAISOC'        => strval($adr->RAISOC),
                'ADRFOUR'       => strval($adr->ADRFOUR),
                'CP'            => strval($adr->CP),
                'VILLE'         => strval($adr->VILLE),
                'CODPAYS'       => strval($adr->CODPAYS),
                'TELEPHONE'     => strval($adr->TELEPHONE),
                'TELEX'         => strval($adr->TELEX),
                'FAX'           => strval($adr->FAX),
                'EMAIL'         => strval($adr->EMAIL),
                'ADR_COMMANDE'  => intval($adr->ADR_COMMANDE), // logique
            ];

            $zoneGeoAdresse[$codeAdresse] = [];
            foreach ($adr->ListZonesGeo->ZoneGeo as $value) {
                $zoneGeoAdresse[$codeAdresse] = [
                    'DCOUP'     => strval($value->DCOUP),
                    'ETAT'      => strval($value->attributes()->Etat),
                    'ZONEGEO'   => strval($value->ZONEGEO)
                ];
            }
        }

        $chiffreAffaire = [];
        foreach ($ficheFourniss->Fournisseur->ListChiffreAffaire->ChiffreAffaire as $ca) {
            $chiffreAffaire[] =[
                'ANNEE'     => strval($ca->ANNEE),
                'CHIFF_AFF' => strval($ca->CHIFF_AFF),
                'DEVISE_CA' => strval($ca->DEVISE_CA),
                'ETAT'      => strval($ca->attributes()->Etat),
            ];
        }

        $session->setSession('Fournisseur', $arrayFrs);
        $session->setSession('contact', $contact);
        $session->setSession('adresseCompl', $adresse);
        $session->setSession('chiffreAffaire', $chiffreAffaire);
        $session->setSession('zoneGeoAdresse', $zoneGeoAdresse);
    }

    /**
     * @param \SimpleXMLElement $ficheFourniss
     */
    public function initValueSessionInteraction(Session $session, $ficheFourniss) : void
    {
        $linkFrsSte = Roles::droit($this->pdo, 'LIEN_FOU_STE_ACTIF', 'PARAMFOU');

        $motClefsSession = $session->getSessionArray('motclef');
        if (!$motClefsSession) { //Si LA SESSION EST VIDE EN motclef, alors on récupere les valeurs du XML, sinon on garde les valeurs de la session
            $motClefsSession=[];
            foreach ($ficheFourniss->Fournisseur->ListMotsClef->MOTCLEF as $value) {
                array_push($motClefsSession, ['MOTCLEF' =>strval($value), 'ETAT' => strval($value->attributes()->Etat)]);
            }
            $session->setSession('motclef', $motClefsSession);
        }
        
        $EdiRoutageSession = $session->getSessionArray('EdiRoutage');
        if (!$EdiRoutageSession) {
            $ediRoutage=[
                'BDC_ELEC'      => strval($ficheFourniss->Fournisseur->ImpressionCde->BDC_ELEC),
                'ROUTAGECDE'    => strval($ficheFourniss->Fournisseur->ImpressionCde->ROUTAGECDE),
                'TYPE_FORM'     => strval($ficheFourniss->Fournisseur->ImpressionCde->TYPE_FORM),
                'input_FORMAT'  => strval($ficheFourniss->Fournisseur->ImpressionCde->FORMAT),
                'MODE_ENV'      => strval($ficheFourniss->Fournisseur->ImpressionCde->MODE_ENV),
                'MAIL_DEST'     => strval($ficheFourniss->Fournisseur->ImpressionCde->MAIL_DEST),
                'ADR_FTP'       => strval($ficheFourniss->Fournisseur->ImpressionCde->ADR_FTP),
                'USER_FTP'      => strval($ficheFourniss->Fournisseur->ImpressionCde->USER_FTP),
                'PWD_FTP'       => strval($ficheFourniss->Fournisseur->ImpressionCde->PWD_FTP),
                'PATH_DEP'      => strval($ficheFourniss->Fournisseur->ImpressionCde->PATH_DEP),
                'FORMAT' =>   strval($ficheFourniss->Fournisseur->ImpressionCde->FORMAT),
            ];
            $session->setSession('EdiRoutage', $ediRoutage);
        }
        
        $BddSession = $session->getSessionArray('Bdd');
        if (!$BddSession) {
            $BddSession=[];
            foreach ($ficheFourniss->Fournisseur->ListBDD->BDD as $value) {
                array_push($BddSession, [
                    'ETAT'          => strval($value->attributes()->Etat),
                    'NO_PAGE'       => strval($value->NO_PAGE),
                    'NUMORDRE'      => strval($value->NUMORDRE),
                    'TITRE'         => strval($value->TITRE),
                    'TEXTEBDD'      => strval($value->TEXTEBDD),
                    'VEPROC'        => strval($value->VEPROC),
                    'ONGLET'        => strval($value->ONGLET),
                    'LANGUE'        => strval($value->LANGUE),
                    'EXIST_PARAM'   => strval($value->EXIST_PARAM),
                    'EXIST_SURGRP'  => strval($value->EXIST_SURGRP),
                    'LIEPARAM'      => strval($value->LIEPARAM),
                    'HERITAGE'      => strval($value->HERITAGE),
                ]);
            }
            $session->setSession('Bdd', $BddSession);
        }
        
        $ZoneGeoSession = $session->getSessionArray('zoneGeo');
        if (!$ZoneGeoSession) {
            $ZoneGeoSession=[];
            foreach ($ficheFourniss->Fournisseur->ListZonesGeo->ZoneGeo as $value) {
                array_push($ZoneGeoSession, [
                    'DCOUP'     => strval($value->DCOUP),
                    'ETAT'      => strval($value->attributes()->Etat),
                    'ZONEGEO'   => strval($value->ZONEGEO)
                ]);
            }
            $session->setSession('zoneGeo', $ZoneGeoSession);
        }
        
        $typeAchatSession = $session->getSessionArray('typeAchat');
        if (!$typeAchatSession) {
            $typeAchatSession=[];
            foreach ($ficheFourniss->Fournisseur->ListTypeAchats->TypeAchats as $value) {
                array_push($typeAchatSession, [
                    'TACFOTAC'  => strval($value->TACFOTAC),
                    'ETAT'      => strval($value->attributes()->Etat),
                    'DEFAUT'    => strval($value->TACFODEF)
                ]);
            }
            $session->setSession('typeAchat', $typeAchatSession);
        }
        
        $listeSSFamilleSession = $session->getSessionArray('sousFamille');
        
        if (!$listeSSFamilleSession) {
            $listeSSFamilleSession=[];
            foreach ($ficheFourniss->Fournisseur->ListSsFamille->CODE_SFAM as $value) {
                array_push($listeSSFamilleSession, [
                    'CODE_SFAM' => strval($value),
                    'ETAT'      => strval($value->attributes()->Etat)
                ]);
            }
            $session->setSession('sousFamille', $listeSSFamilleSession);
        }

        if ($linkFrsSte) {
            $listeSocieteSession = $session->getSessionArray('societe');

            if (!$listeSocieteSession) {
                $listeSocieteSession = [];
                foreach ($ficheFourniss->Fournisseur->ListSocietes->CODE_STE as $value) {
                    if (strval($value) != '') {
                        array_push($listeSocieteSession, [
                            'CODE_STE' => strval($value),
                            'libSte'   => (new Societe($this->pdo))->find(strval($value), ['RAIS_SOC'])['RAIS_SOC']??'',
                            'Etat'     => strval($value->attributes()->Etat)
                        ]);
                    }
                }
                $session->setSession('societe', $listeSocieteSession);
            }
        }
    }
}
