<?php

namespace Modules\Additional\Specifique\Client155\Modules\Consultation\Controller;

use Entity\Model\AoEntet;
use Entity\Model\Hastutil;
use GuzzleHttp\Psr7\Response;
use Helpers\Outil\Outils;
use Helpers\Outil\Sql;
use Helpers\Trad\Trad;
use Modules\Consultation\Repository\AoEvent;
use Modules\Consultation\Repository\GestionConsultation;
use Modules\GlobalApplication\Repository\DocumentsRattaches;
use Modules\Additional\Specifique\Client155\Modules\Consultation\Outil\Consolidation;
use Modules\Additional\Specifique\Client155\Modules\Consultation\Repository\ConsolidationRepository;
use Skeleton\Controller\Controller;

class ConsolidationController extends Controller
{
    /**
     * @return mixed
     */
    public function consoliderPopupAction()
    {
        $post   = $this->request->getParsedBody();
        $id     = $this->request->getAttribute('id');
        $force  = $this->request->getAttribute('force') ?? 0;
        $trad = $this->getTranslationService();

        $gestionConsulRep   = new GestionConsultation($this->pdo);
        $consultation       = $gestionConsulRep->getInfoAo($id);
        $aoRepPijo          = new ConsolidationRepository($this->pdo);

        $grilles = $aoRepPijo->findGrille($id);

        $var = [];
        $var['AUTEUR'] = $_SESSION['Session_Login'];
        $var['CENTRE'] = $_SESSION["Session_CodeCtrLivraison"];
        $var['DT_PARUT'] = date('Ymd');
        $var['NO_AO'] = $id;

        $content = [];

        $error = '';
        $message = '';
        $pathToDocInt = '';

        $popupTitle = "{$trad->t('Consultation')} {$consultation['NO_AO']} : {$trad->t('Consolider les grilles')}";
        if (count($grilles) > 0) {
            $docAtt = new DocumentsRattaches($this->pdo);
            $listes = $docAtt->detail(str_pad($id, 9, '0', STR_PAD_LEFT), [
                'NO_DA' => 'AO_ENTET',
                'filter_TITRE' => mb_strtoupper("Grille consolidée", "UTF-8")
            ]);

            // $force pour forcer la consolidation dans le cas où une consolidation existe déjà
            if (count($listes) > 0 && !$force) {
                $error = $trad->t('Il existe déjà une grille consolidée pour cette consultation. Souhaitez-vous faire une nouvelle consolidation ?');
                $pathAjaxPopup = $this->router->generateUri('Specifique155.consolidation.consoliderPopup', [
                    'id' => $consultation['NO_AO'],
                    'force' => 1
                ]);

                return $this->renderer->render('@Specifique155.Consultation/popupConsolider', [
                    'message' => $message,
                    'error' => $error,
                    'confirmAction' => true,
                    'popupTitle' => $popupTitle,
                    'pathAjaxPopup' => $pathAjaxPopup,
                    'pathPopupErreur' => $this->router->generateUri('Ajax.Erreur.popupErreurAlerteEtAvertissement'),
                ]);
            }

            set_time_limit(0);
            ini_set('memory_limit', '500M');

            $consolidation = new Consolidation($this->pdo, $trad, $var);
            $consolidation->setGrilles($grilles);
            $consolidation->verifyEntries();

            if ($consolidation->isValid()) {
                $consolidation->treatment();

                if ($consolidation->getStatus()) {
                    $event = new AoEvent($this->pdo);
                    $event->rqInsertEventAO($id, 'GRI');

                    $message = $trad->t('Le fichier a bien été consolidée et ajouté dans les documents internes de la consultation');

                    $aoEntete = new AoEntet($this->pdo);

                    $test = $aoEntete->find($id);

                    if (! Sql::toBool($test['COMP_DOC_INT'])) {
                        // On rend l'onglet doc interne actif pour cette consultation
                        $aoEntete->update([
                            'numerique_COMP_DOC_INT' => '0x54'
                        ], $id);
                    }

                    $hastutil = new Hastutil($this->pdo);
                    $user = $hastutil->find($_SESSION['Session_Login'], ['EMAIL']);

                    $generatedLink = $this->router->generateUri('Consultation.Consultation.details', [
                        'idAO' => $id,
                        'onglet' => 'DocInt',
                    ]);

                    $absoluteLink = Outils::getRootUrl() . $generatedLink;

                    $params = [
                        'destinataires' => $user['EMAIL'],
                        'sujet' => $trad->t('Consolidation des grilles terminées'),
                        'message' => $trad->t('Bonjour').',<br><br>'.Trad::strBuild($trad->t('La génération de la grille consolidée pour la consultation n°@1@ est terminée.'), $id).'<br><br> '.$trad->t('Elle est disponible dans les documents internes de votre consultation.').' <br><br>  '.$trad->t('Vous pouvez y accéder directement en suivant le lien :').'  <a href="'.$absoluteLink .'">'.$absoluteLink .'</a> ',
                    ];

                    $envoiMail = \Modules\Ajax\Controller\MailController::envoiMail($params);
                    if ($envoiMail->Retour=="O") {
                        return new Response(
                            200,
                            [],
                            $this->renderer->render('@Specifique155.Consultation/popupConsolider', [
                                'mail' => $envoiMail->Retour,
                                'file' => $consolidation->getFilesOnErrors(),
                                'titre' => $popupTitle,
                                'message' => $trad->t('Votre document est en cours de génération, vous allez recevoir un mail lorsque le traitement sera terminé.'),
                                'pathPopupErreur' => $this->router->generateUri('Ajax.Erreur.popupErreurAlerteEtAvertissement'),
                            ])
                        );
                    } else {
                        return new Response(
                            200,
                            [],
                            $this->renderer->render('@Specifique155.Consultation/popupConsolider', [
                                'message' => $trad->t('Votre document est en cours de génération, cependant une erreur a eu lieu concernant l\'envoie de mail.').'<br>'.$envoiMail->MsgErreur,
                                'pathPopupErreur' => $this->router->generateUri('Ajax.Erreur.popupErreurAlerteEtAvertissement'),
                            ])
                        );
                    }
                } else {
                    $error = implode('<br>', $consolidation->getErrors());
                }
            } else {
                $error = implode('<br>', $consolidation->getErrors());
            }
        } else {
            $error = $trad->t("Il n'y a pas de grille à consolider pour cette consultation.");
        }

        return new Response(
            443,
            [],
            $this->renderer->render('@Specifique155.Consultation/popupConsolider', [
                'message' => $message,
                'error' => $error,
                'popupTitle' => $popupTitle,
                'pathPopupErreur' => $this->router->generateUri('Ajax.Erreur.popupErreurAlerteEtAvertissement'),
            ])
        );
    }
}
