<?php
namespace Modules\Fournisseur\Controller;

use API\Partenaire\IFournissLink;
use Entity\Model\Hastutil;
use Helpers\Outil\Roles;
use Modules\API\APIExterne\TwigExtension\OutilAPIExtension;

use Skeleton\Controller\Controller;
use Entity\Model\Fourniss;
use Helpers\Session\Session;
use Helpers\Ariane\Ariane;
use Modules\Fournisseur\Outil\DroitUtilisateur;
use Helpers\Ariane\ArianeSub;
use Modules\GlobalApplication\Repository\Workflow;
use Modules\Fournisseur\Repository\GestFourniss;
use Helpers\Pagination\Paginator;
use Modules\Fournisseur\Repository\Indicateur;
use Helpers\Highcharts\Highcharts;
use Helpers\Outil\Sql;
use Entity\Model\WftDemLig;
use Helpers\Log\LogSysteme;
use Modules\Fournisseur\MenuContextuel\GestionMenuContextuel;
use TwigExtension\OutilExtension;

class FournisseurController extends Controller
{
    const SUBARIANE_PARTN_OFFSET = 10;

    public function indexAction()
    {
        $id=$this->request->getAttribute('id');
        $codeDemande=$this->request->getAttribute('codeDemande');
        $Api = new \Modules\API\APIExterne\Repository\Partenaire($this->pdo);

        /* *** TRAD *** */
        
        
        
        $trad = $this->getTranslationService();
        /* ************ */
        
        $value=[
            "Langue" => $_SESSION['Session_Langue'],
            "Login" => $_SESSION['Session_Login'],
            "no_ao" => $_SESSION["Session_SocUsr"],
            "codeFrs" => $id=='noId'? '':$id,
            'codeDemande' => $codeDemande,
            'affDemande' => '',
            'mode' => 'V',
        ];
        
        $fournisseur    = '';
        $PARAVRAC       = '';
        
        $xmlResult = new \Modules\Fournisseur\WebService\Fournisseur();
        $xmlResult= $xmlResult->ficheFournisseur($value);
        
        $fournisseur = new \SimpleXMLElement($xmlResult->responseData);
        
        if ($fournisseur->Statut=="O") {
            $_SESSION['fiche_fournisseur']= $xmlResult->responseData;
            
            $PARAVRAC = Sql::parametrageTaxePays($this->pdo, ((string)$fournisseur->Fournisseur->Identity->CODE_PAYS));
        }

        $workflow = new Workflow($this->pdo);
        if ($id!='noId') {
            $fournis = new Fourniss($this->pdo);
            $fournis = $fournis->find($id);
            
            $workflow = $workflow->getDemande('FOURNISS', $id);
            
            $mode = '';
        } else {
            $wftLigne = new WftDemLig($this->pdo);
            $prospect = $wftLigne->find([
                'TYPE_ENT' => 'FOURNISS',
                'CODE_DEMANDE' => $codeDemande,
                'CODE_CHAMP' => 'PROSPECT'
            ]);
           
            $fournis = [
                'PROSPECT' => ($prospect['VALEUR_CHAMP']??null),
            ];
            $workflow = $workflow->getInfoDemande('FOURNISS', $codeDemande);
            $mode = 'FrsWithOutCode';
        }
        
        $DroitUtilisateur = new DroitUtilisateur($this->router);
        if (!$DroitUtilisateur->DroitUtilisateur($fournis ?? []) && $DroitUtilisateur->parametrageFournisseurPresent($this->pdo)) {
            $parametrageOnglet = $DroitUtilisateur->parametrageOngletFournisseur($this->pdo);
        }
        // Droit de modification Prospect ou Fournisseur
        
        $DroitModif = ($fournisseur->Fournisseur->PROSPECT && $_SESSION['AuthModifProspect']) || ((string)$fournisseur->Fournisseur->PROSPECT == 0 && $_SESSION['AuthModifFournisseur']);
        
        /* gestion CA */
        
        $gestFourn = new GestFourniss($this->pdo);
        $listeCA = $gestFourn->listeCAFournisseurXML($fournisseur->Fournisseur->ListChiffreAffaire);

        ArianeSub::init();

        // si codedemande est rempli, c'est qu'on viens de la suivie des demandes des fournisseurs
        if ($codeDemande) {
            Ariane::generate(1, $trad->t('Demande fournisseur'), []);
            
            ArianeSub::generate(0, 0, $trad->t('Fiche fournisseur'), $this->router->generateUri('Fournisseur.Fournisseur.index', ['id' => $id, 'codeDemande' => $codeDemande]), 1);
            
            if (($parametrageOnglet['DOCS_RATT_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 1, $trad->t('Documents rattachés'), $this->router->generateUri('Fournisseur.DocFournisseur.docRattache', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            $lienFrsSte = Roles::droit($this->pdo, 'LIEN_FOU_STE_ACTIF', 'PARAMFOU');
            if ($lienFrsSte) {
                ArianeSub::generate(0, 2, $trad->t('Société'), $this->router->generateUri('Fournisseur.societe.societe', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            if (($parametrageOnglet['MOTSCLEFS_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 2, $trad->t('Mots clefs'), $this->router->generateUri('Fournisseur.motsClefInteraction.motsClef', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            if (($parametrageOnglet['PARAMIMPCDE_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 3, $trad->t('EDI & Routage'), $this->router->generateUri('Fournisseur.EdiRoutageInteraction.EdiRoutageInteraction', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            if (($parametrageOnglet['BDD_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 4, $trad->t('BDD'), $this->router->generateUri('GlobalApplication.Bdd.bdd', ['MODULE'=> 'Fournisseur',      'id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            if (($parametrageOnglet['ZONESGEO_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 5, $trad->t('Zones géographiques'), $this->router->generateUri('Fournisseur.ZoneGeoInteraction.ZoneGeoInteraction', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            if (($parametrageOnglet['SFAM_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 6, $trad->t('Sous-famille(s)'), $this->router->generateUri('Fournisseur.SousFamilleInteraction.sousFamille', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
            if (($parametrageOnglet['TYPACH_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 7, $trad->t('Type d\'Achat'), $this->router->generateUri('Fournisseur.TypeAchatInteraction.achat', ['id' => $id, 'codeDemande' => $codeDemande]), 0);
            }
        
            $libelle = $fournisseur->Fournisseur->Identity->RS;
        } else {
            // sinon on viens de la gestion des fournisseur
            Ariane::generate(1, $trad->t('Détail fournisseur'), []);
            
            ArianeSub::generate(0, 0, $trad->t('Fiche fournisseur'), $this->router->generateUri('Fournisseur.Fournisseur.index', ['id' => $id]), 1);


            if (($parametrageOnglet['DOCS_RATT_NONVISIBLE']??false) != true) {
                $partenCodeList = [];
                if (!empty($fournis['NO_SIRET']??'')) {
                    $partenCodeList = $Api->fournisseurListPartenaireConnectDoc($id);
                }
                ArianeSub::generate(
                    0,
                    1,
                    $trad->t('Documents rattachés')
                        . ArianeSub::generateDocAttImage(
                            $this->contenaire->get('baseUrl'),
                            $partenCodeList
                        ),
                    $this->router->generateUri(
                        'Fournisseur.DocFournisseur.docRattache',
                        ['id' => $id]
                    ),
                    0
                );
            }
            if (($parametrageOnglet['INTERACTIONS_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 2, $trad->t('Interactions'), $this->router->generateUri('Fournisseur.Interactions.interactions', ['id' => $id]), 0);
            }
            if (($parametrageOnglet['HISTO_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 3, $trad->t('Historique'), $this->router->generateUri('GlobalApplication.Historique.historique', ['MODULE'=> 'Fournisseur', 'id' => $id]), 0);
            }
            if (($parametrageOnglet['EVAL_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 4, $trad->t('Evaluation'), $this->router->generateUri('Fournisseur.Evaluation.evaluation', ['id' => $id]), 0);
            }
            if (($parametrageOnglet['INDICATEURS_NONVISIBLE']??false) != true) {
                ArianeSub::generate(0, 5, $trad->t('Indicateurs'), $this->router->generateUri('Fournisseur.Fournisseur.indicateurs', ['id' => $id]), 0);
            }

             /**
              * API
              */
            if (($parametrageOnglet['OXA360_NONVISIBLE']??false) != true) {
                $posAriane = self::SUBARIANE_PARTN_OFFSET;
                
                $listPatenaire = $this->getPartenaireService()->getListByFourniss($id);
                foreach ($listPatenaire as $partenaire) {
                    if (!($partenaire instanceof IFournissLink)) {
                        continue;
                    }
                    $route = $partenaire->getRouteDetail();
                    if ($route == null) {
                        continue;
                    }
                    ArianeSub::generate(
                        0,
                        $posAriane++,
                        (new OutilAPIExtension($this->pdo, $this->contenaire, $this->router))
                            ->generateHtmlLogo($partenaire),
                        $this->router->generateUri(
                            $route,
                            ['fournissId' => $id]
                        )
                    );
                }

                if ($Api->fournisseurIsConnectActivite($id, 'INFOLG')) {
                    ArianeSub::generate(0, $posAriane++, '<img src ="'.$this->contenaire->get('baseUrl').'img/API/logo-info-legale.png" height="20px"/>', $this->router->generateUri('API.InfoLegale.indicateur', ['idFournisseur' => $id]), 0);
                }
                 
                if ($Api->fournisseurIsConnectActivite($id, 'BVD')) {
                    ArianeSub::generate(0, $posAriane++, '<img src ="'.$this->contenaire->get('baseUrl').'img/API/logo-BVD.png" height="20px"/>', $this->router->generateUri('API.BVD.index', ['idFournisseur' => $id]), 0);
                }
            }
            
            $libelle = $fournis["RS"];
        }

        $session = new Session('Fournisseur');
        
        if ($workflow && (isset($workflow['STATUT_DEMANDE']) && $workflow['STATUT_DEMANDE'] == '0') || ($codeDemande && isset($workflow['STATUT_DEMANDE']) && $workflow['STATUT_DEMANDE']=='R')) {
            $arrayEdit = [
                'id' => $workflow['CODE_DEMANDE'],
                'mode' => 'modification',
                'codeType' => 'CODE_DEMANDE'
            ];

            $codeForPath = $id=='noId'? $workflow['CODE_DEMANDE']:$id;
            $mode = $mode? $mode:'modification';
        } else {
            $codeForPath = $id=='noId'? $codeDemande:$id;
            $arrayEdit = $mode? ['id' => $codeForPath, 'mode' => $mode]:['id' => $codeForPath];
        }
        
        if ($codeDemande!=null && (($workflow['STATUT_DEMANDE'] ?? '') == 'R') && $workflow['TYPE_DEMANDE'] == 'C') {
            if ($session->getSession('Fournisseur')) {
                $actionButton = 'demRefuser';
                $codeForPath = 'noId';
                $optionButton2 = $codeDemande;
            } else {
                if ($id=='noId') {
                    $codeForPath = $id;
                }

                $pathButton = $this->router->generateUri('Fournisseur.CreationFournisseur.nouveauFournisseur', ['id' => $codeForPath, 'codeDemande' => $codeDemande]);
            }
        } elseif ($codeDemande==null
                && (
                    (($workflow['STATUT_DEMANDE'] ?? '') == '0' && ($workflow['AUTEUR']??'') == $_SESSION['Session_Login'])
                    || ($workflow['STATUT_DEMANDE']??'')=='R' || $workflow == false
            )) {
            if ($session->getSession('Fournisseur')) {
                $actionButton = 'modification';
                $optionButton2 = $mode;
            } else {
                $pathButton = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', $arrayEdit);
            }
        } elseif ($codeDemande && (($workflow['STATUT_DEMANDE'] ?? '')=='R' || ($workflow['STATUT_DEMANDE'] ?? '') == '0')) {
            if ($session->getSession('Fournisseur')) {
                $actionButton = 'modification';
                $optionButton2 = $mode;
            } else {
                $pathButton = $this->router->generateUri('Fournisseur.ModificationFournisseur.ModificationFournisseur', $arrayEdit);
            }
        }

        $listeTypeFourniss   = $gestFourn->listeTypeFournisseur();
        $tabTypeFourniss[''] = $this->getTranslationService()->t('Tous les fournisseurs');

        for ($i=0; $i<count($listeTypeFourniss); $i++) {
            $tabTypeFourniss[$listeTypeFourniss[$i]['LIBELLE']]=$listeTypeFourniss[$i]['LIBELLE'];
        }
        
        $infoButtonFicher = [
            'arrayEdit' => json_encode($arrayEdit),
            'codeForPath' => $codeForPath,
            'actionButton' => $actionButton??'',
            'optionButton2' => $optionButton2??'',
            'pathButton' => $pathButton??'',
        ];

        $menuContextuelClass = new GestionMenuContextuel(
            $this->pdo,
            $this->router,
            $this->getTranslationService(),
            $this->contenaire,
            $session,
            []
        );

        $menuContextuel = $menuContextuelClass->generateFiche($id, $infoButtonFicher);
                
        return $this->renderer->render('@Fournisseur/Fournisseur/index', [
            'menuActive' => 'Fournisseur',
            'menuLeft' => 'GestionFournisseur',
            'titleShortList' => $trad->t('Short Lists du fournisseur'),
            'CreationEnCours' => $session->getSession('Fournisseur')? true:false,
            'suiviDemande' => $codeDemande? true:false,
            'user' => $_SESSION['Session_Login'],
            "libelle_fournisseur" => $libelle,
            'codeDemande' => $codeDemande??'',
            "fournisseur" => $fournisseur,
            "code_fournisseur" => $id,
            "paramTaxe" => $PARAVRAC,
            
            'demande' => $workflow,
            'listeCA' => $listeCA,
            "fiche" => true,
            'DroitModif' => $DroitModif,
            'parametrageOnglet' => $parametrageOnglet??[],

            'menuContextuel' => $menuContextuel,
        ]);
    }

    public function popupChiffreAffaireAction() : string
    {
        $codeFrs=$this->request->getAttribute('id');
        $codeDemande=$this->request->getAttribute('codeDemande');
        
        $value=[
            "Langue" => $_SESSION['Session_Langue'],
            "Login" => $_SESSION['Session_Login'],
            "no_ao" => $_SESSION["Session_SocUsr"],
            "codeFrs" => $this->request->getAttribute('id'),
            'codeDemande' => $codeDemande,
            'affDemande' => '',
            'mode' => 'V',
        ];
        
        $xmlResult = new \Modules\Fournisseur\WebService\Fournisseur();
        $xmlResult= $xmlResult->ficheFournisseur($value);
        $fournisseur = new \SimpleXMLElement($xmlResult->responseData);
        
        $listeCA = new GestFourniss($this->pdo);
        $listeCA = $listeCA->listeCAFournisseurXML($fournisseur->Fournisseur->ListChiffreAffaire, true);
        
        $paginator = new Paginator();
        $infoPagination = $paginator->generate($listeCA, 10, [], $this->renderer);
        
        if (!$codeDemande) {
            $path = $this->router->generateUri('Fournisseur.Fournisseur.popupChiffreAffaire', ['id' => $codeFrs]);
        }
        
        return $this->renderer->render('@Fournisseur/Popup-Fournisseur/popupChiffreAffaire', [
            'infoPagination' => $infoPagination,
            'listeCA' => $listeCA,
            'path' => $path,
        ]);
    }

    public function statistiqueAction() : string
    {
        $id=$this->request->getAttribute('id');
        
        $fournis = new Fourniss($this->pdo);
        $fournis = $fournis->find($id);
        
        ArianeSub::generate(0, 5, 'Statistique', $_SERVER['REQUEST_URI'], 1);
        return $this->renderer->render('@Fournisseur/Trash/statistique', [
            'menuActive' => 'Fournisseur',
            'menuLeft' => 'GestionFournisseur',
            "code_fournisseur" => $id,
            "libelle_fournisseur" => $fournis["RS"]
        ]);
    }
    

    public function indicateursAction() : string
    {
        $id=$this->request->getAttribute('id');
        $post = $this->request->getParsedBody();
        
        if ($post) {
            $societe = $post['societe'];
            $annee = $post['periode'];
        } else {
            $societe =  $_SESSION["Session_SocUsr"];
            $annee = date('Y');
        }
        $trad = $this->getTranslationService();
        $fournis = new Fourniss($this->pdo);
        $fournis = $fournis->find($id);
        
        $indicateur = new Indicateur($this->pdo);
        $nbrIncident = $indicateur->nbrIncident($id, $annee, $societe);
        $infoCA = $indicateur->totalCAParPeriodeBySte($id, $annee, $societe);
        $CAFrs = $indicateur->getCAFournisseurByPeriode($id, $annee);
        if ($CAFrs['CA']??'') {
            $tauxDeDependance = round($infoCA['CA']/$CAFrs['CA'] * 100, 2);
        } else {
            $tauxDeDependance = 0;
        }
    
        $periodes = $indicateur->periodedispo();

        foreach ($periodes as $val) {
            $listePeriode[$val['CODE_PER']] = $val['LIBELLE'];
        }
        

        $infoCA = $indicateur->totalCAParPeriodeBySte($id, $annee, $societe);
        $CAFrs = $indicateur->getCAFournisseurByPeriode($id, $annee);
        if ($CAFrs['CA']??'') {
            $tauxDeDependance = round($infoCA['CA']/$CAFrs['CA'] * 100, 2);
        } else {
            $tauxDeDependance = 0;
        }
        
        foreach ($periodes as $val) {
            $listePeriode[$val['CODE_PER']] = $val['LIBELLE'];
        }
        
        $graphCdeSF = $indicateur->cdeParSF($id, $annee, $societe);
        $graphCdeMois = $indicateur->cdeParMois($id, $annee, $societe);

        ArianeSub::generate(0, 5, $trad->t('Indicateurs'), $_SERVER['REQUEST_URI'], 1, $post);

        $devise = $_SESSION['DEVISE_BASE']??'EUR';
        /* Graph1 */
        $array['value']                  = $graphCdeMois;
        $array['categorie']              = 'mois';
        $array['titre']                  = $trad->t('Nombre de commandes & CA par mois').' - '.($annee);
        $array['type']                   = 'column';
        $array['detailColone']['NB_CDE'] = ['nom' => $trad->t('Nombre de commandes'), 'type' => 'column', 'axeLier' => 'gauche'];
        $array['detailColone']['CA']     = ['nom' => $trad->t("Chiffre d'affaires"), 'type' => 'spline', 'axeLier' => 'droit', 'tooltip' => $devise];
        $array['legendGraph'][]          = ['texte' => $trad->t('Nb de commandes'), 'format' => '', 'axe' => 'gauche'];
        $array['legendGraph'][]          = ['texte' => $trad->t('CA'), 'format' => ' '.$devise, 'axe' => 'droit'];

        $highcharts1 = Highcharts::generate($array, $this->pdo, $trad);
        
        /* fin graph1 */
 
        /* Graph2 */

        foreach ($graphCdeSF as &$tmp) {
            $tmp['libelle'] = str_replace("'", '’', $tmp['libelle']);
        }
        $array1['value']        = $graphCdeSF;
        $array1['detailDonut']  = ['nom' => 'Nb de cde'];
        $array1['titre']        = $trad->t('Nombre de commandes par sous-famille').' - '.($annee);
        $array1['type']         = 'pie';
        $array1['legend']       = true;
        
                
        $highcharts2 = Highcharts::generate($array1, $this->pdo, $trad);

        /* fin graph2 */
        
        if ($tauxDeDependance<30) {
            $tauxDeDependanceColor = 'vert';
        } elseif ($tauxDeDependance>=30 && $tauxDeDependance<=50) {
            $tauxDeDependanceColor = 'orange';
        } else {
            $tauxDeDependanceColor = 'rouge';
        }

        if ($nbrIncident<=3) {
            $nbrIncidentColor ='vert';
        } elseif ($nbrIncident==4 || $nbrIncident==5) {
            $nbrIncidentColor = 'orange';
        } else {
            $nbrIncidentColor = 'red';
        }

        return $this->renderer->render('@Fournisseur/Fournisseur/indicateurs', [
            'menuActive' => 'Fournisseur',
            'menuLeft' => 'GestionFournisseur',

            'tauxDeDependanceColor' => $tauxDeDependanceColor,
            'annee' => $annee,
            'societe' => $societe,
            "tauxDeDependance" => $tauxDeDependance,
            "libelle_fournisseur" => $fournis["RS"],
            'nbrIncidentColor' => $nbrIncidentColor,
            'dataHighchart2' => $highcharts2,
            'dataHighchart' => $highcharts1,
            'devise' => $fournis['DEVISE'],
            "nbrCommande" => intval($infoCA['NB_CDES'] ?? 0),
            "nbrIncident" => $nbrIncident,
            "code_fournisseur" => $id,
            "caEngage" => floatval($infoCA['CA'] ?? 0),
            'listePeriode' => $listePeriode,
            
        ]);
    }

//_____________________________________________________________________________
// Helper
    
    /**
     * @param array<mixed> $post
     */
    public function arianeSubGenerate(
        string $fournissId,
        string $partnId,
        array $post
    ) :void {

        // Get index Arianne
        $listPatenaire = array_values(array_filter(
            $this
                ->getPartenaireService()
                ->getListByFourniss($fournissId),
            function ($partenaire) {
                if (!($partenaire instanceof IFournissLink)) {
                    return false;
                }
                $route = $partenaire->getRouteDetail();
                if ($route == null) {
                    return false;
                }
                return true;
            }
        ));
            
        $index = array_search(
            $partnId,
            array_map(function ($part) {
                return $part->getCode();
            }, $listPatenaire)
        );
        if (!is_int($index)) {
            LogSysteme::prefixErrorLog((new \Exception('!!!')));
            return;
        }

        $partn = $listPatenaire[ $index ];

        ArianeSub::generate(
            0,
            FournisseurController::SUBARIANE_PARTN_OFFSET + intval($index),
            (new OutilAPIExtension($this->pdo, $this->contenaire, $this->router))
                ->generateHtmlLogo($partn),
            $_SERVER['REQUEST_URI'],
            1,
            $post
        );
    }
}
