<?php
namespace Modules\GlobalApplication\Controller;

use Helpers\Outil\Sql;
use Skeleton\Controller\Controller;
use Helpers\Outil\Date;
use Entity\Model\Fourniss;
use Modules\GlobalApplication\Repository\Historique;
use Helpers\Outil\InMultiArray;
use Helpers\Fichier\Fichier;
use Entity\Model\Grpfou;
use Helpers\Ariane\ArianeSub;
use Helpers\Trad\Trad;
use Entity\Model\Hastutil;
use Entity\Model\Societe;
use Entity\Model\Sectimpu;
use Entity\Model\Codecomp;
use Entity\Model\Sscptana;
use Entity\Model\Devise;
use Entity\Model\Directio;
use Entity\Model\Natana;
use Entity\Model\Centrana;
use Entity\Model\Famille;
use Entity\Model\SousFamille;
use Modules\GlobalApplication\MenuContextuel\HistoriqueMenuContextuel;

class HistoriqueController extends Controller
{
    public function historiqueAction() : string
    {
        $id = $this->request->getAttribute('id');
        $post = $this->request->getParsedBody();

        $global=false;
        $accEntity       = new \Entity\Model\Acccadre($this->pdo);
        $module = $this->request->getAttribute('MODULE');
        $sousmodule = $this->request->getAttribute('SOUSMODULE');
        if ($module=='Fournisseur') {
            $module='FOU';
        } elseif ($module=='Groupement') {
            $module='GFO';
        }
            
        
        if ($module=='AFO') {
            $oldId = $id;
            $explod = explode('$', $id);
            $code_fourniss =$explod[0];
            $id = $explod[0].$explod[1];
        } elseif ($module=='ACD') {
            $title = $accEntity->find($id);
        }
        
        $requeteHisto = new historique($this->pdo);
        
        $histoGlobal = $requeteHisto->cumulGlobal($id, $module);                             // Historique global (pour l'entete du tableau)
        $histoGlobalAnneeEnCours = $requeteHisto->cumulGlobalAnnee($id, date('Y'), $module); // historique de l'année en cours (pour l'entete du tableau)
        $societe = $requeteHisto->currentSociete($_SESSION["Session_SocUsr"]);               // Societe utiliser lors de la connexion pour l'entete du tableau
        $cumulSociete= $requeteHisto->cumulSociete($id, $module);                            //Liste des cumules par societe
        $periode = array_column(
            $requeteHisto->distinctAnnee($id, $module), //Liste des années presente dans la bdd pour le select du filtrage
            'CODE_PER',
            'CODE_PER'
        );

        /** filtrage **/
        if ($this->request->getMethod() == 'POST') {
            if (($post['filter_PERIODE']??'')=='CUMUL'
                && $post['filter_SOCIETE']!='GLOBAL'
            ) {
                $cumulSociete= $requeteHisto->cumulSociete($id, $module, $post);
            } else {
                if (isset($post['filter_SOCIETE'])
                    && ($post['filter_SOCIETE'] || $post['filter_PERIODE'])
                ) {
                    if (strtoupper($post['filter_SOCIETE'])!="GLOBAL") {
                        $cumulSociete= $requeteHisto->cumulSocietePeriode(
                            $id,
                            $module,
                            $post
                        );
                    } else {
                        $cumulSociete = $requeteHisto->cumulGlobalParAnnee(
                            $id,
                            $module,
                            $post
                        );
                        $global = true;
                    }
                }
            }
        }
        
        
        $nb_societe = count($cumulSociete);

        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($cumulSociete, 5, $post, $this->renderer, 'Autre');

        $trad = $this->getTranslationService();
     
        $periode['']=$trad->t('Cumul global');

        if ($module=='FOU' or $module=='AFO') {
            $fournis = new Fourniss($this->pdo);
            $fournis = $fournis->find($code_fourniss??$id);
         
            $menuActive= 'Fournisseur';
            $menuLeft='GestionFournisseur';
            $titre= $trad->t('Fournisseurs');
            
            $libelle = $fournis["RS"];
            if ($module=='AFO') {
                $articlesTRUE = true;
                ArianeSub::generate(2, 0, $trad->t('Historique'), $_SERVER['REQUEST_URI'], 1, $post);
            } else {
                ArianeSub::generate(0, 3, $trad->t('Historique'), $_SERVER['REQUEST_URI'], 1, $post);
            }
            
            $sousTitre = $trad->t('Fournisseur') . $trad->colon()
                . $libelle . '(' . ($code_fourniss??$id) . ')';
        } elseif ($module=='GFO') {
            $titre=$trad->t('Groupement de fournisseur');
            $menuActive= 'Fournisseur';
            $menuLeft='GestionGroupement';
            
            $grp = new Grpfou($this->pdo);
            $grp = $grp->find($id);
            
            $libelle = $grp["RS"];
            
            ArianeSub::generate(0, 3, $trad->t('Historique'), $_SERVER['REQUEST_URI'], 1, $post);
            
            $sousTitre = $trad->t('Groupement') . $trad->colon()
                . $libelle . '(' . $id . ')';
        } elseif ($module=='ACD') {
            if ($sousmodule=='fournisseur') {
                ArianeSub::generate(2, 0, $trad->t('Cumuls'), $_SERVER['REQUEST_URI'], 1);
                
                $titre =  $trad->t('Fournisseurs');
                $menuActive = 'Fournisseur';
                $menuLeft = 'GestionFournisseur';
            } elseif ($sousmodule=='groupement') {
                ArianeSub::generate(2, 0, $trad->t('Cumuls'), $_SERVER['REQUEST_URI'], 1);
                
                $titre =  $trad->t('Groupement');
                $menuActive = 'Fournisseur';
                $menuLeft = 'GestionGroupement';
            } elseif ($sousmodule=='marches') {
                \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
                
                $titre =  $trad->t('Marchés');
                $menuActive = 'Contrats';
                $menuLeft = 'Contrat.marche.index';
            } else {
                \Helpers\Ariane\Ariane::generate(2, $trad->t('Cumuls'), $post);

                $titre =  $trad->t('Accords-cadres');
                $menuActive = 'Contrats';
                $menuLeft = 'Contrat.accord-cadre.index';
            }

            $sousTitre = Trad::strBuild($trad->t("Cumuls de l'Accord-cadre : @1@ (@2@)"), $title['LIBELLE'], $id);
        } elseif ($module=='DEM' || $module=='ACH') {
            $utilisateur = new Hastutil($this->pdo);
            $utilisateur = $utilisateur->find($id);
            switch ($module) {
                case 'DEM':
                    $titre =  $trad->t('Tables');
                    $sousTitre = Trad::strBuild($trad->t("Cumuls du demandeur : @1@ (@2@)"), $utilisateur['NOM'], $id);
                    break;
                case 'ACH':
                    $titre =  $trad->t('Tables');
                    $sousTitre = Trad::strBuild($trad->t("Cumuls de l'acheteur : @1@ (@2@)"), $utilisateur['NOM'], $id);
                    break;
            }
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='SOC') {
            $societe = new Societe($this->pdo);
            $societe = $societe->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la société : @1@ (@2@)"), $societe['RAIS_SOC'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='SI') {
            $Sectimpu = new Sectimpu($this->pdo);
            $Sectimpu = $Sectimpu->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la section d'imputation : @1@ (@2@)"), $Sectimpu['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='CDC') {
            $Codecomp = new Codecomp($this->pdo);
            $Codecomp = $Codecomp->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls du code complémentaire : @1@ (@2@)"), $Codecomp['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='SCA') {
            $Sscptana = new Sscptana($this->pdo);
            $Sscptana = $Sscptana->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls du sous compte d'analyse : @1@ (@2@)"), $Sscptana['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='DIR') {
            $Directio = new Directio($this->pdo);
            $Directio = $Directio->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la direction : @1@ (@2@)"), $Directio['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='NAT') {
            $Natana = new Natana($this->pdo);
            $Natana = $Natana->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la nature analytique : @1@ (@2@)"), $Natana['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='CTA') {
            $Centrana = new Centrana($this->pdo);
            $Centrana = $Centrana->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls du centre d'analyse : @1@ (@2@)"), $Centrana['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='DEV') {
            $Devise = new Devise($this->pdo);
            $Devise = $Devise->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la devise : @1@ (@2@)"), $Devise['LIBELLE'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='FAM') {
            $Famille = new Famille($this->pdo);
            $Famille = $Famille->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la famille : @1@ (@2@)"), $Famille['DESIGNAT'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        } elseif ($module=='SFA') {
            $SousFamille = new SousFamille($this->pdo);
            $SousFamille = $SousFamille->find($id);
            
            $sousTitre = Trad::strBuild($trad->t("Cumuls de la sous famille : @1@ (@2@)"), $SousFamille['DESIGNAT'], $id);
            $titre = $trad->t('Tables');
                   
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Cumuls'), $post);
            
            $menuActive = 'Parametrage';
            $menuLeft = 'Tables';
        }


        if (!$histoGlobalAnneeEnCours) {
            $histoGlobalAnneeEnCours['CODE_PER']=date('Y');
        }

        $menuContextuel = (new HistoriqueMenuContextuel($this->pdo, $this->router, $this->getTranslationService(), $module))->generate($id);

        return $this->renderer->render('@GlobalApplication/Historique/historique', [
            'menuActive' => $menuActive,
            'menuLeft' => $menuLeft,
            "periode" => $periode,
            'affTTC' => Sql::paravrac($this->pdo, 'PARAMCUM', 'CUMUL_EN_TTC') == 'O',
            "histoGlobal" => $histoGlobal,
            "histoGlobalCurrent" => $histoGlobalAnneeEnCours,
            "cumulSociete" => $cumulSociete,
            "societe" => $societe,
            "post" => $post,
            "infoPagination" => $infopagination,
            "nb_societe" => $nb_societe,
            "global" => $global,
            'MODULE' => $module,
            'SOUSMODULE' => $sousmodule,
            'id' => $oldId??$id,
            'title'=>$title??'',
            "histo" => true,
            
            'code_fournisseur' => $code_fourniss??$id,
            "libelle" => $libelle??'',
            'articlesTRUE' => $articlesTRUE??false,
            
            'TITRE' => $titre??'',
            'SOUSTITRE' => $sousTitre??'',
            'menuContextuel' => $menuContextuel
        ]);
    }
    
    public function sousPeriodeAction() : string
    {
        $post = $this->request->getParsedBody();
        $id = $this->request->getAttribute('id');
        $module = $this->request->getAttribute('MODULE');
        
        $post['annee'] = $this->request->getAttribute('annee');
        $post["societe"] = $this->request->getAttribute('societe');
        
        if ($module=='AFO') {
            $explod = explode('$', $id);
            $id = $explod[0].$explod[1];
        }

        $requeteHisto = new historique($this->pdo);
        if ($post["societe"]!="GLOBAL") {
            $requeteHisto = $requeteHisto->cumulSocieteSousPeriode($id, $post["annee"], $post["societe"], $module);
        } else {
            $requeteHisto = $requeteHisto->cumulGlobalParPeriode($id, $post["annee"], $module);
        }

        /* Permet de completer le tableau des mois manquant dans la bdd */
        $multiArray = new InMultiArray();
        $RemplissageMois=13;
        /* On regarde si l'annee selection est l'annee en cours*/
        if (date('Y')==$post["annee"]) {
            $RemplissageMois=date('m')+1;
        }
        /* Complete le tableau */
        for ($i=1; $i<$RemplissageMois; $i++) {
            if ($i<10) {
                $mois="0".$i;
            } else {
                $mois=$i;
            }
            
            $date=$post["annee"].$mois."01";
            
            if (!$multiArray->in_multi_array($date, $requeteHisto)) {
                $array=[
                    'DATE_SPER' => $date,
                    'PRE_ENG' => "0",
                    'ENGAGE'  => "0",
                    'REALISE'  => "0",
                    'FACTURE'  => "0",
                    'NB_CDES'  => "0",
                ];
                array_push($requeteHisto, $array);
            }
        }
        /*Permet de trier le tableau */
        $order = [];
        foreach ($requeteHisto as $key => $row) {
            $order[$key]["date"]  = $row['DATE_SPER'];
            $order[$key]["id"]  = $key;
        }
        sort($order);
       
        for ($i=0; $i<$RemplissageMois-1; $i++) {
            $listeHisto[$i] = $requeteHisto[$order[$i]['id']];
        }
        
        return $this->renderer->render('@GlobalApplication/Historique/sous-periode', [
            'affTTC' => Sql::paravrac($this->pdo, 'PARAMCUM', 'CUMUL_EN_TTC') == 'O',
            "cumulAnnee" => $listeHisto,
            'MODULE' => $module,
        ]);
    }
    
    public function exportSousPeriodeHistoAction() : string
    {
        $id = $this->request->getAttribute('id');
        $module = $this->request->getAttribute('MODULE');

        $post['annee'] = $this->request->getAttribute('annee');
        $post["societe"] = $this->request->getAttribute('societe');
        
        if ($module=='AFO') {
            $explod = explode('$', $id);
            $id = $explod[0].$explod[1];
        }
        
        $requeteHisto = new historique($this->pdo);
        if ($post["societe"]!="GLOBAL") {
            $requeteHisto = $requeteHisto->cumulSocieteSousPeriode($id, $post["annee"], $post["societe"], $module);
        } else {
            $requeteHisto = $requeteHisto->cumulGlobalParPeriode($id, $post["annee"], $module);
        }
            
        $multiArray = new InMultiArray();

        $RemplissageMois=13;
        
        if (date('Y')==$post["annee"]) {
            $RemplissageMois=date('m')+1;
        }
            
        for ($i=1; $i<$RemplissageMois; $i++) {
            if ($i<10) {
                $mois="0".$i;
            } else {
                $mois=$i;
            }
                
            $date=$post["annee"].$mois."01";
            
            if (!$multiArray->in_multi_array($date, $requeteHisto)) {
                if ($post["societe"]!="GLOBAL") {
                    $array=[
                        'CODE_STE' => $requeteHisto[0]['CODE_STE'],
                        'DATE_SPER' => $date,
                        'PRE_ENG' => "0",
                        'ENGAGE'  => "0",
                        'REALISE'  => "0",
                        'FACTURE'  => "0",
                        'NB_CDES'  => "0",
                    ];
                } else {
                    $array=[
                        'DATE_SPER' => $date,
                        'PRE_ENG' => "0",
                        'ENGAGE'  => "0",
                        'REALISE'  => "0",
                        'FACTURE'  => "0",
                        'NB_CDES'  => "0",
                        'NB_CDE'  => "0",
                    ];
                }
                array_push($requeteHisto, $array);
            }
        }
        $order = [];
        foreach ($requeteHisto as $key => $row) {
            $order[$key]["date"]  = $row['DATE_SPER'];
            $order[$key]["id"]  = $key;
        }
        sort($order);
        
        for ($i=0; $i<$RemplissageMois-1; $i++) {
            $listeHisto[$i] = $requeteHisto[$order[$i]['id']];
        }
        
        foreach ($listeHisto as &$value) {
            $value['DATE_SPER'] = Date::convertDateEnMois($value['DATE_SPER'], $this->getTranslationService());

            $value['PÉRIODES']              = $value['DATE_SPER'];
            $value['PRÉENGAGÉ_HT']          = $value['PRE_ENG'];
            $value['ENGAGÉ_HT']             = $value['ENGAGE'];
            $value['RÉALISÉ_HT']            = $value['REALISE'];
            $value['FACTURÉ_HT']            = $value['FACTURE'];
            $value['NBRE_COMMANDES']        = $value['NB_CDE'];

            $value                          = array_filter($value, function ($key) {
                // Filter table to convert to excel only infos needed
                return          $key        == 'PÉRIODES'
                            ||  $key        == 'PRÉENGAGÉ_HT'
                            ||  $key        == 'ENGAGÉ_HT'
                            ||  $key        == 'RÉALISÉ_HT'
                            ||  $key        == 'FACTURÉ_HT'
                            ||  $key        == 'NBRE_COMMANDES';
            }, ARRAY_FILTER_USE_KEY);
        }
        
        \Helpers\ExportTo\Outils::gestionEmailAsync2(
            "exportHistorique".$post["annee"],
            $listeHisto,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService(),
            [// TODO : trad
                'Périodes',
                'Préengagé HT' ,
                'Engagé HT',
                'Réalisé HT',
                'Facturé HT',
                'Nbre de commande'
            ]
        );

        return 'ok';
    }
}
