<?php

namespace Modules\Fournisseur\Controller;

use Entity\Model\Modelivr;
use Entity\Model\Modepaie;
use Entity\Model\Paravrac;
use Helpers\Outil\Roles;
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\WftDemEnt;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Helpers\Fichier\Fichier;
use Helpers\Outil\Sql;
use Modules\Fournisseur\Repository\ZoneGeo;
use Modules\Fournisseur\Repository\GestFourniss;
use Helpers\Session\ParseBase1;

class ModificationFournisseurController extends Controller
{


    public function pageInit()
    {
        $session = new Session('Fournisseur');
        $session->suppresionErreurSession();
    }

    public function modificationFournisseurAction()
    {
        $post = $this->request->getParsedBody();

        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);
        $sessionFournisseur->setSession('searchImport', false);


        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 = (new ParseBase1())->getRep()->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($this->pdo, 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($this->pdo, (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))->fetchAll([], ['tri_LIBELLE' => 'asc']);
        $listPaysChoice = array_column($listePays, 'LIBELLE', 'CODE_PAYS');
        $CodePays = array_combine(array_keys($listPaysChoice), array_keys($listPaysChoice));

        $langues = (new Langues($this->pdo))->listChoice();
        $periodes = (new Periodes($this->pdo))->listChoiceActive();

        $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 (!Roles::droitsUtilisateur($this->pdo, 'HA_FOU_CRE') || !roles::droitsUtilisateur($this->pdo, 'HA_PRO_CRE')) {
            $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' => $listPaysChoice,
            '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,
        ]);
    }
}
