<?php

namespace Modules\Fournisseur\Controller;

use Skeleton\Controller\Controller;
use Entity\Model\DocCat;
use Entity\Model\PJTypes;
use Helpers\Fichier\Fichier;
use Entity\Model\Fourniss;
use Modules\Fournisseur\Repository\DocAtt;
use Modules\Fournisseur\Outil\DroitUtilisateur;
use Helpers\Ariane\ArianeSub;
use Helpers\Trad\Trad;
use GuzzleHttp\Psr7\Response;

class CreationDocFournisseurController extends Controller
{


    /* routing
     * /document/FOURNISSEUR/nouveau[/idDoccument/TypeDocument]
     *
     * FOURNISSEUR / code fournisseur
     *
     *  idDocument (Si on créer une nouvelle version d'un document éxistent, on récupere l'id du document en cours)
     *  Sinon on récupere l'id du document dans le parametrage
     *
     *  TypeDocument permet de savoir si le document viens du parametrage ou un document existent
     *  P -> PARAM_DICO
     *  D -> DOC_ATT
     */
    public function ajoutDocAttAction()
    {
        $idDocAtt = $this->request->getAttribute('ordre');
        $codeFrs = $this->request->getAttribute('id');
        $type = $this->request->getAttribute('type');
        $post = $this->request->getParsedBody();
        
        $trad = $this->getTranslationService();

        $fournis = new Fourniss($this->pdo);
        $fournis = $fournis->find($codeFrs);

        $docAttRepo = new DocAtt($this->pdo);
        $frsIsWF = $docAttRepo->fournissIsDemandeCreation($codeFrs);

        $demandeWithOutCode = false;
        if ($fournis) {
            $codeDemande = null;
            $libelle = $fournis["RS"];
            $codePays = $fournis["CODE_PAYS"];
            $typeObjet = 'FOURNISS';
        } else {
            $typeObjet = 'WFT_DEM_ENT';
            if ($frsIsWF) {
                $libelle = $frsIsWF['WDEN_LIBELLE_ENREG'];
                $codeDemande = $frsIsWF['CODE_DEMANDE'];
                $codePays = $docAttRepo->codePaysDemandeFrs($codeDemande)['VALEUR_CHAMP'];
            } else {
                $demandeWithOutCode = true;
                $codeDemande = $codeFrs;
                $libelle = $docAttRepo->libelleDemandeFrs($codeDemande)['VALEUR_CHAMP'];
                $codePays = $docAttRepo->codePaysDemandeFrs($codeDemande)['VALEUR_CHAMP'];
            }
        }

        // Case : update from existing Doc or Canva entry
        if ($idDocAtt) {
            $entity = $docAttRepo->listForFourniss($typeObjet, $codeFrs, [
                ($type == 'P' ?
                    'filter_egal_Canva.NUM_ORDRE' : 'filter_equal_NO_ORDRE'
                ) => $idDocAtt,
            ])[0] ?? [];
            
            $docAtt['CODE_CAT'] = $entity["CODE_CAT"] ?? '';
            $docAtt['TITRE'] = $entity["TITRE"] ?? '';
            $docAtt['CATEGORIE'] = $entity["LIBELLE_CAT"] ?? '';
            
            $lock_titre = true;
        }

        /* ******************************* */
        /* Pour chargé les menu déroulent */
        $tabDossier = [];
        $dossier = (new DocAtt($this->pdo))->getDocumentCategoriesList('FOURNISS');
        for ($i = 0; $i < count($dossier); $i++) {
            $tabDossier[$dossier[$i]["CODE_CAT"]] = $dossier[$i]["LIBELLE_CAT"];
        }

        $tabTypePj = [];
        $typePj = (new DocAtt($this->pdo))->getAttachementTypesList();
        for ($i = 0; $i < count($typePj); $i++) {
            $tabTypePj[$typePj[$i]["PJ_TYPE"]] = $typePj[$i]["PJLIBELLE"];
        }
            /* ***************************** */;

        $docAtt['AUTEUR'] = $_SESSION['Session_Login'];
        $docAtt['CENTRE'] = $_SESSION["Session_CodeCtrLivraison"];
        $docAtt['DT_PARUT'] = date('Ymd');

        if ($demandeWithOutCode) {
            $path =  $this->router->generateUri('Fournisseur.DocFournisseur.docRattache', ["id" => 'noId', 'codeDemande' => $codeDemande]);
        } elseif ($codeDemande) {
            $path =  $this->router->generateUri('Fournisseur.DocFournisseur.docRattache', ["id" => $codeFrs, 'codeDemande' => $codeDemande]);
        } else {
            $path =  $this->router->generateUri('Fournisseur.DocFournisseur.docRattache', ["id" => $codeFrs]);
        }

        if ($this->request->getMethod() == 'POST' && (isset($post['sendForm']) && $post['sendForm'] == '1')) {

            /** On verifie les champs **/
            $validator = $this->createValidator();

            $titreExistFrs = $docAttRepo->titeExistForFrs($typeObjet, $codeFrs, $post['TITRE']);

            if ($titreExistFrs && is_null($type)) {
                $validator->setError(trad::strBuild($trad->t('Le document @1@ existe déjà pour ce fournisseur.'), $post['TITRE']));
            }

            if (!$type) {
                $titreExistCanevas = $docAttRepo->titreExist($post['TITRE'], $codeFrs, $codePays);

                if ($titreExistCanevas) {
                    $validator->setError(trad::strBuild($trad->t('Le document @1@ est géré par le canevas.'), $post['TITRE']));
                }
            }

            $validator->isStringAvecEspace($trad->t("Titre"), $post['TITRE'], 1, 120);
            $validator->zoom('HASTUTIL', $post['AUTEUR'], $trad->t('Auteur'), $this->pdo);
            $validator->zoom('Centre', $post['CENTRE'], $trad->t('Centre'), $this->pdo);

            $validator->isDate($post['DT_PARUT'], '', '', true, $trad->t('de parution'));
            $validator->isDate($post['DT_VALID'], date('Ymd'), '', true, $trad->t('fin de validité'));
            $validator->isCoherenceDate($post['DT_PARUT'], $post['DT_VALID'], '', true);

            $validator->isCheck($post['NPRELANCE']);
            $validator->isCheck($post['PJ_CDE']);

            $validator->isStringAvecEspace($trad->t('commentaire'), $post['CONTMEMO'], 0, 3000);

            $file = $this->request->getUploadedFiles();

            if ($file) {
                $file_name = $file['importdocFrs']->getClientFilename();
                $fileSize = $file['importdocFrs']->getSize();
            } else {
                $file_name = null;
                $fileSize = 0;
            }


            $validator->fileCheck("file ", $file_name, [], '', $fileSize);
            $docAtt = $post;
            /** ***************** **/

            if ($validator->isValid()) {
                $newPath = Fichier::UploadDocAtt($file_name);

                $file['importdocFrs']->moveTo($newPath["racine"] . $newPath["new_name"]);

                if ($codeDemande) {
                    $code = $codeDemande;
                } else {
                    $code = $codeFrs;
                }

                $value = [
                    "langue" => $_SESSION['Session_Langue'],
                    "new_name" => $newPath["new_name"],
                    "file_name" => $file_name,
                    "typeObjet" => $typeObjet,
                    "refObjet" => $code,
                    "typePj" => $post['TYPE_PJ'],
                    "titreDoc" => $post['TITRE'],
                    "auteur" => $post['AUTEUR'],
                    "centre" => $post['CENTRE'],
                    "dateParu" => $post['DT_PARUT'],
                    "dateVali" => $post['DT_VALID'],
                    "PJCommande" => $post['PJ_CDE'],
                    "commentaire" => $post['CONTMEMO'],
                    "categorie" => $post['CODE_CAT'],
                ];

                /*On verifie que le titre saisi n'existe pas deja pour ce fournisseur */
                /* Pour l'historisation du document  */
                $docAtt = new \Modules\Fournisseur\Repository\DocAtt($this->pdo);
                $docAtt = $docAtt->docAttHisto($codeFrs, $post['TITRE']);

                $xmlResult = new \Modules\Fournisseur\WebService\DocFournisseur();

                if ($docAtt) {
                    $value["docAtt"] = $docAtt["NO_ORDRE"];
                    if ($docAtt["NOM_FIC"]) {
                        $value["histo"] = true;
                    } else {
                        $value["histo"] = false;
                    }

                    $xmlResult = $xmlResult->NouveauDocAttAvecHisto($value, $codeDemande);
                } else {
                    $xmlResult = $xmlResult->NouveauDocAtt($value, $codeDemande);
                }

                $reponseRelance = new \SimpleXMLElement($xmlResult->responseData);

                if ($reponseRelance->Statut == "O") {
                    return new Response(200, [], json_encode(['path' => $path, 'statut' => 'O']));
                } else {
                    return new Response(200, [], json_encode(['erreur' => $reponseRelance->MsgErreur, 'statut' => $reponseRelance->Statut]));
                }
            } else {
                return new Response(200, [], json_encode(['erreur' => $validator->getError(), 'statut' => 'E']));
            }
        }
        $trad = $this->getTranslationService();

        ArianeSub::generate(1, 0, $trad->t('Nouveau document'), $_SERVER['REQUEST_URI'], 1);

        return $this->renderer->render('@Fournisseur/DocFournisseur/nouveau', [
            'menuActive'          => 'Fournisseur',
            'menuLeft'            => 'GestionFournisseur',
            "code_fournisseur"    => $codeFrs,
            "libelle_fournisseur" => $libelle,
            "code"                => $codeFrs,
            "dossier"             => $tabDossier,
            "tableau_pj"          => $tabTypePj,
            "lock_titre"          => $lock_titre ?? false,
            "docAtt"              => $docAtt,
            "dateDuJours"         => date('Ymd'),
            'titre_button'        => $trad->t('Ajouter'),
            'pathEnregistrement'  => $_SERVER['REQUEST_URI'],
            
            'path'                => $path,
            'codeDemande'         => $codeDemande,
            'demandeWithOutCode'  => $demandeWithOutCode,
        ]);
    }
}
