<?php

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

use GuzzleHttp\Psr7\Response;
use Helpers\Outil\Roles;
use Skeleton\Controller\Controller;
use Modules\Additional\Specifique\Client158\Modules\EtatStatistique\Repository\Reporting;
use Modules\Additional\Specifique\Client158\Modules\EtatStatistique\Service\EtatStatistiqueService;
use Helpers\Ariane\Ariane;
use Helpers\ExportTo\Outils;
use Helpers\Trad\ITrad;
use Helpers\Pagination\PaginatorGestion;
use Helpers\Validator\Validator;

class EtatStatistiqueController extends Controller
{
    /**
     * trad
     *
     * @var ITrad
     */
    private $trad;
    /**
     * service
     *
     * @var EtatStatistiqueService
     */

    private $service;

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

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

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

    /**
     * suiviBudgetaireAction
     * L’état budgétaire recherchera les lignes commande pour les SI (Section) /SCA (comptes comptables) de chaque ligne budgétaire
     * qui ont au moins une date de livraison sur la période budgétaire demandée.
     *
     * @return string|Response
     */
    public function suiviBudgetaireAction()
    {
        $post = $this->request->getParsedBody();
        // La restitution se fera sous forme d’un écran spécifique PHP.  Un nouveau droit sera communiqué à Constructys.

        // si aucune période n'a été sélectionnée on les initie à la période actuelle
        $period = ($post['periode'] ?? '') != ''
            ? $post['periode']
            : date('Y');

        /** on récupère la liste des UO possibles pour l'utilisateur
         *  le filtre SI n'est pas obligatoire mais s'il n'est pas renseigné
         *  il faut filtrer la requête de base sur les UO accessibles à l'utilisateur
         */

        $uoList = $this->service->getUoList();

        $this->validator->zoom(
            'Periodes',
            $period,
            $this->trad->t('Période'),
            $this->pdo,
            false
        );

        if ($post['filter_CODE_SI'] ?? false) {
            $this->validator->zoom(
                'Sectimpu',
                $post['filter_CODE_SI'],
                $this->trad->t('Section d\'imputation'),
                $this->pdo,
                true,
            );
        }

        if ($post) {
            if (!$this->validator->isValid()) {
                $post['filter_CODE_SI'] = '';
            }
            (new PaginatorGestion())->generate(
                2,
                [
                    'CODE_SI'         => 'ASC',
                    'AXE_DEUX'        => 'ASC',
                    'NO_DA'           => 'ASC',
                    'NO_PO_DA'        => 'ASC'
                ],
                'ASC'
            );
            $data = $this->reporting->budgetMonitoring(
                $_SESSION['Session_Login'],
                $period,
                $uoList,
                $post
            );

            $infoPagination = PaginatorGestion::getInfoPagination();
        }

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

        return $this->renderer->render('@specifique158/suiviBudgetaire', [
            'menuActive'        => 'EtatStatistique',
            'tableau'           => $data ?? [],
            'infoPagination'    => $infoPagination ?? [],
            'post'              => $post,
            'period'            => $period,
            'totaux'            => $data ?? [],
            'devise'            => $_SESSION['parametrage']['DEVISE_BASE'],
            'CODE_STE'          => $_SESSION['Session_SocUsrProfil'],
        ]);
    }

    public function exportAction(): Response
    {
        $post = $this->request->getParsedBody();
        $period = ($post['periode'] ?? '') != ''
            ? $post['periode']
            : date('Y');

        $data = $this->reporting->budgetMonitoring(
            $_SESSION['Session_Login'],
            $period,
            $this->service->getUoList(),
            $post
        );

        $tableau = $this->service->getTableExport($data);
        $tableColumns = $this->service->getTableColumns();

        Outils::gestionEmailAsync2(
            'reporting_suivi_budgetaire_' . date('Ymd'),
            $tableau,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService(),
            $tableColumns
        );
        return new Response();
    }
}
