<?php
namespace Modules\EtatStatistiques\Controller;

use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\ChargeDocument\ChargeDocument;
use Helpers\Session\ParseBase1;
use Skeleton\Controller\Controller;
use Helpers\Validator\Validator;
use Helpers\Outil\Sql;
use Helpers\Fichier\Fichier;
use Helpers\Outil\StringHelper;
use Helpers\Outil\XmlHelper;
use Helpers\Trad\Trad;

class GestionStatistiquesController extends Controller
{
    public function listeEtatsAction() : string
    {
        $trad = $this->getTranslationService();
        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);

        // Listet e Sans theme
        $liste_sans_theme     = $repositoryEtatStatistique->listeEtatSansTheme(false);

        // Liste avec Theme
        $liste_avec_theme     = $repositoryEtatStatistique->listeEtatSansTheme(true);

        \Helpers\Ariane\Ariane::generate(0, $trad->t('Liste des Etats'));

        return $this->renderer->render('@EtatStatistiques/gestion-stat/listeEtats', [
            'menuActive'       => 'EtatStatistique',
            'listeTheme'       => $liste_avec_theme,
            'listeSansTheme'   => $liste_sans_theme,
        ]);
    }

    public function chargeFichierEtatAction()
    {
        $trad = $this->getTranslationService();
        $codEtat = $this->request->getAttribute('codEtat');
        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);
        $nomFichier = $repositoryEtatStatistique->getNameByCode($codEtat)['NOMFIC'];

        if ($nomFichier != '') {
            $chargeDoc = new ChargeDocument();

            if (StringHelper::isUrlLoose($nomFichier)) {
                return $this->redirect($nomFichier);
            }
           
            $nomFichier = 'EtatStat/' . $nomFichier;
            $urlFichier = 'pj';
           
            try {
                if (!$chargeDoc->chargeDoc($this->pdo, $nomFichier, $urlFichier)) {
                    throw new \Exception($trad->t("Erreur lors de la récupération du fichier."), 1);
                }
            } catch (\Exception $e) {
                return $e->getMessage();
            }
            return '';
        }
    }

    public function detailEtatAction() : string
    {
        $post      = $this->request->getParsedBody();
        $code_etat = $this->request->getAttribute('codEtat');
        $trad = $this->getTranslationService();
        
        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);
        
        $array_req_filtre = $repositoryEtatStatistique->array_req_filtre();
        $source_by_id     = $repositoryEtatStatistique->sourceById($code_etat);
        $listeTypeInput = $repositoryEtatStatistique->getTypeAffichage($code_etat);
        $existCodeEtatCs= $repositoryEtatStatistique->existCodeEtatCs($code_etat);
        
        $type_affichage_onglet = $repositoryEtatStatistique->typeOngletAffichage($code_etat);
           // NOTE ici on va ouvrir le le fichier seulement en mod excel et ne pas présenter une page dans le cas ou le type du perimetre == F
        // TODO : restore, $type_affichage_onglet['PERIMETRE'] is never set why ?
        // if ($type_affichage_onglet['PERIMETRE'] ?? '' == 'F') {
        // TODO : if (Sql::toBool($type_affichage_onglet['PERIMETRE'] ?? true)) {
        //     $chargeDoc = new ChargeDocument();
   
        //     //fopen($type_affichage_onglet['NOMFIC'], 'w+');
        //     $url = explode('/', $type_affichage_onglet['NOMFIC']);
   
        //     $nomFichier = new \Helpers\ExportTo\Generate("export_etat_statistique", 'excel', []);
        //     $extention  = pathinfo(end($url));
               
        //     $i = 0 ;

        //     $pathFile = '';
   
        //     foreach ($url as $u) {
        //         if ($u != end($url)) {
        //             if ($i == 0) {
        //                 $pathFile = $u;
        //             } else {
        //                 $pathFile .= '/'. $u;
        //             }
        //         }
        //         $i++;
        //     }
        //     $nomFichier = explode('.', end($url));
   
   
        //     $chargeDoc->chargeDoc($this->pdo, $nomFichier[0], 'tmp', false);
        //     // $url = Fichier::UploadClient( $pathFile.'/', $nomFichier[0]);
   
               
        //     // $url = $this->router->generateUri('Ajax.outil.downloadFichier', ['url' => $url]);
   
        //     // return $url;
        // }
            
        \Helpers\Ariane\Ariane::generate(1, $trad->t($source_by_id['DESCRIPT']));
        
        $periode = 0;

        // Test de l'existance d'une periodes dans la liste
        // Car la periodes est obligatoires pour l'affichage du graphe,
        // dans le cas ou il n'y à pas de periodes dans la liste qu'on récupère depuis la base de donnée on va alors rajouter le champ periodes a nos filtre
        foreach ($listeTypeInput as $key => $val) {
            if ($val['CODE_FILTRE'] == 'PERIODES' || $val['CODE_FILTRE'] == 'PERI') {
                $periode = 1;
            }
        }

        $csOk = 0;

        if (count($existCodeEtatCs) > 0) {
            $csOk = 1;
        }

        $trad = $this->getTranslationService();
        $listeSelectEtat=[
            'T' =>  $trad->t('Toutes'),
            'U' =>  $trad->t('Une seule'),
            'B' =>  $trad->t('Entre'),
        ];

        return $this->renderer->render('@EtatStatistiques/gestion-stat/detailEtat', [
            'menuActive'       => 'EtatStatistique',
            'post'             => $post,
            'codEtat'          => $code_etat,
            'sourceById'       => $source_by_id,
            'array_req_filtre' => $array_req_filtre,
            'filtre_stat'      => $listeTypeInput,
            'csOk'             => $csOk,
            'periodeExist'     => $periode,
            'nbrListe'         => count($listeTypeInput),
            'listeSelectEtat'  => $listeSelectEtat,
        ]);
    }
    
    public function ajaxInputDetailAction() : string
    {
        $code_etat = $this->request->getAttribute('codEtat');
        $post       = $this->request->getParsedBody();
        $modeSelect = $post['modeSelect'];
        $idSelect   = $post['idSelect'];
        
        $idExplod = explode('separateurFiltre', $idSelect);

        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);
        $filtre = $repositoryEtatStatistique->getTypeAffichageInput($code_etat, $idExplod[0]);

        $champSupp = new ChampSupp($this->pdo);
        $inputGenerate = $champSupp->generateImput(
            $this->router,
            $this->getTranslationService(),
            $filtre['CODE_FILTRE']
        );

        return $this->renderer->render('@EtatStatistiques/gestion-stat/ajax_inputEtat', [
            'filtre' => $filtre,
            'codeEtat' => $idExplod[0],
            'modeSelect' => $modeSelect,
            'inputGenerate' => $inputGenerate,
        ]);
    }

    public function ajaxAfficherAction() : string
    {
        $post      = $this->request->getParsedBody();
        $code_etat = $this->request->getAttribute('codEtat');
        $validator = $this->createValidator();
        $erreur = "";

        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);
        
        $listeTypeInput        = $repositoryEtatStatistique->getTypeAffichage($code_etat);
        $array_req_filtre      = $repositoryEtatStatistique->array_req_filtre();
        $source_by_id          = $repositoryEtatStatistique->sourceById($code_etat);

        $type_affichage_onglet = $repositoryEtatStatistique->typeOngletAffichage($code_etat);
        $lien = '';
        $guId = Sql::guidGenerate();

        // Creation du fichier dans le repertoire temporaire et création url pour iframe
        $url = (new ParseBase1())->getRep()->tmp.'Oxareports_'.$guId.'_In.xml';

        $sec = (new ParseBase1())->getHttps()? 'https' : 'http';
        $broker = (new ParseBase1())->getBroker();
        
        if ($broker=='1') {
            $broker='';
        }
        
        $urlDiv = $sec.'://'.(new ParseBase1())->getServer().'/OXAREPORTS'.$broker.'_web/FR/index.awp?P1='.$guId;
        
        
        $fichier = Fichier::fopen($url, 'w+');
        
        if ($type_affichage_onglet['TYPERES'] == 'T') {
            $xml ="
                <OxareportsIn LngUtilisation='" . htmlspecialchars($_SESSION['Session_Langue']) . "'>
                    <CodeUser>".$_SESSION['Session_Login']."</CodeUser>
                    <CodeEtat>".$code_etat."</CodeEtat>
                    <Filtres>
                ";
        }

        $xmlResult = new \Modules\EtatStatistiques\WebService\Statistique();

        foreach ($post as $keyp => $pval) {
            $pvalFin = '';
            
            $postExplode = explode('separateurFiltre', $keyp);
            if (substr($keyp, 0, 7) == 'select_' || substr($keyp, 0, 4) == 'fin_') {
                continue;
            } elseif (substr($keyp, 0, 6) == 'debut_') {
                $pvalFin = $post['fin_'.substr($keyp, 6)];
                $modeSelect = end($postExplode);
            } else {
                $modeSelect = end($postExplode);
            }
            
            
            
            $postExplode = explode('separateurFiltre', $keyp);

            // Source
            $source = $postExplode[2] ?? '';
            // Type
            //$postExplode[1];
            
            // Code
            //$postExplode[0];

            if (strpos($pval, '/')) {
                $validator->isDate($pval, '', '', true);
                if ($pvalFin) {
                    $validator->isDate($pvalFin, '', '', true);
                }
            }
            if (substr($postExplode[0], 0, 6) == 'debut_') {
                $postExplode[0] = substr($postExplode[0], 6);
            }
            
            if ($type_affichage_onglet['TYPERES'] == 'T') {
                $code_filtre            = $postExplode[0];
                $code_filtre_value      = str_replace('code_filtre', '', $code_filtre);

                $xml .= "
                    <Filtre>
                        <CodeFiltre>".$code_filtre_value."</CodeFiltre>
                        <TypeFiltre>".$postExplode[1]."</TypeFiltre>
                        <Choix>".$modeSelect."</Choix>
                        <ValeurDeb>".$pval."</ValeurDeb>
                        <ValeurFin>".$pvalFin."</ValeurFin>
                    </Filtre>";
            }
        }
        if ($type_affichage_onglet['TYPERES'] == 'G') {
                // grace à notre retour wsdl ci-dessus on va alimenter un autre wsdl pour récupérer l'url
                $liste_etat_std_hc = $xmlResult->wsdlFiltre_dtEtat($code_etat, $post);
                 
                // parcour du wsdl de retour pour récuprer l'url est afficher le graphe.
                $url_statistique = $liste_etat_std_hc->responseData;

                /** @var \SimpleXMLElement $xml */
                $xml = simplexml_load_string($liste_etat_std_hc->responseData, "SimpleXMLElement", LIBXML_NOCDATA);
                $urlcode  = (array) XmlHelper::normalize($xml);
                $param = '?uniq=' . Sql::guidGenerate();
                $param .= '&token=' . password_hash($_SESSION['Session_Login'].session_id(), PASSWORD_DEFAULT);
                //$param .= '&'. session_name() . '=' . session_id();
                $lien = '';

      
                    
            if ($urlcode['Retour'] =="O") {
                $lien = $this->router->generateUri('GlobalApplication.ChargeDocument.chargeDocument', [
                    'emplacement' => 'tmp',
                    'urlFichier' => $urlcode['NomFichier'],
                    'modeAffichage' => 0
                ]);
            } else {
                $erreur = $urlcode['MsgErreur'];
            }
        }
        
        if ($type_affichage_onglet['TYPERES'] == 'T') {
            $xml .= "</Filtres></OxareportsIn>";
            fwrite($fichier, $xml);
            fclose($fichier);
        }


        

        return $this->renderer->render('@EtatStatistiques/gestion-stat/detailEtat', [
            'menuActive'            => 'Accueil',
            'post'                  => $post,
            
            'codEtat'               => $code_etat,
            'sourceById'            => $source_by_id,
            'array_req_filtre'      => $array_req_filtre,
            'filtre_stat'           => $listeTypeInput,
            'urlTableau'            => $urlDiv,
            'urlGraph'              => $lien,
            'erreurGraph'           => $erreur,
            'type_affichage_onglet' => $type_affichage_onglet,
        ]);
    }
    
    // phpcs:ignore
    public function object_to_array($data)
    {
        if (is_array($data) || is_object($data)) {
            $result = array();
            foreach ($data as $key => $value) {
                $result[$key] = $this->object_to_array($value);
            }
            return $result;
        }
        return $data;
    }
    
    public function detailEtatWsdlAction() : string
    {
        $post      = $this->request->getParsedBody();
        $code_etat = $this->request->getAttribute('codEtat');
        $trad = $this->getTranslationService();
        
        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);
        $liste = new \Modules\Ajax\Repository\Listes($this->pdo);

        $acheteursListe = $liste->acheteur($post);
        $array_req_filtre = $repositoryEtatStatistique->array_req_filtre();
        $source_by_id     = $repositoryEtatStatistique->sourceById($code_etat);
        $type_affichage_onglet = $repositoryEtatStatistique->typeOngletAffichage($code_etat);


        $listeOxa = $repositoryEtatStatistique->listeOxa($code_etat);
        
        // NOTE ici on va ouvrir le fichier seulement en mod excel et ne pas présenter une page dans le cas ou le type du perimetre == F

        // TODO : PERIMETRE is never fetched, still used ?
        if (($type_affichage_onglet['PERIMETRE'] ?? '') == 'F') {
            //fopen($type_affichage_onglet['NOMFIC'], 'w+');
            $url = explode('/', $type_affichage_onglet['NOMFIC']);

            $nomFichier = new \Helpers\ExportTo\Generate("export_etat_statistique", 'excel', []);
            $extention  = pathinfo(end($url));
            
            $i = 0 ;
            
            $pathFile = '';

            foreach ($url as $u) {
                if ($u != end($url)) {
                    if ($i == 0) {
                        $pathFile = $u;
                    } else {
                        $pathFile .= '/'. $u;
                    }
                }
                $i++;
            }

            $nomFichier = explode('.', end($url));
            
            $url = Fichier::UploadClient($pathFile, $nomFichier[0]);

            
            $url = $this->router->generateUri('Ajax.outil.downloadFichier', ['url' => $url]);

            return $url;
        }

        \Helpers\Ariane\Ariane::generate(1, $trad->t($source_by_id['DESCRIPT']));
        
        $periode = 0;
        $societe = 0;

        // Test de l'existence d'une période dans la liste
        // Car la periode est obligatoire pour l'affichage du graphe,
        // dans le cas ou il n'y a pas de période dans la liste qu'on récupère depuis la base de données on va alors rajouter le champs période à nos filtres
        foreach ($listeOxa as $key => $val) {
            if ($val['CODFILTRE'] == 'PERIODES') {
                $periode = 1;
            }
            if ($val['CODFILTRE'] == 'SOCIETE') {
                $societe = 1;
            }
        }

        // On va chercher tous les choix sur listes chosie depuis le zoom et les ajouter dans une chaine de caractère concaténé par un '/' et l'ajouter a notre champ input
        $i=1;
        $val_zoom_slash['result'] = '';
        
        foreach ($post as $kpost => $vpost) {
            if ($kpost !='divCode') {
                if ($i==1) {
                    $val_zoom_slash[$post['divCode']]['result'] = $vpost;
                } else {
                    $val_zoom_slash[$post['divCode']]['result'] .= '/'.$vpost;
                }
               
                $i++;
            }
        }

        return $this->renderer->render('@EtatStatistiques/gestion-stat/detailEtatWsdl', [
            'menuActive'       => 'EtatStatistique',
            'post'                  => $post,
            'codEtat'               => $code_etat,
            'sourceById'            => $source_by_id,
            'array_req_filtre'      => $array_req_filtre,
            'type_affichage_onglet' => $type_affichage_onglet,
            'liste_final'           => $listeOxa,
            'periodeExist'          => $periode,
            'societeExist'          => $societe,
            'nbrListe'              => count($listeOxa),
            'val_zoom_multi'        => $val_zoom_slash,
            'centreLivraison'       => $liste->centreByType('LIVRAISON', $post, null, true),
            'centreEmission'        => $liste->centreByType('EMISSION', $post, null, true),
            'centreFacturation'     => $liste->centreByType('FACTURAT', $post, null, true),
            'acheteursListe'        => $acheteursListe
        ]);
    }

    public function ajaxAfficherWsdlAction() : string
    {
        $post      = $this->request->getParsedBody();
        $code_etat = $this->request->getAttribute('codEtat');
        $repositoryEtatStatistique = new \Modules\EtatStatistiques\Repository\EtatStat($this->pdo);
        
        $array_req_filtre = $repositoryEtatStatistique->array_req_filtre();
        $source_by_id     = $repositoryEtatStatistique->sourceById($code_etat);

        // Liste filtre by WSDL
        $xmlResult = new \Modules\EtatStatistiques\WebService\Statistique();
        
        // grace à notre retour wsdl ci-dessus on va alimenter un autre wsdl pour récupérer l'url
        $liste_etat_std_hc = $xmlResult->wsdlListeEtat_HC($code_etat, $post);

        $guId = Sql::guidGenerate();
        
        
        // parcour du wsdl de retour pour récuprer l'url est afficher le graphe.
        /** @var \SimpleXMLElement $xml */
        $xml = simplexml_load_string($liste_etat_std_hc->responseData, "SimpleXMLElement", LIBXML_NOCDATA);
        $urlcode  = (array) XmlHelper::normalize($xml);

        $param = '?uniq=' . Sql::guidGenerate();
        $param .= '&token=' . password_hash($_SESSION['Session_Login'].session_id(), PASSWORD_DEFAULT);


        
        if (array_key_exists('MsgErreur', $urlcode)) {
            $msgErreur = $urlcode['MsgErreur'];
            return json_encode(['Erreur' => true, 'msgErreur' => $msgErreur]);
        } else {
            if (!is_string($urlcode['NomFichier'])) {
                $urlcode['NomFichier'] = '';
            }
            
            $lien = $this->router->generateUri('GlobalApplication.ChargeDocument.chargeDocument', [
                'emplacement' => 'tmp',
                'urlFichier' => $urlcode['NomFichier'],
                'modeAffichage' => 0
            ]);

            return json_encode(['ok' => true, 'lien' => $lien]);
        }
    }
}
