<?php
namespace Modules\Fournisseur\Controller;

require_once 'application/helpers/downloadHelper.php';
use Entity\Model\Modelivr;
use Entity\Model\Modepaie;
use Entity\Model\Paravrac;
use Modules\Fournisseur\Service\CreateEditService;
use Modules\GlobalApplication\Repository\LicenceOxalys;
use Skeleton\Controller\Controller;
use Entity\Model\TypeTVA;
use Entity\Model\Pays;
use Entity\Model\Langues;
use Helpers\Session\Session;
use Helpers\Ariane\Ariane;
use Entity\Model\Fourniss;
use Modules\Fournisseur\Outil\DroitUtilisateur;
use Entity\Model\Periodes;
use Entity\Model\Societe;
use Entity\Model\WftDemEnt;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Helpers\Fichier\Fichier;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Modules\Fournisseur\Repository\ZoneGeo;
use Modules\Fournisseur\Repository\GestFourniss;

class ModificationFournisseurController extends Controller
{

    
    public function pageInit()
    {
        $session = new Session('Fournisseur');
        $session->SuppresionErreurSession();
    }
    
    public function modificationFournisseurAction()
    {
        $post = $this->request->getParsedBody();

        $linkFrsSte = Roles::droit($this->pdo, 'LIEN_FOU_STE_ACTIF', 'PARAMFOU');

        if (isset($post['signa'])) {
            unset($_SESSION['Fournisseur']);
        }
        $codeFrs = $this->request->getAttribute('id');
        $modeFrs = $this->request->getAttribute('mode');
        $codeType = $this->request->getAttribute('codeType');
        $signa = '';

        $PARAVRAC = new Paravrac($this->pdo);
        $paramCode = $PARAVRAC->find(["TYPEPARV" => 'NUM_FO_PAR', "CODEPARV" => 'MODE']);
        
        $SaieiCode = str_replace(' ', '', $paramCode['LIB01PARV']);

        if ($SaieiCode == 'M') {
            $modeCode=1;
        } else {
            $modeCode=0;
        }

        $codeDemande = '';
        $mode = false;
        if (($modeFrs=='ModifSign' && $codeType == 'CODE_DEMANDE') || $modeFrs=='ModifSignOXALINK' || $modeFrs == 'FrsWithOutCode') {
            if ($modeFrs=='ModifSign') {
                $wftDemEnt = new WftDemEnt($this->pdo);
                $demandeWF = $wftDemEnt->find(['TYPE_ENT' => 'FOURNISS', 'CODE_DEMANDE' => $codeFrs]);
                if ($demandeWF['CODE_ENREG']) {
                    $mode='M';
                }
            }

            $codeType = 'CODE_DEMANDE';
            $codeDemande = $codeFrs;
            $codeFrs = '';
        } elseif ($modeFrs == 'modification' && $codeType == 'CODE_DEMANDE') {
            $codeType = 'CODE_DEMANDE';
            $codeDemande = $codeFrs;

            $wftDemEnt = new WftDemEnt($this->pdo);
            $demandeWF = $wftDemEnt->find(['TYPE_ENT' => 'FOURNISS', 'CODE_DEMANDE' => $codeDemande]);
            $codeFrs = $demandeWF['CODE_ENREG'];
        }
        
        $sessionFournisseur = new Session('Fournisseur', 'Modification');
        $sessionFournisseur->setSession('CODE', $codeFrs);
        $sessionFournisseur->setSession('modifFourniss', true);

        if ($codeFrs) {
            $arrayPath = ['id' => $codeFrs, 'mode' => $modeFrs, 'codeType' => $codeType];
        } else {
            $arrayPath = ['id' => $codeDemande, 'mode' => $modeFrs, 'codeType' => $codeType];
        }

        $sessionFournisseur->setSession('arrayPath', $arrayPath);

        if ($codeDemande) {
            $sessionFournisseur->setSession('codeDemande', $codeDemande);
        }

        if ($modeFrs=='ModifSign' || $modeFrs=='ModifSignOXALINK' || $sessionFournisseur->getSession('ModifSigner')) {
            $sessionFournisseur->setSession('ModifSigner', true);
            if ($modeFrs=='ModifSignOXALINK') {
                $sessionFournisseur->setSession('OXALINK', true);
            }

            if (isset($post['signa'])) {
                $signa = $post['signa'];
            } else {
                $signa = $sessionFournisseur->getSession('signa');
            }
            $modifSigner = true;
        }

        $sessionFournisseur->setSession('signa', $signa);
        
        $fournis = new Fourniss($this->pdo);
        $fournis = $fournis->find($codeFrs);
                
        if (!$mode) {
            if (!$fournis) {
                $mode='C';
            } else {
                $mode='M';
            }
        }

        $sessionFournisseur->setSession('etatFournisseur', $mode);
        $xmlFile = $sessionFournisseur->getSession('file_save_frs');

        if (isset($post['importFournisseur'])) {
            $post['importFournisseur'] = (array)JWT::decode($post['importFournisseur'], new Key($this->JWTKEY, 'HS256'));
            $post['importFournisseur'] = $post['importFournisseur'][0] ?? '';
            $ficheFourniss = new \SimpleXMLElement($post['importFournisseur']);
            $sessionFournisseur->setSession('NOM_FIC_SOURCE', $ficheFourniss->Fournisseur->NOM_FIC_SOURCE);
        } elseif ($xmlFile) {
            $fileTMP = $_SESSION['dir_tmp'].$xmlFile;
                
            $fileContentXML = file_get_contents($fileTMP);
            $ficheFourniss = new \SimpleXMLElement($fileContentXML);
        } else {
            $value=
            [
                "Langue" => $_SESSION['Session_Langue'],
                "Login" => $_SESSION['Session_Login'],
                "no_ao" => $_SESSION["Session_SocUsr"],
                "codeFrs" => $codeType == 'CODE_DEMANDE' ? '' : $codeFrs,
                'codeDemande' => $codeType == 'CODE_DEMANDE' ? $codeDemande : '',
                'affDemande' => 'TRUE',
                'mode' => $mode,
                'signa' => $signa,
            ];
            
            $ficheFourniss = new \Modules\Fournisseur\WebService\Fournisseur();
            $ficheFourniss = $ficheFourniss->ficheFournisseur($value);
            
            $xmlName = 'fiche_frs_'.Sql::guidGenerate().'.xml';
            Fichier::createFichierTmp($xmlName, $ficheFourniss->responseData);
            $sessionFournisseur->setSession('file_save_frs', $xmlName);

            $ficheFourniss = new \SimpleXMLElement($ficheFourniss->responseData);
            
            $masquerOnglet['ImpressionCde']   =  intval($ficheFourniss->Fournisseur->ImpressionCde->attributes()->NonVisible);
            $masquerOnglet['ListBDD']         =  intval($ficheFourniss->Fournisseur->ListBDD->attributes()->NonVisible);
            $masquerOnglet['ListSsFamille']   =  intval($ficheFourniss->Fournisseur->ListSsFamille->attributes()->NonVisible);
            $masquerOnglet['ListTypeAchats']  =  intval($ficheFourniss->Fournisseur->ListTypeAchats->attributes()->NonVisible);
            $masquerOnglet['ListMotsClef']    =  intval($ficheFourniss->Fournisseur->ListMotsClef->attributes()->NonVisible);
            $masquerOnglet['ListZonesGeo']    =  intval($ficheFourniss->Fournisseur->ListZonesGeo->attributes()->NonVisible);

            $sessionFournisseur->setSession('modifiableOnglet', $masquerOnglet);
        }
        

        if (!isset($_SESSION['Fournisseur']['Fournisseur']['PROSPECT'])) {
            /** @phpstan-ignore-next-line */
            $_SESSION['Fournisseur']['Fournisseur']['PROSPECT'] = strval($ficheFourniss->Fournisseur->PROSPECT)==''? '0':'1';
        }
        
        if (!isset($_SESSION['Fournisseur']['Fournisseur']['GEREPORTAIL'])) {
            /** @phpstan-ignore-next-line */
            $_SESSION['Fournisseur']['Fournisseur']['GEREPORTAIL'] = strval($ficheFourniss->Fournisseur->OXALINK->GEREPORTAIL)==''? '0':'1';
        }
        
        $DroitUtilisateur = new DroitUtilisateur($this->router);
        /** @phpstan-ignore-next-line */
        if (!$DroitUtilisateur->DroitModificationFournisseurOK(strval($ficheFourniss->Fournisseur->PROSPECT))) {
            return $this->redirect('Index.Index.errorDroit');
        }

        
        //spec 4403
        /* Principe : utilisation des droit HA_FOU_VIS et HA_PRO_VIS
        *  Si pas de section déclarée « Non visible », ces droits sont utilisés comme actuellement et l’ouverture de la fiche n’est pas proposée.
        *  Si au moins une section déclarée « Non visible » existe,
        *  l’utilisateur peut ouvrir la fiche mais ne voit les sections déclarées non visibles que s’il dispose du droit correspondant au type de fournisseur.
         */
        $parametrageOnglet = $sessionFournisseur->getSessionArray('parametrageOnglet');
        if (!$parametrageOnglet) {
            if (!$DroitUtilisateur->DroitUtilisateur((array)($ficheFourniss->Fournisseur->PROSPECT)) && $DroitUtilisateur->parametrageFournisseurPresent($this->pdo)) {
                $parametrageOnglet = $DroitUtilisateur->parametrageOngletFournisseur($this->pdo);
            }
            $sessionFournisseur->setSession('parametrageOnglet', $parametrageOnglet);
        }
        
        /** Initialisation de la session avec les valeurs du XML pour les interactions  **/
        $createEditService = new CreateEditService($this->pdo, $this->getTranslationService());
        $createEditService->initValueSessionInteraction($sessionFournisseur, $ficheFourniss);

        $listeSocieteSession = $sessionFournisseur->getSessionArray('societe');
        /** **/
        
        /* DROIT INTERACTIONS */
        $droit['MotsClef']   = (string) $ficheFourniss->Fournisseur->ListMotsClef->attributes()->Modifiable;
        $droit['ImpressionCde']   = (string) $ficheFourniss->Fournisseur->ImpressionCde->attributes()->Modifiable;
        $droit['BDD']        = (string) $ficheFourniss->Fournisseur->ListBDD->attributes()->Modifiable;
        $droit['ZonesGeo']   = (string) $ficheFourniss->Fournisseur->ListZonesGeo->attributes()->Modifiable;
        $droit['SsFamille']  = (string) $ficheFourniss->Fournisseur->ListSsFamille->attributes()->Modifiable;
        $droit['TypeAchats'] = (string) $ficheFourniss->Fournisseur->ListTypeAchats->attributes()->Modifiable;
        $droit['Societe']   = (string) $ficheFourniss->Fournisseur->ListSocietes->attributes()->Modifiable;
        
        $sessionFournisseur->setSession('droitInteraction', $droit);

        $lockModifSociete = (($sessionFournisseur->getSessionArray('droitInteraction'))['Societe'] ?? '' )=='0'? true:false;
        
        /* ************************************* */

        /* trad */
        
        $trad = $this->getTranslationService();
        
        /*GENERATION DES SELECT  */
        $listeTVA = new TypeTVA($this->pdo);
        $listeTVA = $listeTVA->fetchAll();
        foreach ($listeTVA as $valTva) {
            $TVA[$valTva['CODE_TTV']] = $valTva['LIBELLE'];
        }

        $listePays = new Pays($this->pdo);
        $listePays = $listePays->fetchAll([], ['tri_LIBELLE' => 'asc']);
        
        foreach ($listePays as $valPays) {
            $CodePays[str_replace(' ', '', $valPays['CODE_PAYS'])] = $valPays['CODE_PAYS'];
            $Pays[str_replace(' ', '', $valPays['CODE_PAYS'])]=$valPays['LIBELLE'];
        }

        $listeLangues = new Langues($this->pdo);
        $listeLangues = $listeLangues->fetchAll();
        foreach ($listeLangues as $valLangue) {
            $langues[str_replace(' ', '', $valLangue['COD_LNG'])]=$valLangue['LIBELLE'];
        }
        
        $listePeriodes = new Periodes($this->pdo);
        $listePeriodes = $listePeriodes->fetchAll([], ['tri_DATE_DEB' => 'desc']);
        
        foreach ($listePeriodes as $valPeriode) {
            if ($valPeriode['DATE_DEB'] <= date('Ymd')) {
                $periodes[str_replace(' ', '', $valPeriode['CODE_PER'])]=$valPeriode['LIBELLE'];
            }
        }
        
        $tabPeriodicite = [
            '' => '',
            'M' => $trad->t('Mensuelle'),
            'T' => $trad->t('Trimestrielle'),
            'S' => $trad->t('Semestrielle'),
            'A' => $trad->t('Annuelle'),
        ];
        
        $listeZoneGeo = new ZoneGeo($this->pdo);
        $listeZoneGeo = $listeZoneGeo->listeDecoupZG();
        
        /* gestion des taxes initialisation */
        /** @phpstan-ignore-next-line */
        $PARAVRAC = Sql::parametrageTaxePays($this->pdo, ((string)$ficheFourniss->Fournisseur->Identity->CODE_PAYS)??'FR');

        $gestionFournisseur = new GestFourniss($this->pdo);
        $paramTMP = $gestionFournisseur->parametreObligatoire();
        
        $chpsObligatoire = [];
        foreach ($paramTMP as $param) {
            if ($param['CODEPARV']=='CTLCODEBIC' || $param['CODEPARV']=='CTLIBAN') {
                $explode = explode('|', $param['LIB01PARV']);
                $chpsObligatoire[$param['CODEPARV']] = $explode[0] == 'B'? true:false;
            } elseif ($param['CODEPARV'] == 'FOU_SAISIE_SIRET' || $param['CODEPARV'] == 'PRO_SAISIE_SIRET') {
                $chpsObligatoire[$param['CODEPARV']]    = $param['LIB01PARV'] == 'B' ? true:false;
            } else {
                $chpsObligatoire[$param['CODEPARV']] = $param['LIB01PARV'] == 'B'? true:false;
            }
        }

        // Contrôle de la licence Oxalink du fournisseur
        $licenceOxalink = (new LicenceOxalys($this->pdo))->hasOxalink();
        
        /*  ******************************  */

        if (!$codeFrs) {
            $codeFrs = $codeDemande;
        }
        
        
        $trad = $this->getTranslationService();
        
        Ariane::generate(1, $trad->t('Modification fournisseur'));

        if (!$_SESSION['AuthCreatFournisseur'] || !$_SESSION['AuthCreatProspect']) {
            $modifType = 'disabled';
        }
        
        return $this->renderer->render('@Fournisseur/CreationFournisseur/index', [
            'menuActive' => 'Fournisseur',
            'menuLeft' => 'GestionFournisseur',
            'modifFourniss' => true,
            'modeFournisseur' => $sessionFournisseur->getMode(),
            'id' => $codeFrs,
            'taxes' => $PARAVRAC,
            'langues' => $langues,
            'codePays' => $CodePays,
            'pays' => $Pays,
            'listePays' => $listePays,
            'listePeriode' => $periodes,
            'listeTVA' => $TVA,
            'FF' => $ficheFourniss,
            /** @phpstan-ignore-next-line */
            'modeLiv' => (new Modelivr($this->pdo))->find(strval($ficheFourniss->Fournisseur->Conditions->LIV)),
            /** @phpstan-ignore-next-line */
            'modePaie' => (new Modepaie($this->pdo))->find(strval($ficheFourniss->Fournisseur->Conditions->MODE_PAIE)),
            'gestion' => true,
            'post' => $sessionFournisseur->getSession('Fournisseur'),
            'contacts' => $sessionFournisseur->getSession('contact'),
            'adresseCompl' => $sessionFournisseur->getSession('adresseCompl'),
            'chiffreAffaire' => $sessionFournisseur->getSession('chiffreAffaire'),
            'ErreurValid' => $sessionFournisseur->getErreurValidation(),
            'ErreurXml' => $sessionFournisseur->getErreurWsdl(),
            'sendForm' => $sessionFournisseur->getSession('validation'),
            'ficheFourniss' => true,
            'modeModif' => $mode,
            'modifType' => $modifType??'',
            'modifSigner' => $modifSigner??false,
            'tabPeriodicite' => $tabPeriodicite,
            'saisie_code' => $sessionFournisseur->getSession('OXALINK') && $SaieiCode != 'A' && $mode != 'M',
            
            'listeZoneGeo' => $listeZoneGeo,
            'parametrageOnglet' => $parametrageOnglet,
            'chpsObligatoire' => $chpsObligatoire,
            'frsProspect' => $_SESSION['Fournisseur']['Fournisseur']['PROSPECT'],
            'licenceOxalink' => $licenceOxalink,
            'listeSociete' => $listeSocieteSession,
            'lockModifSociete' => $lockModifSociete,
            'modeCode' => $modeCode,
        ]);
    }
}
