<?php

namespace Modules\Additional\Specifique\Client95\Modules\EtatStatistique\Controller;

use GuzzleHttp\Psr7\Response;
use Skeleton\Controller\Controller;
use Modules\Additional\Specifique\Client95\Modules\EtatStatistique\Repository\Reporting;
use Modules\Additional\Specifique\Client95\Modules\EtatStatistique\Service\EtatStatistiqueService;
use Helpers\Ariane\Ariane;
use Helpers\Highcharts\Highcharts;
use Helpers\Outil\Date;
use Helpers\Pagination\Paginator;
use Helpers\Pagination\PaginatorGestion;
use Helpers\Trad\Trad;
use Helpers\Validator\Validator;

class EtatStatistiqueController extends Controller
{
    /**
     * service
     *
     * @var EtatStatistiqueService
     */

    private $service;
    /**
     * reporting
     *
     * @var Reporting
     */

    private $reporting;
    /**
     * validator
     *
     * @var Validator
     */

    private $validator;
    /**
     * paginator
     *
     * @var PaginatorGestion
     */
    private $paginator;

    /**
     * dateConverter
     *
     * @var Date
     */
    private $dateConverter;


    /**
     *
     * Gestion des droits, service et repository
     *
     * init
     *
     * @return void
     */
    public function init()
    {
        $this->service = new EtatStatistiqueService($this->pdo);
        $this->reporting = new Reporting($this->pdo);
        $this->validator = $this->createValidator();
        $this->paginator = new PaginatorGestion();
        $this->dateConverter = new Date();
    }

    /**
     * suiviBudgetaireAction
     *
     * @return string|Response
     */
    public function suiviBudgetaireAction()
    {
        $trad = $this->getTranslationService();
        $post = $this->request->getParsedBody();
        $action = $this->request->getAttribute('action');

        if ($action != 'export') {
            $this->paginator->generate(15, 'RESPONSABLE_CTA', 'ASC');
        }

        // si aucune période ou aucune date n'a été sélectionnée on les initie à la période actuelle et date du jour
        Date::dateToSql($post['date_fin']);
        $endDate = $post['date_fin'] != '' ? $post['date_fin'] : date('Ymd');
        if (isset($post['periode']) && $post['periode'] != '') {
            $period = $post['periode'];
        } else {
            $period = date('Y');
        }

        // contrôle sur l'existence des CS Responsable de centre et Nature des dépenses
        // $responsableNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_CENTRANA_HASTUTIL');
        // $natureDepenseNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_SSCPTANA_NATURE_DEPENSES');
        // if (!$responsableNumCS || !$natureDepenseNumCS) {
        //     $this->validator->setError($trad->t('Le paramétrage des champs supplémentaires nécessaires à cette fonction est manquant.'));
        // }

        $data = $this->reporting->budgetMonitoring($_SESSION['Session_Login'], $period, $endDate, $post);
        $subTotalsTmp = $this->reporting->budgetMonitoringTotals($_SESSION['Session_Login'], $period, $endDate, true);
        $totals = $this->reporting->budgetMonitoringTotals($_SESSION['Session_Login'], $period, $endDate);
        $tableColumns = $this->getTableColumns($period, $endDate);

        foreach ($subTotalsTmp as $value) {
            $subTotals[$value['LIBELLE']] = $value;
        }

        Ariane::generate(1, $trad->t('Suivi budgétaire'), $post);

        if ($action == 'afficher') {
            // on contrôle que la date choisie est bien dans la période choisie et n'est pas supérieure à la date du jour
            $this->validator->isDateLessThanToday($endDate, $trad->t('Date de fin'));
            $checkDate = $this->service->checkDate($period, $endDate);

            if ($this->validator->isValid() && $checkDate == true) {
                $data = $this->reporting->budgetMonitoring($_SESSION['Session_Login'], $period, $endDate, $post);
                $subTotalsTmp = $this->reporting->budgetMonitoringTotals($_SESSION['Session_Login'], $period, $endDate, true);
                // on modifie les index des sous-totaux pour lier les valeurs aux codes des centres
                foreach ($subTotalsTmp as $value) {
                    $subTotals[$value['LIBELLE']] = $value;
                }
                $totals = $this->reporting->budgetMonitoringTotals($_SESSION['Session_Login'], $period, $endDate);

                $infoPagination = PaginatorGestion::getInfoPagination();

                return new Response(443, [], (string) \json_encode([
                    'post'  => $post,
                    'path'  => $this->router->generateUri('Specifique95.EtatStatistique.suiviBudgetaire', [
                        'tableau'           => $data,
                        'infoPagination'    => $infoPagination,
                    ])
                ]));
            } else {
                // si l'erreur ne vient pas du validator, c'est que la date n'est pas dans la période choisie
                $error = $this->validator->getError() == '' ? $trad->t('La date de fin sélectionnée doit être contenue dans la période choisie.') : $this->validator->getError();
                return $this->renderer->render('@popup-erreur/ErreurCreation', [
                    'ErreurValid' => $error,
                ]);
            }
        } elseif ($action == 'export') {
            $data = $this->service->formatDataForExport($data);
            $tableau = [];

            foreach ($data as $ligneExport) {
                $tableau[] = [
                    'RESPONSABLE_CTA'                   => $ligneExport['RESPONSABLE_CTA'],
                    'CENTRE_ANALYSE'                    => $ligneExport['CENTRE_ANALYSE'],
                    'COMPTE'                            => $ligneExport['COMPTE'],
                    'BUDGET'                            => $ligneExport['BUDGET'],
                    'BUDGET_N_1'                        => $ligneExport['BUDGET_N_1'],
                    'ENGAGE'                            => $ligneExport['ENGAGE'],
                    'ENGAGE_N_1'                        => $ligneExport['ENGAGE_N_1'],
                    'ECART_ENGAGE_EUROS'                => $ligneExport['ECART_ENGAGE_EUROS'],
                    'ECART_ENGAGE_PRCT'                 => $ligneExport['ECART_ENGAGE_PRCT'],
                    'BUDGET_RESTANT_EURO'               => $ligneExport['BUDGET_RESTANT_EURO'],
                    'BUDGET_RESTANT_PRCT'               => $ligneExport['BUDGET_RESTANT_PRCT'],
                    'FACTURE'                           => $ligneExport['FACTURE'],
                    'FACTURE_N_1'                       => $ligneExport['FACTURE_N_1'],
                    'ECART_FACTURE_EUROS'               => $ligneExport['ECART_FACTURE_EUROS'],
                    'ECART_FACTURE_PRCT'                => $ligneExport['ECART_FACTURE_PRCT'],
                    'BUDGET_RESTANT_FACTURE_EURO'       => $ligneExport['BUDGET_RESTANT_FACTURE_EURO'],
                    'BUDGET_RESTANT_FACTURE_PRCT'       => $ligneExport['BUDGET_RESTANT_FACTURE_PRCT'],
                    'INDICATEUR_ALERTE'                 => $ligneExport['INDICATEUR_ALERTE'],
                    'PRCT_CONSO'                        => $ligneExport['PRCT_CONSO'],
                    'RESTE_A_FACTURER'                  => $ligneExport['RESTE_A_FACTURER'],
                ];
            }
            
            \Helpers\ExportTo\Outils::gestionEmailAsync2(
                'reporting_suivi_budgetaire_' . date('Ymd'),
                $tableau,
                $this->JWTKEY,
                $this->router,
                $this->getTranslationService(),
                $tableColumns
            );
            
            return new Response();
        } else {
            $infoPagination = PaginatorGestion::getInfoPagination();

            return $this->renderer->render('@specifique95/suiviBudgetaire', [
                'menuActive'        => 'Etats Statistiques',
                'tableau'           => $data,
                'infoPagination'    => $infoPagination,
                'post'              => $post,
                'period'            => $period,
                'dateFin'           => $endDate,
                'totaux'            => $totals,
                'subTotals'         => $subTotals ?? [],
                'tableColumns'      => $tableColumns,
                'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
            ]);
        }
    }

    /**
     * analyseFactureAction
     *
     * @return string|Response
     */
    public function analyseFactureAction()
    {
        $trad = $this->getTranslationService();
        $post = $this->request->getParsedBody();
        $action = $this->request->getAttribute('action');

        // si aucune période ou aucune date n'a été sélectionnée on les initie à la période actuelle et date du jour
        Date::dateToSql($post['date_fin']);
        $endDate = $post['date_fin'] != '' ? $post['date_fin'] : date('Ymd');
        if (isset($post['periode']) && $post['periode'] != '') {
            $period = $post['periode'];
        } else {
            $period = date('Y');
        }

        // contrôle sur l'existence des CS Responsable de centre et Nature des dépenses
        // $responsableNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_CENTRANA_HASTUTIL');
        // $natureDepenseNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_SSCPTANA_NATURE_DEPENSES');
        // if (!$responsableNumCS || !$natureDepenseNumCS) {
        //     $this->validator->setError($trad->t('Le paramétrage des champs supplémentaires nécessaires à cette fonction est manquant.'));
        // }

        $this->validator->isDateLessThanToday($endDate, $trad->t('Date de fin'));
        $checkDate = $this->service->checkDate($period, $endDate);

        if ($this->validator->isValid() && $checkDate == true) {
            $tempData = $this->reporting->invoiceAnalysis($period, $endDate);

            foreach ($tempData as &$value) {
                if ($value['PERIODE'] != $period) {
                    $value['FACTURE_N_1'] = $value['FACTURE'];
                    $value['BUDGET_N_1'] = round($value['BUDGET'], 2);
                    unset($value['FACTURE']);
                    unset($value['BUDGET']);
                    $data[$value['CENTRE_ANALYSE']]['FACTURE_N_1'] = $value['FACTURE_N_1'];
                    $data[$value['CENTRE_ANALYSE']]['BUDGET_N_1'] = round($value['BUDGET_N_1'], 2);
                } else {
                    $data[$value['CENTRE_ANALYSE']]['FACTURE'] = $value['FACTURE'];
                    $data[$value['CENTRE_ANALYSE']]['BUDGET'] = round($value['BUDGET'], 2);
                }
            }

            $highchart = [
                'value'         => $data ?? [],
                'titre'         => Trad::strBuild($trad->t('Budget @1@ - Analyse du facturé au @2@'), $period, $this->dateConverter->dateConverte($endDate)),
                'type'          => 'column',
                'categorie'     => array_keys($data ?? []),
                'detailColone'  => [
                    'FACTURE'       => ['nom'   => Trad::strBuild($trad->t('Facturé @1@'), $period), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#0008ff'],
                    'BUDGET'        => ['nom'   => Trad::strBuild($trad->t('Budget @1@'), $period), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#ff6800'],
                    'FACTURE_N_1'   => ['nom'   => Trad::strBuild($trad->t('Facturé @1@'), $period - 1), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#00bdff'],
                    'BUDGET_N_1'    => ['nom'   => Trad::strBuild($trad->t('Budget @1@'), $period - 1), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#ffc100']
                ],
                'legendGraph'   => ['' => ['texte' => $trad->t('Montant'), 'format' => ' ' . $_SESSION['parametrage']['DEVISE_BASE'], 'axe' => 'gauche']],
            ];

            $highchart = Highcharts::generate($highchart, $this->pdo, $trad);
            Ariane::generate(1, $trad->t('Analyse facturé'), $post);
        } else {
            // si l'erreur ne vient pas du validator, c'est que la date n'est pas dans la période choisie
            $error = $this->validator->getError() == '' ? $trad->t('La date de fin sélectionnée doit être contenue dans la période choisie.') : $this->validator->getError();
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $error,
            ]);
        }

        if ($action == 'afficher') {
            return new Response(443, [], (string) \json_encode([
                'post'  => $post,
                'path'  => $this->router->generateUri('Specifique95.EtatStatistique.analyseFacture', [
                    'menuActive'        => 'Etats Statistiques',
                    'post'              => $post,
                    'period'            => $period,
                    'dateFin'           => $endDate,
                    'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                    'dataHighchart'     => $highchart,
                ])
            ]));
        } else {
            return $this->renderer->render('@specifique95/analyseFacture', [
                'menuActive'        => 'Etats Statistiques',
                'post'              => $post,
                'period'            => $period,
                'dateFin'           => $endDate,
                'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                'dataHighchart'     => $highchart,
            ]);
        }
    }

    /**
     * analyseEngageAction
     *
     * @return string|Response
     */
    public function analyseEngageAction()
    {
        $trad = $this->getTranslationService();
        $post = $this->request->getParsedBody();
        $action = $this->request->getAttribute('action');

        // si aucune période ou aucune date n'a été sélectionnée on les initie à la période actuelle et date du jour
        Date::dateToSql($post['date_fin']);
        $endDate = $post['date_fin'] != '' ? $post['date_fin'] : date('Ymd');
        if (isset($post['periode']) && $post['periode'] != '') {
            $period = $post['periode'];
        } else {
            $period = date('Y');
        }

        // contrôle sur l'existence des CS Responsable de centre et Nature des dépenses
        // $responsableNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_CENTRANA_HASTUTIL');
        // $natureDepenseNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_SSCPTANA_NATURE_DEPENSES');
        // if (!$responsableNumCS || !$natureDepenseNumCS) {
        //     $this->validator->setError($trad->t('Le paramétrage des champs supplémentaires nécessaires à cette fonction est manquant.'));
        // }

        $this->validator->isDateLessThanToday($endDate, $trad->t('Date de fin'));
        $checkDate = $this->service->checkDate($period, $endDate);

        if ($this->validator->isValid() && $checkDate == true) {
            $tempData = $this->reporting->orderAnalysis($period, $endDate);

            foreach ($tempData as &$value) {
                if ($value['PERIODE'] != $period) {
                    $value['ENGAGE_N_1'] = $value['ENGAGE'];
                    $value['BUDGET_N_1'] = round($value['BUDGET'], 2);
                    unset($value['ENGAGE']);
                    unset($value['BUDGET']);
                    $data[$value['CENTRE_ANALYSE']]['ENGAGE_N_1'] = $value['ENGAGE_N_1'];
                    $data[$value['CENTRE_ANALYSE']]['BUDGET_N_1'] = round($value['BUDGET_N_1'], 2);
                } else {
                    $data[$value['CENTRE_ANALYSE']]['ENGAGE'] = $value['ENGAGE'];
                    $data[$value['CENTRE_ANALYSE']]['BUDGET'] = round($value['BUDGET'], 2);
                }
            }

            $highchart = [
                'value'         => $data ?? [],
                'titre'         => Trad::strBuild(addslashes($trad->t('Budget @1@ - Analyse de l\'engagé au @1@')), $period, $this->dateConverter->dateConverte($endDate)),
                'type'          => 'column',
                'categorie'     => array_keys($data ?? []),
                'detailColone'  => [
                    'ENGAGE'        => ['nom'   => Trad::strBuild($trad->t('Engagé @1@'), $period), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#0008ff'],
                    'BUDGET'        => ['nom'   => Trad::strBuild($trad->t('Budget @1@'), $period), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#ff6800'],
                    'ENGAGE_N_1'    => ['nom'   => Trad::strBuild($trad->t('Engagé @1@'), $period - 1), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#00bdff'],
                    'BUDGET_N_1'    => ['nom'   => Trad::strBuild($trad->t('Budget @1@'), $period - 1), 'axeLier' => 'gauche', 'index' => 4, 'color' => '#ffc100']
                ],
                'legendGraph'   => ['' => ['texte' => $trad->t('Montant'), 'format' => ' ' . $_SESSION['parametrage']['DEVISE_BASE'], 'axe' => 'gauche']],
            ];

            $highchart = Highcharts::generate($highchart, $this->pdo, $trad);

            Ariane::generate(1, $trad->t('Analyse engagé'), $post);
        } else {
            // si l'erreur ne vient pas du validator, c'est que la date n'est pas dans la période choisie
            $error = $this->validator->getError() == '' ? $trad->t('La date de fin sélectionnée doit être contenue dans la période choisie.') : $this->validator->getError();
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $error,
            ]);
        }

        if ($action == 'afficher') {
            return new Response(443, [], (string) \json_encode([
                'post'  => $post,
                'path'  => $this->router->generateUri('Specifique95.EtatStatistique.analyseEngage', [
                    'menuActive'        => 'Etats Statistiques',
                    'post'              => $post,
                    'period'            => $period,
                    'dateFin'           => $endDate,
                    'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                    'dataHighchart'     => $highchart,
                ])
            ]));
        } else {
            return $this->renderer->render('@specifique95/analyseEngage', [
                'menuActive'        => 'Etats Statistiques',
                'post'              => $post,
                'period'            => $period,
                'dateFin'           => $endDate,
                'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                'dataHighchart'     => $highchart,
            ]);
        }
    }

    /**
     * analyseEngageFactureAction
     *
     * @return string|Response
     */
    public function analyseEngageFactureAction()
    {
        $trad = $this->getTranslationService();
        $post = $this->request->getParsedBody();
        $action = $this->request->getAttribute('action');

        // on initie les filtres sur comptes ou centres d'analyse
        $perimeters = [
            ''                  => $trad->t('Sélectionnez un type'),
            'CENTRE_ANALYSE'    => $trad->t('Centre d\'analyse'),
            'COMPTE'            => $trad->t('Compte'),
        ];

        if (count($post) > 0) {
            if ($post['perimeter'] == '') {
                $this->validator->setError($trad->t('Sélectionnez un périmètre d\'analyse'));
            } else {
                if ($post['perimeter'] == 'CENTRE_ANALYSE') {
                    $this->validator->zoom('CENTRANA', $post['centre'], $trad->t('Centre d\'analyse'), $this->pdo);
                    $perimeter = $post['centre'];
                    $titleScope = Trad::strBuild(addslashes($trad->t('Centre d\'analyse @1@')), $post['text_centre']);
                } elseif ($post['perimeter'] == 'COMPTE') {
                    $this->validator->zoom('SSCPTANA', $post['compte'], $trad->t('Compte'), $this->pdo);
                    $perimeter = $post['compte'];
                    $titleScope = Trad::strBuild($trad->t('Compte @1@'), $post['text_compte']);
                }
            }
        }

        // si aucune période ou aucune date n'a été sélectionnée on les initie à la période actuelle et date du jour
        Date::dateToSql($post['date_fin']);
        $endDate = $post['date_fin'] != '' ? $post['date_fin'] : date('Ymd');
        if (isset($post['periode']) && $post['periode'] != '') {
            $period = $post['periode'];
        } else {
            $period = date('Y');
        }

        // contrôle sur l'existence des CS Responsable de centre et Nature des dépenses
        // $responsableNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_CENTRANA_HASTUTIL');
        // $natureDepenseNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_SSCPTANA_NATURE_DEPENSES');
        // if (!$responsableNumCS || !$natureDepenseNumCS) {
        //     $this->validator->setError($trad->t('Le paramétrage des champs supplémentaires nécessaires à cette fonction est manquant.'));
        // }

        $this->validator->isDateLessThanToday($endDate, $trad->t('Date de fin'));
        $checkDate = $this->service->checkDate($period, $endDate);

        if ($this->validator->isValid() && $checkDate == true) {
            $data = $this->service->orderOnInvoicesAnalysis($period, $endDate, $post['perimeter'] ?? '', $perimeter ?? '');
            $budget = $this->reporting->getBudgetByScope($period, $post['perimeter'] ?? '', $perimeter ?? '');

            $title = ($titleScope ?? '') . ' - ' . Trad::strBuild(addslashes($trad->t('Analyse de l\'engagé / facturé au @1@')), $this->dateConverter->dateConverte($endDate)) . ' - ' . Trad::strBuild($trad->t('Budget @1@ : @2@ €'), $period, number_format($budget, 2, ',', ' '));

            $highchart = [
                'value'         => $data,
                'titre'         => $title,
                'type'          => 'area',
                'categorie'     => 'mois',
                'detailColone'  => [
                    'ENGAGE'   => ['nom'   => Trad::strBuild($trad->t('Engagé'), $period), 'axeLier' => 'gauche'],
                    'FACTURE'  => ['nom'   => Trad::strBuild($trad->t('Facturé'), $period), 'axeLier' => 'gauche']
                ],
                'legendGraph'   => ['' => ['texte' => $trad->t('Montant'), 'format' => ' ' . $_SESSION['parametrage']['DEVISE_BASE'], 'axe' => 'gauche']],
            ];

            $highchart = Highcharts::generate($highchart, $this->pdo, $trad);

            Ariane::generate(1, $trad->t('Analyse engagé / facturé'), $post);
        } else {
            // si l'erreur ne vient pas du validator, c'est que la date n'est pas dans la période choisie
            $error = $this->validator->getError() == '' ? $trad->t('La date de fin sélectionnée doit être contenue dans la période choisie.') : $this->validator->getError();
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $error,
            ]);
        }

        if ($action == 'afficher') {
            return new Response(443, [], (string) \json_encode([
                'post'  => $post,
                'path'  => $this->router->generateUri('Specifique95.EtatStatistique.analyseEngageFacture', [
                    'menuActive'        => 'Etats Statistiques',
                    'post'              => $post,
                    'period'            => $period,
                    'dateFin'           => $endDate,
                    'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                    'dataHighchart'     => $highchart,
                    'perimeters'        => $perimeters,
                ])
            ]));
        } else {
            return $this->renderer->render('@specifique95/analyseEngageFacture', [
                'menuActive'        => 'Etats Statistiques',
                'post'              => $post,
                'period'            => $period,
                'dateFin'           => $endDate,
                'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                'dataHighchart'     => $highchart,
                'perimeters'        => $perimeters,
            ]);
        }
    }

    /**
     * engageParCategorieDepenseAction
     *
     * @return string|Response
     */
    public function engageParCategorieDepenseAction()
    {
        $trad = $this->getTranslationService();
        $post = $this->request->getParsedBody();
        $action = $this->request->getAttribute('action');

        // si aucune période ou aucune date n'a été sélectionnée on les initie à la période actuelle et date du jour
        Date::dateToSql($post['date_fin']);
        $endDate = $post['date_fin'] != '' ? $post['date_fin'] : date('Ymd');
        if (isset($post['periode']) && $post['periode'] != '') {
            $period = $post['periode'];
        } else {
            $period = date('Y');
        }

        // contrôle sur l'existence des CS Responsable de centre et Nature des dépenses
        // $responsableNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_CENTRANA_HASTUTIL');
        // $natureDepenseNumCS = ChampSupp::getnumFixCsScpefique($this->pdo, 'PARNCS0095', 'NCS_SSCPTANA_NATURE_DEPENSES');
        // if (!$responsableNumCS || !$natureDepenseNumCS) {
        //     $this->validator->setError($trad->t('Le paramétrage des champs supplémentaires nécessaires à cette fonction est manquant.'));
        // }

        $this->validator->isDateLessThanToday($endDate, $trad->t('Date de fin'));
        $checkDate = $this->service->checkDate($period, $endDate);

        if ($this->validator->isValid() && $checkDate == true) {
            $tempData = $this->reporting->orderOnExpenseCategory($period, $endDate);

            foreach ($tempData as &$value) {
                $data[] = [
                    'libelle'   => $value['libelle'],
                    'value'     => round($value['ENGAGE'], 2)
                ];
            }

            $highchart = [
                'value'         => $data ?? [],
                'detailDonut'  => [
                    'nom'   => Trad::strBuild($trad->t('Engagé'), $period),
                    'innerSize' => 0,
                    'tooltip' => ' ' . $_SESSION['parametrage']['DEVISE_BASE']
                ],
                'titre'         => Trad::strBuild(addslashes($trad->t('Engagé par catégorie de dépenses d\'exploitation : Budget @1@ au @2@')), $period, $this->dateConverter->dateConverte($endDate)),
                'legend'        => true,
                'type'          => 'pie',
                // 'categorie'     => array_keys($data) ?? [],
                // 'legendGraph'   => ['' => ['texte' => $trad->t('Montant'), 'format' => ' ' . $_SESSION['parametrage']['DEVISE_BASE'], 'axe' => 'gauche']],
            ];

            $highchart = Highcharts::generate($highchart, $this->pdo, $trad);

            Ariane::generate(1, $trad->t('Engagé par catégorie de dépenses'), $post);
        } else {
            // si l'erreur ne vient pas du validator, c'est que la date n'est pas dans la période choisie
            $error = $this->validator->getError() == '' ? $trad->t('La date de fin sélectionnée doit être contenue dans la période choisie.') : $this->validator->getError();
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $error,
            ]);
        }

        if ($action == 'afficher') {
            return new Response(443, [], (string)\json_encode([
                'post'  => $post,
                'path'  => $this->router->generateUri('Specifique95.EtatStatistique.engageParCategorieDepense', [
                    'menuActive'        => 'Etats Statistiques',
                    'post'              => $post,
                    'period'            => $period,
                    'dateFin'           => $endDate,
                    'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                    'dataHighchart'     => $highchart,
                ])
            ]));
        } else {
            return $this->renderer->render('@specifique95/engageParCategorieDepense', [
                'menuActive'        => 'Etats Statistiques',
                'post'              => $post,
                'period'            => $period,
                'dateFin'           => $endDate,
                'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
                'dataHighchart'     => $highchart,
            ]);
        }
    }

    /**
     * listeAction
     *
     * @return string
     */
    public function listeAction()
    {
        $trad = $this->getTranslationService();

        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');
        
        $data = $this->service->getZoomList($type, $post);
        
        $paginator = new Paginator();
        $infoPagination = $paginator->generate($data, 15, $post, $this->renderer);
        
        return $this->renderer->render('@specifique95/liste/' . $type, [
            'post'              => $post,
            'data'              => $data,
            'infoPagination'    => $infoPagination,
            'labelValide'       => $trad->t('Valide'),
        ]);
    }

    /**
     * getTableColumns
     *
     * @param  string $period
     * @param  string $endDate
     * @return array<mixed>
     */
    public function getTableColumns(string $period, string $endDate): array
    {
        $trad = $this->getTranslationService();

        return [
            'RESPONSABLE_CTA'               => $trad->t('Resp. Centre d\'analyse'),
            'CENTRE_ANALYSE'                => $trad->t('Centre d\'analyse'),
            'CODE_CDC'                      => $trad->t('Axe analytique'),
            'COMPTE'                        => $trad->t('Compte'),
            'BUDGET'                        => Trad::strBuild($trad->t('Budget @1@'), $period),
            'ENGAGE'                        => Trad::strBuild($trad->t('Engagé @1@'), $period),
            'ENGAGE_N_1'                    => Trad::strBuild($trad->t('Engagé @1@'), intval($period) - 1),
            'ECART_ENGAGE_EUROS'            => Trad::strBuild($trad->t('Ecart entre Engagé @1@ et @2@ en €'), $period, intval($period) - 1),
            'ECART_ENGAGE_PRCT'             => Trad::strBuild($trad->t('Ecart entre Engagé @1@ et @2@ en %'), $period, intval($period) - 1),
            'BUDGET_RESTANT_EURO'           => $trad->t('Budget restant / Engagé €'),
            'BUDGET_RESTANT_PRCT'           => $trad->t('Budget restant / Engagé %'),
            'FACTURE'                       => Trad::strBuild($trad->t('Facturé @1@'), $period),
            'FACTURE_N_1'                   => Trad::strBuild($trad->t('Facturé @1@'), intval($period) - 1),
            'ECART_FACTURE_EUROS'           => Trad::strBuild($trad->t('Ecart entre Facturé @1@ et @2@ €'), $period, intval($period) - 1),
            'ECART_FACTURE_PRCT'            => Trad::strBuild($trad->t('Ecart entre Facturé @1@ et @2@ %'), $period, intval($period) - 1),
            'BUDGET_RESTANT_FACTURE_EURO'   => $trad->t('Budget restant / Facturé €'),
            'BUDGET_RESTANT_FACTURE_PRCT'   => $trad->t('Budget restant / Facturé %'),
            'INDICATEUR_ALERTE'             => $trad->t('Ind. d\'alerte sur cons. budget %'),
            'PRCT_CONSO'                    => $trad->t('% de conso.'),
            'RESTE_A_FACTURER'              => Trad::strBuild($trad->t('Reste à facturer au @1@'), Date::dateConverte($endDate)),
        ];
    }
}
