<?php

namespace Modules\Suivi\MenuContextuel;

use Entity\Model\Paravrac;
use Helpers\Additional\Specifique\Specifique;
use Helpers\Outil\MenuContextuel;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Helpers\Trad\ITrad;
use Helpers\User\User;
use Modules\GlobalApplication\Repository\LicenceOxalys;
use Modules\Suivi\Repository\SuiviCdeRepo;
use Skeleton\Router;

class SuiviCdeContextuel extends MenuContextuel
{
    /**
     * @var array<mixed> droit
     */
    public $droit;

    /**
     * Summary of license
     * @var array<mixed>
     */
    private array $license;
    private Specifique $specifique;

    public function __construct(\PDO $pdo, Router $router, ITrad $trad)
    {
        parent::__construct($pdo, $router, $trad);
        $this->specifique = new Specifique();
        $paravrac = new Paravrac($pdo);
        $resultat = $paravrac->findAll([
            'TYPEPARV' => 'PARCDESOC',
        ]);
        $parCdeSoc = [];
        foreach ($resultat as $param) {
            $parCdeSoc[$param['CODEPARV']] = $param['LIB01PARV']=='O'? true:false;
        }

        $param = Sql::paravrac($this->pdo, 'OXAPROC', 'SUIVI_BUDGET');
        if ($param) {
            $param = explode('|', $param);
        } else {
            $param = [];
        }
        
        $this->droit = [
            'HA_CA_VIPX'        => Roles::droitsUtilisateur($this->pdo, 'HA_CA_VIPX'),
            'HA_CA_IMPN'        => Roles::droitsUtilisateur($this->pdo, 'HA_CA_IMPN'),
            'HA_CA_IMP'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_IMP'),
            'HA_BR_PX'          => Roles::droitsUtilisateur($this->pdo, 'HA_BR_PX'),
            'HA_CA_SFM'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_SFM'),
            'HA_CA_DFM'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_DFM'),
            'HA_CA_ANN'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_ANN'),
            'HA_CA_REIM'        => Roles::droitsUtilisateur($this->pdo, 'HA_CA_REIM'),
            'HA_CA_REIS'        => Roles::droitsUtilisateur($this->pdo, 'HA_CA_REIS'),
            'HA_CA_CMV'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_CMV'),
            'HA_CA_SUP'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_SUP'),
            'HA_CA_CRA'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_CRA'),
            'HA_CA_DSM'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_DSM'),
            'HA_CA_IMIN'        => Roles::droitsUtilisateur($this->pdo, 'HA_CA_IMIN'),
            'HA_CA_DEV'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_DEV'),
            'HA_BR_CM'          => Roles::droitsUtilisateur($this->pdo, 'HA_BR_CM'),

            'HA_CA_SPM'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_SPM'),
            'HA_CA_DPM'         => Roles::droitsUtilisateur($this->pdo, 'HA_CA_DPM'),
            'HA_SE_SATT'        => Roles::droitsUtilisateur($this->pdo, 'HA_SE_SATT'),

            'ConsoBudgetSign'   => $param[1]=='O'? true:false,
            'LOCKSTE'           => $parCdeSoc,
            'isNoteFourActive'  => (new LicenceOxalys($this->pdo))->noteFourActive(),
        ];

        $this->license = [
            'TermPaie' => (new LicenceOxalys($this->pdo))->termPaieActive()
        ];
    }

    /**
     * @param array<mixed> $commande
     * @return array<mixed>
     */
    public function generateNotation(string $mode, $commande)
    {
        $suiviCde = new SuiviCdeRepo($this->pdo, $this->router, $this->trad);

        $commandeId = $commande['NO_CDE'];
        $libCommande = $commandeId;
        if ($commande['AVENANT']) {
            $libCommande .= ' - '.$commande['AVENANT'];
        }


        $menuContextuel = [];

        if ($this->droit['isNoteFourActive'] && Roles::droitsUtilisateur($this->pdo, 'HA_NOT_NM')) {
            if ($mode == 'CdeToRate') {
                // Case : Notation is NOT active (ever) for this commande
                if (empty($commande['Notation_NO_CDE'])) {
                    // Popup activation notation
                    $menuContextuel['listeSecondaire'][] = [
                        'libelle' => $this->trad->t('Noter le fournisseur'),
                        'lienJs' => 'ajaxJsonPopup('
                            .json_encode($this->router->generateUri(
                                'Commande.Notation.popupConfirmActivate',
                                ['commandeId' => $commandeId]
                            ))
                            .')',
                    ];
                // Case : Notation is Active for this commande and has an on going manual notation
                } elseif ($suiviCde->notationActif($commandeId)['countActiveNotation'] != 0) {
                    // Case : Commande has a currently active notation
                    // Form notation
                    $menuContextuel['listeSecondaire'][] = [
                        'libelle'   => $this->trad->t('Noter le fournisseur'),
                        'lien'      => $this->router->generateUri('Commande.Notation.formCreate', ['commandeId' => $commandeId]),
                    ];
                }
            }

            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Visualisation notation commande'),
                'lien'      => $this->router->generateUri('Commande.Notation.detail', ['commandeId' => $commandeId]),
            ];
        }

        return $menuContextuel;
    }

    /**
     * @param array<mixed> $doc
     * @return array<mixed>
     */
    public function generate($doc, string $divRefresh, string $pathRefresh)
    {
        $commandeId = $doc['NO_CDE'];
        $libCommande = $commandeId;
        if ($doc['AVENANT']) {
            $libCommande .= ' - '.$doc['AVENANT'];
        }


        $menuContextuel['listePrincipal'][] = [
            'icone'     => 'pictoList',
            'libelle'   => $this->trad->t('Suivi des événements'),
            'lien'      => $this->router->generateUri('Commande.Workflow.summary', ['commandeId' => $commandeId]),
            //'lien' => $this->router->generateUri('Commande.Event.suivi', ['idCommande' => $commandeId]),
        ];

        $creationBROk = false;
        if (($doc['ETAT_CDE'] == 'L' || $doc['ETAT_CDE'] == 'E') && Roles::droitsUtilisateur($this->pdo, 'HA_BR_CM')) {
            if ($_SESSION['BR_UniqSesDemandes']) {
                if ($doc['ACH'] == $_SESSION['Session_Login']) {
                    $creationBROk = true;
                } else {
                    if ($doc['nbDARattachees'] > 0) {
                        $creationBROk = true;
                    }
                }
            } else {
                $creationBROk = true;
            }
        }
        
        if ($creationBROk) {
            $menuContextuel['listePrincipal'][] = [
                'icone'     => 'pictocreate',
                'libelle'   => $this->trad->t('Créer un bon de réception'),
                'lien'      => $this->router->generateUri('Reception.CreationBR.creatEdit', ['order' => $commandeId, 'type' => 'R', 'mode' => 'C', 'init' => '1'])
            ];
        }

        $menuContextuel[$creationBROk? 'listeSecondaire':'listePrincipal'][] = [
            'icone'     => 'pictoDoc',
            'libelle'   => $this->trad->t('Documents rattachés'),
            'lien'      => $this->router->generateUri('GlobalApplication.DocumentRattaches.document', ['MODULE' => 'Commande', 'id' => $commandeId]),
        ];

        if (($doc['ETAT_CDE'] == 'E' || $doc['ETAT_CDE'] == 'S' || $doc['ETAT_CDE'] == 'Z' )) {
            if ($_SESSION["Session_Login"] == 'OXAUSER' ||
                (
                    $doc['ETAT_CDE'] == 'E'
                    && ($this->droit['HA_CA_REIM'] || sql::boolSql($doc['TYDO_IND_IMPR_PAR_DEM']))
                    && ($doc['DEMANDEUR'] == $_SESSION["Session_Login"] || $doc['ACH'] == $_SESSION["Session_Login"])
                )
                ||
                (
                    $doc['ETAT_CDE'] == 'S'
                    && ($this->droit['HA_CA_REIS'] || sql::boolSql($doc['TYDO_IND_IMPR_PAR_DEM']))
                    && ($doc['DEMANDEUR'] == $_SESSION["Session_Login"]  || $doc['ACH'] == $_SESSION["Session_Login"])
                )
                ||
                $doc['droitReimp'] == $_SESSION["Session_Login"] // spec 3103
            ) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle'   => $this->trad->t('Réimprimer'),
                    'lienJs'    => $this->ajaxPopup(
                        $this->router->generateUri('Commande.Commande.popupImpression', ['idCommande' => $commandeId, 'routage' => 'envoyer']),
                        $this->trad->t('Routage de la commande N°')." ".$libCommande
                    ),
                ];
            } elseif ($doc['ETAT_CDE'] == 'Z'
                && ($this->droit['HA_CA_REIM'])
                && ($doc['DEMANDEUR'] == $_SESSION["Session_Login"]  || $doc['ACH'] == $_SESSION["Session_Login"])
            ) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle'   => $this->trad->t('Envoyer'),
                    'lienJs'    => $this->ajaxPopup(
                        $this->router->generateUri('Commande.Commande.popupImpression', ['idCommande' => $commandeId, 'routage' => 'envoyer']),
                        $this->trad->t('Routage de la commande N°')." ".$libCommande
                    ),
                ];
            }
        }
      
        if ($this->droit['HA_CA_CMV'] && $this->droit['HA_CA_VIPX'] && $_SESSION['STATUT_RECH_ART'] == 1) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Dupliquer'),
                'lienJs'    => $this->ajaxPopupV2(
                    $this->router->generateUri('Suivi.Suivi.popChargeDocToPanier', ['typeDoc' => 'CDE', 'idDoc' => $commandeId, 'action' => 'duplication']),
                    'filtre_suivi',
                ),
            ];
        }

        if ($this->droit['HA_CA_VIPX'] && ($this->droit['HA_CA_IMP'] || $this->droit['HA_CA_IMIN'])) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Commande chiffrée'),
                'lien'      => $this->router->generateUri('Commande.GestionCommande.impressionPDF', ['idCommande' => $commandeId, 'mode' => 'chiffree']),
                'target'    => '_blank',
            ];
        }

        if (($this->droit['HA_CA_IMP'] || $this->droit['HA_CA_IMPN'])) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Commande non chiffrée'),
                'lien'      => $this->router->generateUri('Commande.GestionCommande.impressionPDF', ['idCommande' => $commandeId, 'mode' => 'nonchiffree']),
                'target'    => '_blank',
            ];
        }

        $menuContextuel['listeSecondaire'][] = [
            'libelle'   => $this->trad->t('Commentaires autres signataires'),
            'lien'      => $this->router->generateUri('Commande.Event.suivi', ['idCommande' => $commandeId, 'MODULE' => 'signataire']),
        ];


        if (($doc['ETAT_CDE'] == 'E' || $doc['ETAT_CDE'] == 'S')) {
            if ($doc['ETAT_CDE'] == 'E' && $this->droit['HA_CA_SPM'] || $doc['ETAT_CDE'] == 'S' && $this->droit['HA_CA_DPM']) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle'   => $this->trad->t('(Dé)solder physiquement'),
                    'lien'      => $this->router->generateUri('Commande.solderCommande.physiquement', ['idCommande' => $commandeId]),
                ];
            }

            if (($this->droit['HA_CA_SFM'] && $doc['DTE_VALID'] != '00000000' && $doc['ETAT_CDE'] != 'Z'  && $doc['ETAT_FIN'] != 'F')
                ||
                ($this->droit['HA_CA_DFM']&& ($doc['ETAT_CDE'] == 'Z' || $doc['ETAT_FIN'] == 'F' && $doc['DTE_VALID'] != '00000000'))) {
                $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('(Dé)solder financièrement'),
                'lien'      => $this->router->generateUri('Commande.Commande.soldeFinancierLigne', ['idCommande' => $commandeId]),
                ];
            }
        }

        if ($this->droit['HA_SE_SATT']
            /* Commande en signature */
            && $doc['ETAT_CDE'] == 'V'
            && Sql::toBool($doc['SIGNEE']) == false
            && Sql::toBool($doc['REFUSEE']) == false
        ) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle' => $this->trad->t('Signataires attendus'),
                'lienJs' => $this->ajaxPopup(
                    $this->router->generateUri(
                        'Signature.SignatureCde.signatureAttendu',
                        ['idDoc' => $commandeId]
                    ),
                    $this->trad->t('Signataires attendus pour la commande N°').' '.$commandeId
                ),
            ];
        }

        if ($doc['ETAT_CDE'] == 'A' && $this->droit['HA_CA_SUP']) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Supprimer'),
                'lienJs'   => $this->confirmationSuivi(
                    $this->router->generateUri('Commande.ajaxGestionCommande.suppresionCommande', ['idCommande' => $commandeId]),
                    $pathRefresh,
                    $this->trad->t('Etes-vous sûr de vouloir supprimer la commande')." ".$libCommande." ?",
                    $divRefresh,
                    'filtre_suivi'
                ),
            ];
        }

        if ($this->droit['HA_CA_DEV'] && $doc['ETAT_CDE'] == 'V' && $doc['nbBrCde'] == '' && $doc['FAC_EXITS'] == '' && $doc['FAC_LIG_EXISTS'] == '') {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Dévalider'),
                'lienJs'   => $this->confirmationSuivi(
                    $this->router->generateUri('Commande.ajaxGestionCommande.devaliderCommande', ['idCommande' => $commandeId]),
                    $pathRefresh,
                    $this->trad->t('Etes-vous sûr de vouloir dévalider la commande')." ".$libCommande." ?",
                    $divRefresh,
                    'filtre_suivi'
                ),
            ];
        }

        if ($doc['ETAT_CDE'] == 'E' && $this->droit['HA_CA_CRA'] && $doc['DTE_VALID'] != '00000000'
            && ($doc['BR_EXIST'] == '' || !($this->droit['LOCKSTE'][$doc['CODE_STE']]??false))) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Créer un avenant'),
                'lienJs'    => $this->ajaxPopupV2(
                    $this->router->generateUri('Suivi.Suivi.popChargeDocToPanier', ['typeDoc' => 'CDE', 'idDoc' => $commandeId, 'action' => 'CreationAvenant']),
                    'filtre_suivi',
                ),
            ];
        }

        if ($doc['AVENANT'] != '') {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Visualiser l\'historique'),
                'lienJs'    => "redirectJSWithPost( '".($this->router->generateUri('Commande.Liste.listeEnteteHistorisees'))."' , { 'filter_NO_CDE' : '".($commandeId)."' });",
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'HA_CA_DPR') && $doc['ETAT_CDE']== 'E' && $doc['DTE_VALID'] != '00000000') {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Planning prévisionnel'),
                'lien'      => $this->router->generateUri('Commande.Planning.formUpdate', ['commandeId' => $commandeId]),
            ];
        }


        if ($doc['blocNote']) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Afficher la note de la commande'),
                'lien'      => false,
                'lienJs'    => $this->ajaxPopup(
                    $this->router->generateUri('Commande.GestionCommande.blocNote', ['idCommande' => $commandeId]),
                    $this->trad->t('Bloc Note')
                ),
            ];
        }

        /**
         * (Si il existe un spécifique, et qu'il retourne vrai) OU (qu'il n'existe pas de spécifique) ET (etat E, pas de br, pas de factures)
         */
        if ($this->droit['HA_CA_ANN'] && $doc['ETAT_CDE'] == 'E' && ($doc['BR_EXIST'] == '' && $doc['FAC_EXITS'] == '' && $doc['FAC_LIG_EXISTS'] == '' )
        ) {
            $result = [];
            $namespaceSpecifique =  $this->specifique->specifiqueFunction('\\Modules\\Suivi\\Service\\SpecSuiviService');
            $specifiqueExist = false;
            if (class_exists($namespaceSpecifique)) {
                $specifiqueExist = true;
                $result = \Helpers\Additional\Specifique\Specifique::specifique('\\Modules\\Suivi\\Service\\SpecSuiviService', 'etatSapCDE', $this->pdo, $commandeId);
            }

            if (($specifiqueExist && $result) || (!$specifiqueExist)) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle'   => $this->trad->t('Annuler cde'),
                    'lienJs'    => $this->ajaxPopupV2(
                        $this->router->generateUri('Commande.ajaxGestionCommande.popupAnnulerCommande', ['idCommande' => $commandeId]),
                        'filtre_suivi',
                        $this->trad->t('Annuler la commande N°')." ".$libCommande
                    ),
                ];
            }
        }

        if ($doc['brPossible']> 0) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Relance fournisseur'),
                'lienJs'    => $this->ajaxPopupV2($this->router->generateUri('Suivi.Suivi.relance', ['typeRelance' => 'RELANCE', 'idDoc' => $commandeId]), 'filtre_suivi', $this->trad->t('Relance fournisseur'))
            ];
        }

        //if ((int) $_SESSION['Session_NumClient'] == 55) {
        if ($this->droit['ConsoBudgetSign'] && $this->droit['HA_CA_VIPX']) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle'   => $this->trad->t('Conso. budget'),
                'lienJs'    => $this->ajaxPopupV2(
                    $this->router->generateUri('GlobalApplication.ConsommationBudgetaire.index', ['typeDoc' => 'CDE', 'numDoc' => $commandeId]),
                    'filtre_suivi',
                    $this->trad->t('Consommation budgétaire de la CDE n°') . $libCommande,
                ),
            ];
        }


        $menuContextuel['listeSecondaire'][] = [
            'libelle'   => $this->trad->t('Pièces Jointes'),
            'lien'      => $this->router->generateUri('Commande.PieceJointe.index', ['idCommande' => $commandeId]),
        ];

        
        $menuContextuel['listeSecondaire'][] = [
            'libelle'   => $this->trad->t('Gérer les incidents'),
            'lien'      => $this->router->generateUri('GlobalApplication.Incidents.incidents', ['MODULE' => 'Commande', 'id' => $commandeId]),
        ];

        if ($this->license['TermPaie']) {
            if (($doc['ETAT_CDE'] == 'E' && Sql::toBool($doc['SIGNEE']) && !Sql::toBool($doc['REFUSEE'])) || $doc['ETAT_CDE'] == 'S' && ($doc['TOT_CDE'] != 0) && ($doc['TP_EXIST'] == 1)) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle' => $this->trad->t('Suivi des termes de paiement'),
                    'lien' => $this->router->generateUri(
                        'TermeDePaiement.TermeDePaiement.suiviAvancementTp',
                        [
                            'MODULE' => 'Commande',
                            'id' => $commandeId
                        ]
                    ),
                ];
            } elseif (($doc['TP_EXIST'] == 1)) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle' => $this->trad->t('Termes de paiement'),
                    'lien' => $this->router->generateUri(
                        'Commande.TermeDePaiementCommande.index',
                        [
                            'MODULE' => 'Commande',
                            'idCommande' => $commandeId
                        ]
                    ),
                ];
            }
        }

        $namespaceSpecifique = $this->specifique->specifiqueFunction('\\Modules\\Suivi\\MenuContextuel\\GestionCdeMenuContextuelSpecifique');
        
        if (class_exists($namespaceSpecifique)) {
            $menuSpec = \Helpers\Additional\Specifique\Specifique::specifique(
                '\\Modules\\Suivi\\MenuContextuel\\GestionCdeMenuContextuelSpecifique',
                'gestionMenuContextuelSpecifique',
                $this->pdo,
                $this->router,
                $this->trad,
                $doc
            );
            if ($menuSpec) {
                $menuContextuel['listeSecondaire'][] = $menuSpec;
            }
        }
        
        return $menuContextuel;
    }
}
