<?php
namespace Modules\GlobalApplication\Controller;

use Entity\Model\AoEntet;
use Entity\Model\CaEntet;
use Entity\Model\DaEntet;
use Entity\Model\FactEnt;
use Entity\Model\OxaUserPanierFour;
use Entity\Model\OxaUserPanierFourDoc;
use Helpers\Log\LogSysteme;
use Helpers\Parametres\Constante;
use Skeleton\Controller\Controller;
use Entity\Model\PJTypes;
use GuzzleHttp\Psr7\Response;
use Helpers\Fichier\Fichier;
use Helpers\Outil\Sql;
use Helpers\Trad\Trad;
use Entity\Model\Fourniss;
use Modules\GlobalApplication\Repository\DocumentsRattaches;
use Helpers\Ariane\Ariane;
use Helpers\Ariane\ArianeSub;
use Entity\Model\Doa;
use Modules\Consultation\Repository\GestionConsultation;
use Modules\Consultation\Repository\AoEvent;

class ModifierDocRattachesController extends Controller
{
    
    public function editDocAttAction() : string
    {
        $id = $this->request->getAttribute('id');
        $NO_DA = $this->request->getAttribute('NO_DA');
        $ordre=$this->request->getAttribute('ordre');
        $typeAccCadre = $this->request->getAttribute('typeAccCadre');
        $post = $this->request->getParsedBody();
        $trad = $this->getTranslationService();

        if ($NO_DA=='ARTFOURN') {
            $oldId = $id;
            $explod = explode('$', $id);
            $code_fourniss =$explod[1];
            $id = $explod[0].' '.$explod[1];
        }

        if ($NO_DA == 'PANIER') {
            $oldId = $id;

            $id = str_replace(Constante::oxaPipe, '|', $id);
            
            $docAtt = (new OxaUserPanierFourDoc($this->pdo))->find([
                'ID_USER' => $_SESSION['id_user'],
                'ID_PANIER' => $_SESSION['id_panier'],
                'CRITERE_REGROUP' => $id,
                'NUM_DOC' => $ordre
            ]);

            $docAtt['DT_PARUT'] = $docAtt['DATE_PARUTION'];
            $docAtt['DT_VALID'] = $docAtt['DATE_VALIDITE'];
            $docAtt['NO_ORDRE'] = $docAtt['NUM_DOC'];
            $docAtt['TYPE_PJ']  = $docAtt['TYPE_DOC'];

            $docAtt['NOM_ORI'] = $docAtt['NOM_FIC_ORI'];
            $docAtt['CONTMEMO'] = $docAtt['COMMENTAIRE'];
        } else {
            $docAtt = new DocumentsRattaches($this->pdo);
            $docAtt = $docAtt->docAttAvecMemos($id, $ordre, $NO_DA);
            if (empty($docAtt)) {
                LogSysteme::prefixErrorLog('Invalid DOC_ATT #'.$id);
                // TOOD : render page 404
                return '';
            }
        }

        if (SQL::boolSql($docAtt["PJ_CDE"]??null)) {
            $docAtt["ajout-pj_commande"] = 1;
        }
        
        
        /* ******************************** */
        
        /** Pour chargé les menu déroulent **/
        $typePj = new PJTypes($this->pdo);
        $typePj = $typePj->fetchAll([], ['tri_PJLIBELLE']);
        $tabTypePj = [];
        for ($i = 0; $i < count($typePj); $i++) {
            $tabTypePj[$typePj[$i]["PJ_TYPE"]]=$typePj[$i]["PJLIBELLE"];
        }
        /* ************************** */
         
        
        if ($NO_DA == 'PANIER') {
            return $this->renderer->render('@Panier/Panier/tab_frs/_add_doccAtt', [
                'modifDoc' => true,
                'pathEnregistrement' => $this->router->generateUri('GlobalApplication.ModifierDocRattaches.enregistrementEditDocAtt', [
                        'id' => $oldId ?? $id,
                        'NO_DA' => $NO_DA
                    ]),
                'dateDuJour' => \Helpers\Outil\Date::dateConverte(date("Ymd")),
                'tableau_pj' => $tabTypePj,
                'NO_DA' => $NO_DA,
                'id' => $oldId ?? $id,
                'docAtt' => $docAtt,
                'nouveauDoc' => false,
            ]);
        } elseif ($NO_DA=='FAC_ENT') {
            $menuActif = 'Facture';
            $menuLeft = 'GestionFacture';
            $titre = Trad::strBuild($trad->t('Modification du document rattaché de la facture @1@ : @2@'), $id, $docAtt['TITRE']);
            \Helpers\Ariane\Ariane::generate(4, $trad->t('Modification document rattaché'));
            $filterSociete = (new FactEnt($this->pdo))->find($id)['CODE_STE'];
        } elseif ($NO_DA=='ACD') {
            if ($typeAccCadre=='fournisseur') {
                ArianeSub::generate(3, 0, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
                
                $titreh1 = 'Fournisseur';
                $menuActif = 'Fournisseur';
                $menuLeft = 'GestionFournisseur';
            } elseif ($typeAccCadre=='groupement') {
                ArianeSub::generate(3, 0, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
                
                $titreh1 = 'Groupement';
                $menuActif = 'Fournisseur';
                $menuLeft = 'GestionGroupement';
            } elseif ($typeAccCadre=='marches') {
                $titreh1 = 'Marchés';
                $menuActif = 'Contrats';
                $menuLeft = 'Contrat.marche.index';
                
                \Helpers\Ariane\Ariane::generate(3, $trad->t('Modification document rattaché'));
            } else {
                $titreh1 = 'Accord-cadre';
                $menuActif = 'Contrats';
                $menuLeft = 'Contrat.accord-cadre.index';
                
                \Helpers\Ariane\Ariane::generate(3, $trad->t('Modification document rattaché'));
            }

            $titre = Trad::strBuild($trad->t('Modification du document rattaché de l\'accord-cadre @1@ : @2@'), $id, $docAtt['TITRE']);
        } elseif ($NO_DA=='MARCHES') {
            $menuActif = 'Contrats';
            $menuLeft = 'Contrat.marche.index';
            $titre = $trad->t("Documents rattachés du marché") . ' '.$id;
            $titre = Trad::strBuild($trad->t('Modification du document rattaché du marché @1@ : @2@'), $id, $docAtt['TITRE']);

            \Helpers\Ariane\Ariane::generate(4, $trad->t('Modification document rattaché'));
        } elseif ($NO_DA=='GRPFOU') {
            $menuActif = 'Fournisseur';
            $menuLeft = 'GestionGroupement';
            $layout ='@layoutFournisseur/groupement.twig';
            $MODULE = 'Groupement';
            ArianeSub::generate(3, 0, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
        } elseif ($NO_DA=='CA_ENTET') {
            $menuActif = 'CollecteBesoins';
            $menuLeft = 'Commande.GestionCommande.index';
            $subArianeActive = true;
            $MODULE = 'Commande';
            $titre = Trad::strBuild(
                $trad->t('Modification du document rattaché de la commande @1@ : @2@'),
                intval($id)/* format CODE_ENR which is lpadded with 0 */,
                $docAtt['TITRE']
            );
            ArianeSub::generate(1, 0, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
            $filterSociete = (new CaEntet($this->pdo))->find($id)['CODE_STE'];
        } elseif ($NO_DA=='ARTFOURN') {
            $menuActif = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
            $fournis = new Fourniss($this->pdo);
            $fournis = $fournis->find($code_fourniss);
            $MODULE = 'Fournisseur';
            
            ArianeSub::generate(3, 0, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
        } elseif ($NO_DA=='ARTGF') {
            $menuActif = 'Fournisseur';
            $menuLeft = 'GestionFournisseur';
            $MODULE = 'Groupement';
            $titreh1 = $trad->t('Groupement');
            
            ArianeSub::generate(3, 0, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
        } elseif ($NO_DA=='DA_ENTET') {
            if ($typeAccCadre=='GestionDemandeAchat') {
                Ariane::generate(2, $trad->t('Modification document rattaché'), $post);
            } else {
                ArianeSub::generate(0, 6, $trad->t('Modification document rattaché'), $_SERVER['REQUEST_URI'], 1);
                $subArianeActive = true;
            }

            switch ($typeAccCadre) {
                case 'ListeDA':
                    $titreh1 = 'Liste DA';
                    break;
                case 'DelegationSignatureDA':
                    $titreh1 = $trad->t("Délégations des signatures");
                    break;
                case 'SignatureDA':
                    $hastutil = new \Entity\Model\Hastutil($this->pdo);
                    $titreh1 = Trad::strBuild($trad->t("Liste des DA actuellement à signer pour @1@ (@2@)"), $hastutil->find($_SESSION['Session_Login'])['NOM'], $_SESSION['Session_Login']);
                    break;
                default:
                    $titreh1 = 'Demandes d\'achat';
                    break;
            }

            $titre = Trad::strBuild($trad->t('Modification du document rattaché de la demande d\'achat @1@ : @2@'), $id, $docAtt['TITRE']);
            $menuActif = 'CollecteBesoins';
            $menuLeft = 'GestionDemandeAchat';
            $MODULE = $typeAccCadre;
            $filterSociete = (new DaEntet($this->pdo))->find($id)['CODE_STE'];
        } elseif ($NO_DA=='FAMILLE') {
            $Famille = new \Entity\Model\Famille($this->pdo);
            $Famille = $Famille->find($id);
            
            $menuActif = 'Parametrage';
            $menuLeft = 'Tables';
            $MODULE = 'TablesFamille';
            $titreh1 = $trad->t('Tables');
            $titre = Trad::strBuild($trad->t('Modification du document rattaché à la famille @1@ (@2@) : @3@'), $Famille['DESIGNAT'], $id, $docAtt['TITRE']);
            \Helpers\Ariane\Ariane::generate(4, $trad->t('Modification document rattaché'));
        } elseif ($NO_DA=='SSFAMILL') {
            $SousFamille = new \Entity\Model\SousFamille($this->pdo);
            $SousFamille = $SousFamille->find($id);
            
            $menuActif = 'Parametrage';
            $menuLeft = 'Tables';
            $MODULE = 'TablesSousFamille';
            $titreh1 = $trad->t('Tables');
            $titre = Trad::strBuild($trad->t('Modification du document rattaché à la sous famille @1@ (@2@) : @3@'), $SousFamille['DESIGNAT'], $id, $docAtt['TITRE']);
            \Helpers\Ariane\Ariane::generate(4, $trad->t('Modification document rattaché'));
        } elseif ($NO_DA=='DOA') {
            $menuActif = '';
            $menuLeft = '';
        } elseif ($NO_DA=='AO_ENTET') {
            $titreh1 = $trad->t('Consultations');
            
            if ($typeAccCadre=='ACC_CONF') {
                $titre = $trad->t('Modification de l\'Accord de confidentialité');
                \Helpers\Ariane\Ariane::generate(2, $trad->t('Modification document interne'));
                
                $docAtt['TITRE'] = $trad->t('Accord de confidentialité');
                $pathBack = ariane::getBackPath();
            } else {
                $idAo = ltrim($id, '0');
                $pathBack = $this->router->generateUri('Consultation.Consultation.details', ['idAO' => $idAo, 'onglet' => 'DocInt']);
                $gestionConsu = new GestionConsultation($this->pdo);
                $consultation = $gestionConsu->getInfoAo($id);
                
                $aoEvent = new AoEvent($this->pdo);
                $AOEventCreat = $aoEvent->getNameCreate($id);
                
                ArianeSub::generate(1, 0, $trad->t('Modification document interne'), $_SERVER['REQUEST_URI'], 1);
            }
            
            $menuActif = $_SESSION['typeMenu'] == 'P2P'? 'eproc':'Consultations';
            $menuLeft = 'gestionAO';
            $filterSociete = (new AoEntet($this->pdo))->find($id)['CODE_STE'];
        }
        
        // \Helpers\Ariane\Ariane::generate(4, $trad->t('Modification document rattaché'));

        return $this->renderer->render('@GlobalApplication/documents-rattaches/nouveau', [
            'menuActive' => $menuActif ?? '',
            'menuLeft' => $menuLeft ?? '',
            'id' => $oldId ?? $id,
            'code_fournisseur' => $code_fourniss ?? '',
            'NO_DA' => $NO_DA,
            'titreOnglet' => $trad->t('Modification document rattaché'),
            'titre' => $titre ?? '',
            'code' => $id,
            'tableau_pj' => $tabTypePj,
            'ordre' => $ordre,
            'docAtt' => $docAtt,
            'modifDoc' => true,
            'layout' => $layout ?? 'layout.twig',
            'MODULE' => $MODULE ?? '',
            'post' => $post,
            'pathEnregistrement' => $this->router->generateUri('GlobalApplication.ModifierDocRattaches.enregistrementEditDocAtt', ['id' => $oldId ?? $id, 'NO_DA' => $NO_DA]),
            'TITREH1' => $titreh1 ?? '',
            'typeAccCadre' => $typeAccCadre,
            'subArianeActive' => $subArianeActive??false,
            'consultation' => $consultation??'',
            'AOEventCreat ' => $AOEventCreat??'',
            'pathBack' => $pathBack??'',
            'filterSociete' => $filterSociete ?? null,
        ]);
    }
    
    public function enregistrementEditDocAttAction()
    {

        $post = $this->request->getParsedBody();
        $id = $this->request->getAttribute('id');
        $NO_DA = $this->request->getAttribute('NO_DA');
        $trad = $this->getTranslationService();
        
        /** On verifie les champs **/
        $validator = $this->createValidator();
        // Détailk sur l'accord-cadre en question
        if ($NO_DA=='ACD') {
            $accCadreEntity    = new \Entity\Model\Acccadre($this->pdo);
            $accCadreValueDetail = $accCadreEntity->find($id);
        }

        // Validator
        $validator->isStringAvecEspace("Titre", $post['ajout-titre'], 1, 60);
        $validator->zoom('HASTUTIL', $post['ajout-auteur'], 'Auteur', $this->pdo, false);
        $validator->zoom('Centre', $post['ajout-centre'], 'Centre', $this->pdo, true); // TODO : add filter CODE_STE
        // Date de début
        
        if ($post['ajout-dt_paru']) {
            $validator->isDate($post['ajout-dt_paru'], ($accCadreValueDetail['DATE_DEB']??''), '', true, 'de parution');
        }
        // Date de fin
        if ($post['ajout-dt_vali']) {
            $validator->isDate($post['ajout-dt_vali'], ($accCadreValueDetail['DATE_FIN']??''), '', true, 'fin de validité');
        }
        
        if ($post['ajout-dt_vali'] != '') {
            $validator->isTrue($post['ajout-dt_paru']>$post['ajout-dt_vali'], $trad->t('La date de parution ne peut pas être supérieur à la date de fin de validité.'));
        }
        
        $validator->isCheck($post['ajout-pj_commande']);
        $validator->isStringAvecEspace('Commentaire', $post['ajout-com'], 0, 3000);
        
        $file = $this->request->getUploadedFiles();
        if ($file) {
            $file_name = $file['importdocGlobal']->getClientFilename();
            $validator->fileCheck("", $file_name, [], '', $file['importdocGlobal']->getSize());
        }
        
        $docAtt['TITRE']=$post["ajout-titre"];
        $docAtt['AUTEUR']=$post["ajout-auteur"];
        $docAtt['CENTRE']=$post["ajout-centre"];
        $docAtt['TYPE_PJ']=$post["ajout-pj"];
        $docAtt["DT_PARUT"] = $post["ajout-dt_paru"];
        $docAtt["DT_VALID"] = $post["ajout-dt_vali"];
        if ($post["ajout-pj_commande"]) {
            $docAtt["PJ_CDE"] = 1;
        }
        $docAtt["CONTMEMO"] = $post["ajout-com"];
        /** ***************** **/
        
        if ($validator->isValid()) {
            if ($file && isset($file_name)) {
                $newPath = Fichier::UploadDocAtt($file_name);
                $file['importdocGlobal']->moveTo($newPath["racine"].$newPath["new_name"]);
            }
            
            if ($NO_DA == 'PANIER') {
                $idBlocfrs = str_replace(Constante::oxaPipe, '|', $id);
                $infoBlocFrs = (new OxaUserPanierFour($this->pdo))->find(['CRITERE_REGROUP' => $idBlocfrs]);
                (new OxaUserPanierFourDoc($this->pdo))->update([
                    'TYPE_DOC'          => $post['ajout-pj'],
                    'DATE_PARUTION'     => $post['ajout-dt_paru'],
                    'DATE_VALIDITE'     => $post['ajout-dt_vali'],
                    'AUTEUR'            => $post['ajout-auteur'],
                    'CENTRE'            => $post['ajout-centre'],
                    'COMMENTAIRE'       => $post['ajout-com'],
                ], [
                    'ID_USER'           => $_SESSION['id_user'],
                    'ID_PANIER'         => $_SESSION['id_panier'],
                    'COD_FOURN'         => $infoBlocFrs['COD_FOURN'],
                    'CRITERE_REGROUP'   => $infoBlocFrs['CRITERE_REGROUP'],
                    'NUM_DOC'           => $post['ajout-ordre']
                ]);

                return new Response(200, [], (string)json_encode(['statut' => 'O']));
            }

            if ($NO_DA=='ARTFOURN') {
                $explod = explode('$', $id);
                $id = $explod[0].$explod[1];
                
                $docAtt = new DocumentsRattaches($this->pdo);
                $docAtt = $docAtt->getDocRattaches($NO_DA, $id);
                if (empty($docAtt)) {
                    LogSysteme::prefixErrorLog('Invalid #'.$NO_DA. '-'. $id);
                    return $this->createJsonResponse([
                        'erreur' => 'Server error',
                        'statut' => 'E',
                    ]);
                }
                $refObjet = $docAtt['COD_ENR'];
            } else {
                $refObjet = $id;
            }
            
            $xmlResult = new \Modules\GlobalApplication\WebService\DocRattaches();
            $xmlResult = $xmlResult->ModificationDocAtt([
                'langue' => $_SESSION['Session_Langue'],
                'new_name' => $newPath['new_name'] ?? '',
                'file_name' => $file_name ?? '',
                'typeObjet' => $post['NO_DA'],
                'refObjet' => $refObjet,
                'typePj' => $post['ajout-pj'],
                'titreDoc' => $post['ajout-titre'],
                'auteur' => $post['ajout-auteur'],
                'centre' => $post['ajout-centre'],
                'dateParu' => $post['ajout-dt_paru'],
                'dateVali' => $post['ajout-dt_vali'],
                'PJCommande' => $post['ajout-pj_commande'],
                'commentaire' => $post['ajout-com'],
                'numOrdre' => $post['ajout-ordre'],
            ]);
            
            $reponseRelance = new \SimpleXMLElement($xmlResult->responseData);
            
            if ($reponseRelance->Statut=="O") {
                //TODO A modifier avec fil d'ariane
                if ($NO_DA=='FAC_ENT') {
                    $path = $this->router->generateUri('Facture.DocumentsRattaches.docRattache', ["numFact" => $id]);
                }
                if ($NO_DA=='ACD') {
                    $path = $this->router->generateUri('Contrat.accord-cadre.docRattache', ["id" => $id]);
                }
                if ($NO_DA=='MARCHES') {
                    $path = $this->router->generateUri('Contrat.marche.docRattache', ["id" => $id]);
                }
                if ($NO_DA=='GRPFOU') {
                    $path = $this->router->generateUri('GlobalApplication.DocumentRattaches.document', ['MODULE' => 'Groupement',"id" => $id]);
                }
                if ($NO_DA=='ARTFOURN') {
                    $path = $this->router->generateUri('Fournisseur.DocumentArticles.documentArticlesFournisseur', ['MODULE' => 'Fournisseur', "id" => $explod[0].'$'.$explod[1]]);
                }
                if ($NO_DA=='CA_ENTET') {
                    $path = $this->router->generateUri('GlobalApplication.DocumentRattaches.document', ['MODULE' => 'Commande', 'id' => $id]);
                }
                if ($NO_DA=='DA_ENTET') {
                    $path = $this->router->generateUri('GlobalApplication.DocumentRattaches.document', ['MODULE' => $post['MODULE'], 'id' => $id]);
                }
                if ($NO_DA=='FAMILLE') {
                    $path = $this->router->generateUri('GlobalApplication.DocumentRattaches.document', ['MODULE' => 'TablesFamille', 'id' => $id]);
                }
                if ($NO_DA=='AO_ENTET') {
                    $path = $this->router->generateUri('Consultation.Consultation.details', ['idAO' => ltrim($id, '0'), 'onglet' => 'DocInt']);
                }
                if ($NO_DA=='DOA') {
                    $doaEntity = new Doa($this->pdo);
                    $doa = $doaEntity->find((int) $id);
                    
                    $path = $this->router->generateUri('ProjetAchat.ModeleProjet.details', ['typeObjet' => (Sql::toBool($doa['MODELE']) ? 'M':'D'), 'idObjet' => $doa['ID']]);
                    $post =  ['onglet' => 'document'];
                }
                
                return new Response(200, [
                    
                ], json_encode(['path' => $path, 'statut' => 'O', 'post' => $post]));
            } else {
                return new Response(200, [
                    
                ], json_encode(['erreur' => $reponseRelance->MsgErreur, 'statut' => $reponseRelance->Statut]));
            }
        }
        
        return new Response(200, [
            
        ], json_encode(['erreur' => $validator->getError(), 'statut' => 'E']));
    }
}
