<?php
namespace Modules\GlobalApplication\Controller;

use API\Partenaire\Service\PartenaireService;
use Entity\Model\Paravrac;
use GuzzleHttp\Psr7\Response;
use Skeleton\Controller\Controller;
use Modules\GlobalApplication\Repository\WorkflowSignature;
use Helpers\Validator\Validator;
use Modules\GlobalApplication\Repository\Workflow;
use Modules\GlobalApplication\WebService\SignatureWF;
use Modules\Fournisseur\Outil\DroitUtilisateur;
use Helpers\Outil\Sql;
use Helpers\Ariane\Ariane;
use Helpers\Trad\Trad;
use Helpers\Session\Session;
use Helpers\Outil\Roles;
use Modules\GlobalApplication\MenuContextuel\WorkflowMenuSignatureContextuel;

class WorkflowSignatureController extends Controller
{
    

    public function getPartenaireService() :PartenaireService
    {
        return $this->contenaire->get(PartenaireService::class);
    }

    /*
     * Ecran suivi des signature
     */
    public function signatureAction()
    {
        $post = $this->request->getParsedBody();
        $module = $this->request->getAttribute('type');
        $trad = $this->getTranslationService();
        
        $session = new Session($module);
        $session->suppresionSession();

        if (!$post) {
            $post['tri_DATE'] = 'desc';
        }
        
        $listeStatut=[
            ''  => '',
            '1' => $trad->t('En signature'),
            'S' => $trad->t('Première signature'),
        ];
        $paginator = new \Helpers\Pagination\Paginator();

        /* data de la page */
        $workflow = new Workflow($this->pdo);
        $listeDemande = $workflow->getListeDemandeSignat('FOURNISS', $post);
        $countDemande = count($listeDemande);

        
        $menuContextuel = new WorkflowMenuSignatureContextuel($this->pdo, $this->router, $this->getTranslationService(), $this->contenaire->get(PartenaireService::class), 'Fournisseur');
        foreach ($listeDemande as &$demande) {
            $demande['menuContextuel'] = $menuContextuel->generate($demande, true, '', $_SESSION['Session_Login']);
        }
        
        /* Droit Création/Modif Prospect et Référencé */
        $DroitUtilisateur = new DroitUtilisateur($this->router);
        $droits['Modif_Prospect'] = $DroitUtilisateur->DroitModificationFournisseurOK($this->pdo, 1);
        $droits['Modif_Refere'] = $DroitUtilisateur->DroitModificationFournisseurOK($this->pdo, 0);
        $droits['HA_PRO_VIS'] = roles::droitsUtilisateur($this->pdo, 'HA_PRO_VIS');
        $droits['HA_FOU_VIS'] = roles::droitsUtilisateur($this->pdo, 'HA_FOU_VIS');
        
        $droits['HA_SE_AJSI'] = Roles::droitsUtilisateur($this->pdo, 'HA_SE_AJSI'); // ajouter un signataire
        $droits['HA_SE_CHSI'] = Roles::droitsUtilisateur($this->pdo, 'HA_SE_CHSI'); // changer un signataire
        $droits['HA_SE_SATT'] = Roles::droitsUtilisateur($this->pdo, 'HA_SE_SATT'); // visualiser les signataires attendu
        
        /* FOURNISSEUR */
        if ($module=='Fournisseur') {
            $menuActive='Fournisseur';
            $menuLeft='GlobalApplication.WorkflowSignature.signature';
            $AO_ACTIF = true;
            $infopagination = $paginator->generate($listeDemande, 0, $post, $this->renderer);
            Ariane::generate(0, $trad->t('Gestion'), $post, $countDemande);

            $PARAVRAC = new Paravrac($this->pdo);
            $paramCode = $PARAVRAC->find(["TYPEPARV" => 'NUM_FO_PAR', "CODEPARV" => 'MODE']);
        }
        
        $listeType = [
            'C' => $trad->t('Création'),
            'M' => $trad->t('Modification'),
        ];

        return $this->renderer->render('@GlobalApplication/Workflow/suivi', [
            'menuActive' => $menuActive,
            'menuLeft' => $menuLeft,
            'post' => $post,
            'sigSession' => $_SESSION['Session_Login'],
            'module' => $module,
            'signature' => true,
            'AO_ACTIF' => $AO_ACTIF ?? false,
            'AO_tooltip' => $trad->t('Demande de référencement sur l\'appel d\'offres N°'),
            'listeDemande' => $listeDemande,
            'listeStatut' => $listeStatut,
            'listeType' => $listeType,
            'infoPagination' => $infopagination,
            'droits' => $droits,
            'titre' => $trad->t('Signatures'),
            'paramCode' => $paramCode['LIB01PARV']??'',
        ]);
    }
    
    /**
     * @return Response|string
     */
    public function signatureWFAction()
    {
        
        $codeDemande = $this->request->getAttribute('codeDemande');
        $module      = $this->request->getAttribute('type');
        $signataire  = $this->request->getAttribute('signataire');
    
        // S => signature, R => Refuser, M => Modification signataire
        $modePOST        = $this->request->getAttribute('mode');
        $post        = $this->request->getParsedBody();
        $trad = $this->getTranslationService();
        
        $modifSigner=false;
        
        if ($modePOST=='R') {
            $texteCommentaire = $trad->t('Commentaire refus');
            $param['OBLIG_COMMENT'] = true;
        } else {
            $texteCommentaire = $trad->t('Commentaire signature');
        }
        
        $param['MDP_ACTIF'] = $this->isPasswordEnabled();
        
        if ($module=='Fournisseur') {
            $typeEntite='FOURNISS';
        }

        $session = new Session($module);

        if ($session->getSession('signa')) {
            $signataire = $session->getSession('signa');
        }

        $wfSignataire = new WorkflowSignature($this->pdo);
        $WFSigna = $wfSignataire->getListeSignataireAttendu($typeEntite, $codeDemande, true, $signataire);

        if ($post) {
            if ($modePOST=='MS') {
                $mode='S';
                $modifSigner=true;
            } else {
                $mode= $modePOST;
            }
            
            if ($mode=='S') {
                $obligatoire = 0;
            } else {
                $obligatoire = 1;
            }
                        
            $validator = $this->createValidator();
            $validator->isStringAvecEspace($texteCommentaire, $post['msg_signature'], $obligatoire, 3000);

            if ($this->isPasswordEnabled()) {
                $validator->isStringAvecEspace($trad->t('Mot de passe'), $post['MDP'] ?? '', 0);
            }
            $workflow  = new Workflow($this->pdo);
            $codeEnreg = $workflow->getInfoDemande($typeEntite, $codeDemande)['CODE_ENREG'];
            
            if (!$validator->isValid()) {
                return new Response(400, [], $validator->getError());
            }
            $array = [
                'MotdePasse'         => $post['MDP'] ?? '',
                'Mode'               => $mode,
                'TypeEntite'         => $typeEntite,
                'CodeDemande'        => $codeDemande,
                'CodeEnregistrement' => $codeEnreg,
                'Signataire'         => $WFSigna['SIGNAT']??'',
                'Comment'            => $post['msg_signature'],
                'GroupeSignataire'   => $WFSigna['GROUPE_SIG']??'',
                'choixType'          => $WFSigna['SIGNAT'] != '' ? 'S' : 'GS'
            ];
            
            $signatureWF = new SignatureWF();
            $signatureWF = $signatureWF->signatureWF($array); // TODO YANIS
            $signatureWF = new \SimpleXMLElement($signatureWF->responseData);

            if ($signatureWF->Statut=='O') {
                $session->suppresionSession();
                
                if ($mode=='S') {
                    $message = $trad->t('Le document a été validé avec succès.');
                } else {
                    $message = $trad->t('Le document a été refusé avec succès.');
                }
                
                if ($modifSigner) {
                    $trad = $this->getTranslationService();
                    return $this->renderer->render('@popup-erreur/confirmationRedirection', [
                        'message' => $message,
                        'iconePopup' => 'information',
                        'pathURL' => $this->router->generateUri('GlobalApplication.WorkflowSignature.signature', ['type' => $module]),
                    ]);
                }
                
                return $this->renderer->render('@popup-erreur/confirmationGestion', [
                    'message' => $message,
                    'iconePopup' => 'information',
                    'refresh' => true,
                    'pathValidation' => $this->router->generateUri('GlobalApplication.WorkflowSignature.confirmationSignatureWF', ['type' => $module, 'codeDemande' => $codeDemande, 'signataire' => $WFSigna['GROUPE_SIG']  == '' ? $signataire : $WFSigna['GROUPE_SIG'], 'mode' => $mode]),
                    'div_refresh' => 'suivi-demandes',
                    'form_refresh' => 'filtre_suivi',
                    'withOutPopup' => true,
                ]);
            } elseif ($signatureWF->Statut=='A' || $signatureWF->Statut=='B') {
                return $this->renderer->render('@popup-erreur/ErreurXml', [
                    'ErreurValid' => $signatureWF,
                    'pathValidation' => $this->router->generateUri('GlobalApplication.WorkflowSignature.confirmationSignatureWF', ['type' => $module, 'codeDemande' => $codeDemande, 'signataire' => $WFSigna['GROUPE_SIG']  == '' ? $signataire : $WFSigna['GROUPE_SIG'], 'mode' => $mode]),
                    'post' => serialize($post),
                ]);
            } else {
                return new Response(400, [], (string) $signatureWF->MsgErreur);
            }
        }

        if ($modePOST=='MS') {
            $mode='S';
        } else {
            $mode = $modePOST;
        }
        return $this->renderer->render('@GlobalApplication/Workflow/Popup/popupSigner', [
            'workflow'           => true,
            'codeDemande'        => $codeDemande,
            'module'             => $module,
            'post'               => $post,
            'signataire'         => $signataire,
            'mode'               => $mode??$modePOST,
            'pathSignature'      =>
                $this->router->generateUri(
                    'GlobalApplication.WorkflowSignature.signatureWF',
                    [
                        'type' => $module,
                        'codeDemande' => $codeDemande,
                        'signataire' => $signataire,
                        'mode' => $modePOST
                    ]
                ),
            'config'              => $param,
            'redirect'           => $modePOST=='MS',
            'modifSigner'        => $modePOST=='MS',
        ]);
    }
    
    // phpcs:ignore
    public function ConfirmationsignatureWFAction() : string
    {
        $codeDemande = $this->request->getAttribute('codeDemande');
        $module      = $this->request->getAttribute('type');
        $signataire  = $this->request->getAttribute('signataire');
        $mode        = $this->request->getAttribute('mode');
        //$choixType   = $this->request->getAttribute('choixType');           // S => signature, R => Refuser, M => Modification signataire
        $post        = $this->request->getParsedBody();
        
        
        $post        = unserialize($post['postArray'], ["allowed_classes" => false]);
        
        if ($module=='Fournisseur') {
            $typeEntite='FOURNISS';
        }
        
        $wfSignataire = new WorkflowSignature($this->pdo);
        $WFSigna = $wfSignataire->getListeSignataireAttendu($typeEntite, $codeDemande, true, $signataire);
       
        $array=
        [
            'MotdePasse'         => $post['MDP'],
            'Mode'               => $mode,
            'TypeEntite'         => $typeEntite,
            'CodeDemande'        => $codeDemande,
            'Comment'            => $post['msg_signature'],
            'Signataire'         => $signataire,
            'GroupeSignataire'   => $WFSigna['GROUPE_SIG'],
            'choixType'          => $WFSigna['GROUPE_SIG'] != '' ? 'GS' : 'S'
        ];
        
        $signatureWF = new SignatureWF();
        $signatureWF = $signatureWF->signatureWF($array, 'true');
        $signatureWF = new \SimpleXMLElement($signatureWF->responseData);
        $trad = $this->getTranslationService();
        
        if ($signatureWF->Statut=='O') {
            if ($mode=='S') {
                $message = $trad->t('Le document a été validé avec succès.');
            } else {
                $message = $trad->t('Le document a été refusé avec succès.');
            }
        } else {
            $message = $signatureWF->MsgErreur;
        }
        
        return $this->renderer->render('@popup-erreur/confirmationGestion', [
            'message'     => $message,
            'refresh'     => true,
            'div_refresh' => 'suivi-demandes',
            'iconePopup'  => 'information',
        ]);
    }
    
    public function signatureAttenduWFAction() : string
    {
        $module      = $this->request->getAttribute('type');
        $codeDemande = $this->request->getAttribute('codeDemande');

        if ($module=='Fournisseur') {
            $module='FOURNISS';
        }

        $repoWfSignat = new WorkflowSignature($this->pdo);
        $listeSignataire = $repoWfSignat->getListeSignataireAttendu($module, $codeDemande);
       
        $listDeleg = $repoWfSignat->getSignatDeleg(array_column($listeSignataire, 'CODE'));
            
        $mapListDelegBySignat = [];
        foreach ($listDeleg as $deleg) {
            $mapListDelegBySignat[ $deleg['SIGNAT'] ][] = $deleg;
        }
        
        return $this->renderer->render('@GlobalApplication/Workflow/Popup/signatairesAttendus', [
           'listeSignataire' => $listeSignataire,
           'mapListDelegBySignat' => $mapListDelegBySignat,
           
        ]);
    }
   
    public function ajoutSignataireWFAction() : string
    {
        $module      = $this->request->getAttribute('type');
        $codeDemande = $this->request->getAttribute('codeDemande');
        $post        = $this->request->getParsedBody();

        if ($module=='Fournisseur') {
            $type='FOURNISS';
        }

        $trad = $this->getTranslationService();
        
        $wfSignataire = new WorkflowSignature($this->pdo);
        $listeTmp = $wfSignataire->getListeSignataireAttendu($type, $codeDemande);
        
        $listeSignataireAttendu = [];
        $listeGroupAttendu = [];
        foreach ($listeTmp as $signataireAttendu) {
            if ($signataireAttendu['SIGNAT'] != '') {
                $listeSignataireAttendu[] = $signataireAttendu['SIGNAT'];
            } else {
                $listeGroupAttendu[] = $signataireAttendu['GROUPE_SIG'];
            }
        }

        if ($post) {
            $ajoutSignataire = false;
            foreach ($post as $key => $value) {
                $newSignataire = false;
                $tblKey = explode('_', $key);
                
                if (count($tblKey)==2) {
                    if ($post[$tblKey[0].'_6']=='N' && $key==$tblKey[0].'_6') {
                        $array = [];
                        
                        $array=[
                            'TYPE_ENT'     => $type,
                            'CODE_DEMANDE' => $codeDemande,
                            'DTE_MISE'     => date('Ymd'),
                            'ORDRE'        => round($post[$tblKey[0].'_0']),
                            'SIGNABLE'     => 'T',
                            'INFORME'      => $post[$tblKey[0].'_5'],
                        ];
                        
                        if ($post[$tblKey[0].'_8']=='O' && !in_array($post[$tblKey[0].'_3'], $listeGroupAttendu)) {
                            $array = array_merge($array, ['GROUPE_SIG' => $post[$tblKey[0].'_3'], 'choixType' => 'GS']);
                            $newSignataire = true;
                        } elseif ($post[$tblKey[0].'_8']!='O' && !in_array($post[$tblKey[0].'_3'], $listeSignataireAttendu)) {
                            $array = array_merge($array, ['SIGNAT' => $post[$tblKey[0].'_3'], 'choixType' => 'S']);
                            $newSignataire = true;
                        }

                        if ($newSignataire) {
                            $wfSignataire->insertSignataire($array);
                            $message = $trad->t('Vos signataires ont été ajoutés.');
                            $ajoutSignataire = true;
                        }
                    }
                }
            }

            if (!$ajoutSignataire) {
                $message = $trad->t('Aucun signataire ajouté.');
            }

            return $this->renderer->render('@popup-erreur/confirmationGestion', [
                'message'     => $message,
                'refresh'     => true,
                'iconePopup' => 'information',
                'form_refresh'=> 'filtre_suivi',
                'div_refresh' => 'suivi-demandes',
            ]);
        }
                
        $wfSignataire = new WorkflowSignature($this->pdo);
        $WFSigna = $wfSignataire->getListeSignataireAttendu($type, $codeDemande);
      
        $listeWFSigna='';

        foreach ($WFSigna as $value) {
            if ($value['WF_GS_CODE'] != '' && $value['SIGNAT'] == '') {
                $nom = $value['WF_GS_NAME'];
                $signat = $value['WF_GS_CODE'];
                $algo6 = 'O';
            } else {
                $nom = $value['NOM'];
                $signat = $value['SIGNAT'];
                $algo6 = 'N';
            }
    
            if ($listeWFSigna) {
                $listeWFSigna .= '|'.$value['ORDRE'].';;'.$value['ROLES'].';'.$signat.';'.$nom.';'.(Sql::boolSql($value['INFORME'])? 'O':'N').';N;O;'.$algo6;
            } else {
                $listeWFSigna .= $value['ORDRE'].';;'.$value['ROLES'].';'.$signat.';'.$nom.';'.(Sql::boolSql($value['INFORME'])? 'O':'N').';N;O;'.$algo6;
            }
        }

        $erreurValid['AlgoSpecif'] = $listeWFSigna;
        
        $signataires = new \Modules\Ajax\Repository\Signataires($this->pdo);
        $signataire = $signataires->signataireREF();
        $signataireGroupe = $signataires->signataireREFGroupe();

        foreach ($signataire as $key => $value) {
            $listeSignataires[$value['CODE']]=$value['NOM'];
        }

        foreach ($signataireGroupe as $key => $value) {
            $signataireGroupes[$value['WF_GS_CODE']]=$value['WF_GS_NAME'];
        }
        $listeChoix =
        [
            'S' => $trad->t('Ajouter un signataire'),
            'GS' => $trad->t('Ajouter un Groupe'),
        ];

        $droits['ajoutSignataire'] = \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_SE_AJSI');
        $droits['suppressionSignataire'] = \Helpers\Outil\Roles::droitsUtilisateur($this->pdo, 'HA_SE_SUSI');
        
        return $this->renderer->render('@popup-erreur/signataireXml', [
            'listeTypeRole'         => ['N' => $trad->t('Signataire'), 'O' => $trad->t('Informé')],
            'listeSignataire'       => $listeSignataires??[],
            'libelle_SignatGroup'   => 1,
            'listeSignataireGroupe' => $signataireGroupes??[],
            'listeChoix'            => $listeChoix,
            'pathValidation'        => $this->router->generateUri('GlobalApplication.WorkflowSignature.ajoutSignataireWF', ['type' => $module, 'codeDemande' => $codeDemande]),
            'ErreurValid'           => $erreurValid,
            'droits'                => $droits,
        ]);
    }
    
    public function changementSignataireWFAction() : string
    {
        $module      = $this->request->getAttribute('type');
        $codeDemande = $this->request->getAttribute('codeDemande');
        $codeEnreg   = $this->request->getAttribute('codeEnreg');
        $signataire  = $this->request->getAttribute('signataire');
        $post        = $this->request->getParsedBody();
        $trad = $this->getTranslationService();
        
        
        if ($module=='Fournisseur') {
            $type='FOURNISS';
        }
        $workflow = new WorkflowSignature($this->pdo);
        
        $signataires = new \Modules\Ajax\Repository\Signataires($this->pdo);

        // Liste signataire & groupe signataire
        $listeSignataire = $workflow->getListeSignataireAttendu($type, $codeDemande, true, $signataire);
        $signataireGroupe = $signataires->signataireREFGroupe();

        $signataireGroupe = array_column($signataireGroupe, 'WF_GS_NAME', 'WF_GS_CODE');
        $listeChoix =
        [
            'S' => $trad->t('Ajouter un signataire'),
            'GS' => $trad->t('Ajouter un Groupe'),
        ];
        if ($post) {
            $validator = $this->createValidator();
            
            if ($post['CODE_SIG']==$_SESSION['Session_Login'] && $post['listeChoix'] == 'S') {
                $validator->setError($trad->t('Impossible de vous déléguer une signature qui vous est déjà attribuée.'));
            }

            if ($post['listeChoix'] == 'GS') {
                $validator->zoom('WfGrpSig', $post['GROUPE_SIG'], $trad->t('Groupe Signataire'), $this->pdo, false);
            }
            if ($post['listeChoix'] == 'S') {
                $validator->zoom('HASTUTIL', $post['CODE_SIG'], $trad->t('Signataire'), $this->pdo, false, ['SIG_REF' => 'T']);
            }


            
            if ($validator->isValid()) {
                $array=
                [
                    'MotdePasse'         => $post['MDP'],
                    'Mode'               => 'M',
                    'TypeEntite'         => $type,
                    'CodeDemande'        => $codeDemande,
                    'CodeEnregistrement' => $codeEnreg=='noId'? '':$codeEnreg,
                    'Signataire'         => $listeSignataire['SIGNAT'],
                    'GroupeSignataire'   => $listeSignataire['GROUPE_SIG'],
                    'NvSignataire'       => $post['CODE_SIG'],
                    'NvGroupeSignataire' => $post['GROUPE_SIG'],
                    'choixType'          => $post['listeChoix']
                ];
                
                $signatureWF = new SignatureWF();
                $signatureWF = $signatureWF->signatureWF($array);
                $signatureWF = new \SimpleXMLElement($signatureWF->responseData);
                

                if ($signatureWF->Statut=='O') {
                    return $this->renderer->render('@popup-erreur/confirmationRedirection', [
                        'message' => $trad->t('Votre changement de signataire a bien été effectué.'),
                        'pathURL' => $this->router->generateUri('GlobalApplication.WorkflowSignature.signature', ['type' => $module]),
                        'titre'   => $trad->t('Information'),
                        'iconePopup' => 'information',
                    ]);
                } else {
                    $erreurValid = $signatureWF->MsgErreur;
                }
            } else {
                $erreurValid = $validator->getError();
            }
            
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $erreurValid,
            ]);
        }
        
        $param['MDP_ACTIF'] = $this->isPasswordEnabled();
        
        /* FOURNISSEUR */
        if ($module=='Fournisseur') {
            $menuActive='Fournisseur';
            $menuLeft='signature';
        }
        
        Ariane::generate(1, $trad->t('Changement de signataire'));
        
        return $this->renderer->render('@GlobalApplication/Workflow/changementSignataire', [
            'menuActive'            => $menuActive,
            'menuLeft'              => $menuLeft,
            'codeEnreg'             => $codeEnreg,
            'codeDemande'           => $codeDemande,
            'listeChoix'            => $listeChoix,
            'listeSignataireGroupe' => $signataireGroupe,
            'signataire'            => $listeSignataire,
            'module'                => $module,
            'post'                  => $post,
            'pathSend'              => $this->router->generateUri('GlobalApplication.WorkflowSignature.changementSignataireWF', ['type' => $module, 'codeDemande'  => $codeDemande, 'codeEnreg' => $codeEnreg, 'signataire' => $signataire]),
            'pathRetour'            => $this->router->generateUri('GlobalApplication.WorkflowSignature.signature', ['type' => $module]),
            'titre'                 => Trad::strBuild($trad->t('Changement de signataire de la demande du @1@'), $module).' '.($codeEnreg=='noId'? '':$codeEnreg),
            'champFiltre'           => "SIG_REF",
            'PARAM'                 => $param,
        ]);
    }

    private function isPasswordEnabled() :bool
    {
        return (new Paravrac($this->pdo))->getGeneric('PAS_DE_MDP_SIG') != 'O';
    }
}
