<?php

namespace App\Controller;

use App\Entity\Goal;
use App\Entity\Mainstay;
use App\Entity\Ministry;
use App\Entity\Performance;
use App\Entity\Rapport;
use App\Entity\Trend;
use App\Entity\Statut;
use App\Entity\Indice;
use App\Form\RapportIndicateurType;
use App\Form\RapportSuiviType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use PhpOffice\PhpWord\PhpWord;
use \PhpOffice\PhpWord\Shared\Html;
use App\Service\SettingsManager;
use App\Entity\Sigle;
use App\Form\SigleType;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\SimpleType\Jc;
use PhpOffice\PhpWord\SimpleType\VerticalJc;
use PhpOffice\PhpWord\Style\Language;
use PhpOffice\PhpWord\Shared\Converter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;

class RapportController extends AbstractController
{

    private $preambule;
    
    public function __construct(){
        $this->preambule=[
            ['code'=>'resume','name'=>'Résumé exécutif'],
            ['code'=>'introduction','name'=>'Introduction'],
            ['code'=>'methodologie','name'=>'Méthodologie']
        ];
    }
    
    /**
     * @Route("/app/rapport/indicateurs", name="app_rapport_indicateurs")
     */
    //@IsGranted("ROLE_MANAGER")
    public function indicateursAction(Request $request, SettingsManager $settingsManager)
    {
        $year = $settingsManager->getYear($request->getSession()->get('_year'));
        $rapport = $this->getDoctrine()->getRepository(Rapport::class)->findOneBy(['year' => $year,'type'=>'Indicateur']);
        $piliers = $this->getDoctrine()->getRepository(Mainstay::class)->findAll();
        $odds = $this->getDoctrine()->getRepository(Goal::class)->findAll();

        $form = $this->createForm(RapportIndicateurType::class, $rapport);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $rapport = $form->getData();
            $rapport->setYear($year);
            $rapport->setType("Indicateur");

            foreach ($piliers as $pilier) {
                $performance = $this->getDoctrine()->getRepository(Performance::class)->findOneBy(['year' => $year,'mainstay' => $pilier, 'desagregation' => NULL]);
                if (! $performance){
                    $performance = new Performance();
                    $performance->setYear($year);
                    $performance->setMainstay($pilier);
                }
                $performance->setPerformance($request->get('performance'.$pilier->getId()));
                $performance->setAnalyse($request->get('analyse'.$pilier->getId()));
                $this->getDoctrine()->getManagerForClass(Performance::class)->persist($performance);
            }

            foreach ($odds as $odd) {
                $performance = $this->getDoctrine()->getRepository(Performance::class)->findOneBy(['year' => $year,'goal' => $odd, 'desagregation' => NULL]);
                if (! $performance){
                    $performance = new Performance();
                    $performance->setYear($year);
                    $performance->setGoal($odd);
                }
                $performance->setPerformance($request->get('odd'.$odd->getCode()));
                $this->getDoctrine()->getManagerForClass(Performance::class)->persist($performance);
            }

            $this->getDoctrine()->getManagerForClass(Rapport::class)->persist($rapport);
            $this->getDoctrine()->getManagerForClass(Rapport::class)->flush();

            $this->addFlash('success', 'Rapport des indicateur enregistré avec succès');
            return $this->redirectToRoute('app_rapport_indicateurs');
        }
        return $this->render('rapport/indicateurs.html.twig', [
            'year' => $year,
            'piliers' => $piliers,
            'odds' => $odds,
            'etat' => $year ? !$year->getRapport() : true,
            'form' => $form->createView(),
        ]);
    }
    
    /**
     * @Route("/app/rapport/telecharger_indicateurs", name="telecharger_indicateurs")
     * @IsGranted("ROLE_MANAGER")
     */
    public function telechargerIndicateursAction(Request $request, SettingsManager $settingsManager)
    {
        
        // Show the default reporting except from warnings
        error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);
        $year = $settingsManager->getYear($request->getSession()->get('_year'));

        $rapport = $this->getDoctrine()->getRepository(Rapport::class)->findOneBy(['year' => $year, 'type'=>'Indicateur']);
        
        // New Word document
        $phpWord = $phpWord = new PhpWord();
        $phpWord->setDefaultFontName('Arial');
        $phpWord->setDefaultFontSize(12);
        $phpWord->addParagraphStyle('p2Style', array('align'=>'both', 'spaceAfter'=>100));
        $phpWord->getSettings()->setDecimalSymbol(',');
        $phpWord->getSettings()->setThemeFontLang(new Language(Language::FR_FR));
        $phpWord->getSettings()->setUpdateFields(true);
        $cellRowSpan = array('vMerge' => 'restart');
        $cellRowContinue = array('vMerge' => 'continue');
        $cellColSpan = array('gridSpan' => 4);

        $tableStyle = array('borderSize'  => 2);
        $firstRowStyle = array('bold' => true);
        $phpWord->addTableStyle('myTable', $tableStyle, $firstRowStyle);


        /*$phpWord->addNumberingStyle(
            'hNum',
            array('type' => 'multilevel', 'levels' => array(
                array('pStyle' => 'Heading1', 'format' => 'decimal', 'text' => '%1'),
                array('pStyle' => 'Heading2', 'format' => 'decimal', 'text' => '%1.%2'),
                array('pStyle' => 'Heading3', 'format' => 'decimal', 'text' => '%1.%2.%3'),
                )
            )
        );
        $phpWord->addTitleStyle(1, array('size' => 16), array('numStyle' => 'hNum', 'numLevel' => 0));
        $phpWord->addTitleStyle(2, array('size' => 14), array('numStyle' => 'hNum', 'numLevel' => 1));
        $phpWord->addTitleStyle(3, array('size' => 12), array('numStyle' => 'hNum', 'numLevel' => 2));*/

        

        

        // Define styles
        $phpWord->addTitleStyle(0, array('size' => 14, 'bold' => true));
        $phpWord->addTitleStyle(1, array('size' => 14, 'bold' => true));
        $phpWord->addTitleStyle(2, array('size' => 13, 'bold' => true));
        $phpWord->addTitleStyle(3, array('size' => 12, 'bold' => true));
        $phpWord->addTitleStyle(4, array('size' => 12, 'bold' => true));

        // Page de garde
        $section = $phpWord->addSection(array('vAlign' => VerticalJc::CENTER));
        $section->addText('RAPPORT SUR LES INDICATEURS DES OBJECTIFS DE DEVELOPPEMENT DURABLE DU BENIN, '.$year->getName(),
                            array('size' => 16,'bold' => true),
                            array('align' => 'center'));
        //$section->addPageBreak();

        //footer
        $section = $phpWord->addSection();

        // Sommaire
        $section->getStyle()->setPageNumberingStart(1);
        $footer = $section->addFooter();
        $textRun = $footer->addTextRun(array('alignment' => 'right'));
        $textRun->addField('PAGE', array('format' => 'roman'));

        $section->addTitle('Sommaire', 1);
        $section->addTextBreak(1);
        $toc = $section->addTOC();
        $toc->setMinDepth(1);
        $toc->setMaxDepth(1);

        //Add content
        $section->addPageBreak();
        $section->addTitle('Liste des sigles et abréviations', 1);
        $section->addTextBreak(1);
        $sigles = $this->getDoctrine()->getRepository(Sigle::class)->findBy([], ['code' => 'ASC']);
        $table = $section->addTable();
        foreach ($sigles as $sigle) {
            $table->addRow();
            $table->addCell()->addText($sigle->getCode());
            $table->addCell()->addText($sigle->getName());
        }

        $section->addPageBreak();
        $section->addTitle('Liste des tableaux', 1);
        $section->addTextBreak(1);

        $section->addPageBreak();
        $section->addTitle('Liste des figures', 1);
        $section->addTextBreak(1);

        $section->addPageBreak();
        $section->addTitle('Résumé exécutif', 1);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport ? $rapport->getResume(): '', false, false);

        $section = $phpWord->addSection();
        $footer = $section->addFooter();
        $textRun = $footer->addTextRun(array('alignment' => 'right'));
        $textRun->addField('PAGE', array('format' => 'arabic'));
        $section->getStyle()->setPageNumberingStart(1);

        $section->addTitle('Introduction', 1);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport ? $rapport->getIntroduction() : '', false, false);

        $section->addTitle('Méthodologie générale', 1);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport ? $rapport->getMethodologie() : '', false, false);

        $section->addTitle('I. Indices et tableaux de bord des ODD', 1);
        $section->addTitle('1.1. Performances globales', 2);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport? $rapport->getPerformanceGlobale():'', false, false);

        $section->addTitle('1.2. Performances par pilier', 2);
        $piliers = $this->getDoctrine()->getRepository(Mainstay::class)->findAll();
        foreach ($piliers as $pilier) {
            $section->addTextBreak(1);
            $section->addTitle('1.2.'.$pilier->getId().' '.$pilier->getName(), 3);
            $section->addTextBreak(1);
            Html::addHtml($section, $settingsManager->performancePilier ? $settingsManager->performancePilier($pilier, $year)->getPerformance() : '', false, false);
            $section->addText('Tableau '.$pilier->getId().' : Performance des cibles du pilier « '.$pilier->getName().' »');
            $table = $section->addTable('myTable');
            $table->addRow();
            $table->addCell()->addText("ODD/Cibles");
            $table->addCell()->addText("Valeur");
            $table->addCell()->addText("Statut");
            $table->addCell()->addText("Trend");
            foreach ($pilier->getGoals() as $goal) {
                $table->addRow();
                $trend = $this->getDoctrine()->getRepository(Trend::class)->findOneByValue($settingsManager->getGoalTrend($year->getName(), $goal));
                $trend = $trend ? $trend->getFlag() : '-';
                $statut = $this->getDoctrine()->getRepository(Statut::class)->findOneByValue($settingsManager->getGoalStatut($year->getName(), $goal));
                $statut= $statut ? $statut->getFlag() : '-';

                $table->addCell()->addText("ODD ".$goal->getCode()." ".$goal->getName());
                $table->addCell()->addText($settingsManager->getGoalIndice($year->getName(), $goal, 'rec', 1, null) ? round($settingsManager->getGoalIndice($year->getName(), $goal, 'rec', 1, null),2) : '-');
                if($statut != '-'){
                    $table->addCell()->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$statut.'.png', array('width'=> 24));
                }else{
                    $table->addCell()->addText($statut);
                }
                if($trend !='-'){
                    $table->addCell()->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$trend.'.png', array('width'=> 24));
                }else{
                    $table->addCell()->addText($trend);
                }

                
                foreach ($goal->getTargets() as $target) {
                    $trend = $this->getDoctrine()->getRepository(Trend::class)->findOneByValue($settingsManager->getTargetTrend($year->getName(), $target));
                    $trend= $trend ? $trend->getFlag() : '-';
                    $statut = $this->getDoctrine()->getRepository(Statut::class)->findOneByValue($settingsManager->getTargetStatut($year->getName(), $target));
                    $statut= $statut ? $statut->getFlag() : '-';

                    $table->addRow();
                    $table->addCell()->addText($target->getCode()." ".$target->getName());
                    $table->addCell()->addText($settingsManager->getTargetIndice($year->getName(), $target, 'rec') ? round($settingsManager->getTargetIndice($year->getName(), $target, 'rec'), 2) : '-');
                    if($statut != '-'){
                        $table->addCell()->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$statut.'.png', array('width'=> 24));
                    }else{
                        $table->addCell()->addText($statut);
                    }
                    if($trend !='-'){
                        $table->addCell()->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$trend.'.png', array('width'=> 24));
                    }else{
                        $table->addCell()->addText($trend);
                    }
                }
            }
        }
        $section->addTextBreak(1);
        $i=2;
        foreach ($piliers as $pilier) {
            $section->addTitle($settingsManager->numberToRoman($i).'. '.$pilier->getName(), 1);
            $section->addTextBreak(1);
            Html::addHtml($section, $settingsManager->performancePilier($pilier, $year) ? $settingsManager->performancePilier($pilier, $year)->getAnalyse() : '', false, false);
            $section->addText('Figure : Evolution des indices des ODD du pilier « '.$pilier->getName().' »');

            $odds=[]; $valeursRef=[]; $valeursRec=[];
            foreach ($pilier->getGoals() as $goal) {
                $odds[] = "ODD ".$goal->getCode();
                $valeursRef[] = $settingsManager->getGoalIndice($year->getName(), $goal, 'ref', 1, null) ? round($settingsManager->getGoalIndice($year->getName(), $goal, 'ref', 1, null),2) : 0;
                $valeursRec[] = $settingsManager->getGoalIndice($year->getName(), $goal, 'rec', 1, null) ? round($settingsManager->getGoalIndice($year->getName(), $goal, 'rec', 1, null),2) : 0;
            }
    
            $chart = $section->addChart('radar', $odds, $valeursRef);
            $chart->getStyle()->setWidth(Converter::inchToEmu(5))->setHeight(Converter::inchToEmu(3.5))->setShowLegend(true)->setLegendPosition('t');
            $chart->addSeries($odds,$valeursRec);
            $section->addText('Source DGCS-ODD');

            foreach ($pilier->getGoals() as $goal) {
                $table = $section->addTable();
                $table->addRow();
                $table->addCell()->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/odd'.$goal->getCode().'.png', array('width'=> 50));
                $table->addCell()->addText("   ");
                $table->addCell()->addText($goal->getDescription());
                $section->addTextBreak(1);
                Html::addHtml($section, $settingsManager->performanceOdd($goal, $year) ? $settingsManager->performanceOdd($goal, $year)->getPerformance() : '', false, false);
                $section->addText("Tableau : Indicateurs composites de l'ODD ".$goal->getCode());
                $table = $section->addTable('myTable');

                $cellRowSpan = array('vMerge' => 'restart');
                $cellRowContinue = array('vMerge' => 'continue');
                $cellColSpan2 = array('gridSpan' => 2);
                $cellColSpan3 = array('gridSpan' => 3);
                $cellHCentered = array('align' => 'center');
                $cellVCentered = array('valign' => 'center');

                $table->addRow();
                $table->addCell(2000, $cellRowSpan)->addText("ODD ".$goal->getCode(). " : ".$goal->getName(), null, $cellVCentered);
                $table->addCell(4000, $cellColSpan3)->addText("Valeur de l'indicateur");
                $table->addCell(4000, $cellColSpan2)->addText("Indice");
                $table->addCell(2000, $cellRowSpan)->addText("Statut",null, $cellVCentered);
                $table->addCell(2000, $cellRowSpan)->addText("Tend", null, $cellVCentered);

                $table->addRow();
                $table->addCell(null, $cellRowContinue);
                $table->addCell(2000)->addText("Réf");
                $table->addCell(2000)->addText("Réc");
                $table->addCell(2000)->addText("Cible");
                $table->addCell(2000)->addText("Réf");
                $table->addCell(2000)->addText("Réc");
                $table->addCell(null, $cellRowContinue);
                $table->addCell(null, $cellRowContinue);

                foreach ($goal->getTargets() as $target) {
                    $trend = $this->getDoctrine()->getRepository(Trend::class)->findOneByValue($settingsManager->getTargetTrend($year->getName(), $target));
                    $trend= $trend ? $trend->getFlag() : '-';
                    $statut = $this->getDoctrine()->getRepository(Statut::class)->findOneByValue($settingsManager->getTargetStatut($year->getName(), $target));
                    $statut= $statut ? $statut->getFlag() : '-';

                    $table->addRow();
                    $table->addCell(2000)->addText($target->getCode(). " ".$target->getName());
                    $table->addCell(4000, $cellColSpan3)->addText("");
                    $table->addCell(2000)->addText($settingsManager->getTargetIndice($year->getName(), $target, 'rec') ? round($settingsManager->getTargetIndice($year->getName(), $target, 'rec'), 2) : '-');
                    $table->addCell(2000)->addText($settingsManager->getTargetIndice($year->getName(), $target, 'maxvalue') ? round($settingsManager->getTargetIndice($year->getName(), $target, 'rec'), 2) : '-');
                    if($statut != '-'){
                        $table->addCell(2000)->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$statut.'.png', array('width'=> 24));
                    }else{
                        $table->addCell(2000)->addText($statut);
                    }
                    if($trend !='-'){
                        $table->addCell(2000)->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$trend.'.png', array('width'=> 24));
                    }else{
                        $table->addCell(2000)->addText($trend);
                    }

                    foreach ($target->getIndicators() as $indicator) {
                        $trend = $this->getDoctrine()->getRepository(Trend::class)->findOneByValue($settingsManager->getIndicatorTrend($year->getName(), $indicator));
                        $trend= $trend ? $trend->getFlag() : '-';
                        $statut = $this->getDoctrine()->getRepository(Statut::class)->findOneByValue($settingsManager->getIndicatorStatut($year->getName(), $indicator));
                        $statut= $statut ? $statut->getFlag() : '-';
                        
                        $table->addRow();
                        $table->addCell(2000)->addText($indicator->getCode(). " ".$indicator->getName());
                        $table->addCell(2000)->addText($indicator->getRefValue());
                        $table->addCell(2000)->addText($settingsManager->getValeurIndicateur($year->getName(),$indicator));
                        $table->addCell(2000)->addText($indicator->getMaxValue());
                        $table->addCell(2000)->addText($settingsManager->getIndicatorIndice($year->getName(), $indicator, 'ref') ? round($settingsManager->getIndicatorIndice($year->getName(), $indicator, 'ref'), 2) : '-');
                        $table->addCell(2000)->addText($settingsManager->getIndicatorIndice($year->getName(), $indicator, 'rec') ? round($settingsManager->getIndicatorIndice($year->getName(), $indicator, 'rec'), 2) : '-');
                        if($statut != '-'){
                            $table->addCell(2000)->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$statut.'.png', array('width'=> 24));
                        }else{
                            $table->addCell(2000)->addText($statut);
                        }
                        if($trend !='-'){
                            $table->addCell(2000)->addImage($this->getParameter('kernel.project_dir') . '/public/dist/img/'.$trend.'.png', array('width'=> 24));
                        }else{
                            $table->addCell(2000)->addText($trend);
                        }
                    }
                }
                $section->addTextBreak(1);
                foreach ($goal->getTargets() as $target) {
                    $section->addText('Cible '.$target->getCode().' : '.$target->getDescription(), array('bold' => true));
                    foreach ($target->getIndicators() as $indicator) {
                        $section->addText('Indicateur '.$indicator->getCode().' : '.$indicator->getName());
                        $annees = []; $valeurs=[];
                        for($i=4;$i>=0;$i--){
                            if($settingsManager->getValeurIndicateur($year->getName()-$i, $indicator)){
                                $annees[]=$year->getName()-$i;
                                $valeurs[]=$settingsManager->getValeurIndicateur($year->getName()-$i, $indicator);
                            }
                            
                        }
                            $annees[]="Cible 2030";
                            $valeurs[]=$indicator->getMaxValue();

                            $chart = $section->addChart('column', $annees, $valeurs);
                            $chart->getStyle()->setWidth(Converter::inchToEmu(5))->setHeight(Converter::inchToEmu(3.5))->setShowLegend(true)->setLegendPosition('t');
                            $section->addText('Source DGCS-ODD');
                    }
                }
                
            }
            $i++;
        }

        $section->addTitle('Difficultés et approches de solutions', 1);
        $section->addText('La section suivante fait un point sur les principales difficultés et leurs approches de solution.');
        $section->addTitle('Principales difficultés rencontrées', 2);
        Html::addHtml($section, $rapport? $rapport->getDifficultes() : '', false, false);
        $section->addTitle('Approches de solutions', 2);
        Html::addHtml($section, $rapport? $rapport->getSolutions():'', false, false);
        $section->addTitle('Recommandations', 2);
        Html::addHtml($section, $rapport ? $rapport->getRecommandations() : '', false, false);
        $section->addPageBreak();
        $section->addTitle('Conclusion', 1);
        Html::addHtml($section, $rapport ? $rapport->getConclusion(): '', false, false);
        $section->addPageBreak();
        $section->addTitle('Annexes', 1);

        // Add text elements
        $section->addPageBreak();
        $section->addTitle('Table des matières', 0);
        $section->addTextBreak(1);
        $toc = $section->addTOC();
        $toc->setMinDepth(1);
        $toc->setMaxDepth(4);

        // Saving the document as OOXML file...
        $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
        
        $filename = 'Rapport_indicateurs_'.$year->getName().'.docx';

        $objWriter->save($filename);

        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.$filename);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($filename));
        flush();
        readfile($filename);
        unlink($filename); // deletes the temporary file
        exit;
    }

    /**
     * @Route("/app/rapport/suivi", name="app_rapport_suivi")
     * @IsGranted("ROLE_MANAGER")
     */
    public function suiviAction(Request $request,SettingsManager $settingsManager)
    {
        $year = $settingsManager->getYear($request->getSession()->get('_year'));
        $rapport = $this->getDoctrine()->getRepository(Rapport::class)->findOneBy(['year' => $year, 'type'=>'Suivi']);
        $piliers = $this->getDoctrine()->getRepository(Mainstay::class)->findAll();
        $odds = $this->getDoctrine()->getRepository(Goal::class)->findAll();

        $form = $this->createForm(RapportSuiviType::class, $rapport);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $rapport = $form->getData();
            $rapport->setYear($year);
            $rapport->setType("Suivi");

            foreach ($piliers as $pilier) {
                $performance = $this->getDoctrine()->getRepository(Performance::class)->findOneBy(['year' => $year,'mainstay' => $pilier, 'desagregation' => NULL]);
                if (! $performance){
                    $performance = new Performance();
                    $performance->setYear($year);
                    $performance->setMainstay($pilier);
                }
                $performance->setPerformance($request->get('performance'.$pilier->getId()));
                $performance->setAnalyse($request->get('analyse'.$pilier->getId()));
                $this->getDoctrine()->getManagerForClass(Performance::class)->persist($performance);
            }

            foreach ($odds as $odd) {
                $performance = $this->getDoctrine()->getRepository(Performance::class)->findOneBy(['year' => $year,'goal' => $odd, 'desagregation' => NULL]);
                if (! $performance){
                    $performance = new Performance();
                    $performance->setYear($year);
                    $performance->setGoal($odd);
                }
                $performance->setPerformance($request->get('odd'.$odd->getCode()));
                $this->getDoctrine()->getManagerForClass(Performance::class)->persist($performance);
            }

            $this->getDoctrine()->getManagerForClass(Rapport::class)->persist($rapport);
            $this->getDoctrine()->getManagerForClass(Rapport::class)->flush();

            $this->addFlash('success', 'Rapport de suivi de la mise en oeuvre des ODD enregistré avec succès');
            return $this->redirectToRoute('app_rapport_suivi');
        }
        return $this->render('rapport/suivi.html.twig', [
            'year' => $year,
            'piliers' => $piliers,
            'odds' => $odds,
            'etat' => $year ? !$year->getRapport() : true,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/rapport/telecharger_suivi", name="telecharger_suivi")
     * @IsGranted("ROLE_MANAGER")
     */
    public function telechargerSuiviAction(Request $request, SettingsManager $settingsManager)
    {
        
        // Show the default reporting except from warnings
        error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);
        $year = $settingsManager->getYear($request->getSession()->get('_year'));

        $rapport = $this->getDoctrine()->getRepository(Rapport::class)->findOneBy(['year' => $year, 'type'=>'Suivi']);
        
        // New Word document
        $phpWord = $phpWord = new PhpWord();
        $phpWord->setDefaultFontName('Arial');
        $phpWord->setDefaultFontSize(12);
        $phpWord->addParagraphStyle('p2Style', array('align'=>'both', 'spaceAfter'=>100));
        $phpWord->getSettings()->setDecimalSymbol(',');
        $phpWord->getSettings()->setThemeFontLang(new Language(Language::FR_FR));
        $phpWord->getSettings()->setUpdateFields(true);
        $cellRowSpan = array('vMerge' => 'restart');
        $cellRowContinue = array('vMerge' => 'continue');
        $cellColSpan = array('gridSpan' => 4);

        $tableStyle = array('borderSize'  => 2);
        $firstRowStyle = array('bold' => true);
        $phpWord->addTableStyle('myTable', $tableStyle, $firstRowStyle);


        /*$phpWord->addNumberingStyle(
            'hNum',
            array('type' => 'multilevel', 'levels' => array(
                array('pStyle' => 'Heading1', 'format' => 'decimal', 'text' => '%1'),
                array('pStyle' => 'Heading2', 'format' => 'decimal', 'text' => '%1.%2'),
                array('pStyle' => 'Heading3', 'format' => 'decimal', 'text' => '%1.%2.%3'),
                )
            )
        );
        $phpWord->addTitleStyle(1, array('size' => 16), array('numStyle' => 'hNum', 'numLevel' => 0));
        $phpWord->addTitleStyle(2, array('size' => 14), array('numStyle' => 'hNum', 'numLevel' => 1));
        $phpWord->addTitleStyle(3, array('size' => 12), array('numStyle' => 'hNum', 'numLevel' => 2));*/

        

        

        // Define styles
        $phpWord->addTitleStyle(0, array('size' => 14, 'bold' => true));
        $phpWord->addTitleStyle(1, array('size' => 14, 'bold' => true));
        $phpWord->addTitleStyle(2, array('size' => 13, 'bold' => true));
        $phpWord->addTitleStyle(3, array('size' => 12, 'bold' => true));
        $phpWord->addTitleStyle(4, array('size' => 12, 'bold' => true));

        // Page de garde
        $section = $phpWord->addSection(array('vAlign' => VerticalJc::CENTER));
        $section->addText('RAPPORT DE SUIVI DE LA MISE EN OEUVRE DES OBJECTIFS DE DEVELOPPEMENT DURABLE DU BENIN, '.$year->getName(),
                            array('size' => 16,'bold' => true),
                            array('align' => 'center'));
        //$section->addPageBreak();

        //footer
        $section = $phpWord->addSection();

        // Sommaire
        $section->getStyle()->setPageNumberingStart(1);
        $footer = $section->addFooter();
        $textRun = $footer->addTextRun(array('alignment' => 'right'));
        $textRun->addField('PAGE', array('format' => 'roman'));

        $section->addTitle('Sommaire', 1);
        $section->addTextBreak(1);
        $toc = $section->addTOC();
        $toc->setMinDepth(1);
        $toc->setMaxDepth(1);

        //Add content
        $section->addPageBreak();
        $section->addTitle('Liste des sigles et abréviations', 1);
        $section->addTextBreak(1);
        $sigles = $this->getDoctrine()->getRepository(Sigle::class)->findBy([], ['code' => 'ASC']);
        $table = $section->addTable();
        foreach ($sigles as $sigle) {
            $table->addRow();
            $table->addCell()->addText($sigle->getCode());
            $table->addCell()->addText($sigle->getName());
        }

        $section->addPageBreak();
        $section->addTitle('Liste des tableaux', 1);
        $section->addTextBreak(1);

        $section->addPageBreak();
        $section->addTitle('Liste des figures', 1);
        $section->addTextBreak(1);

        $section->addPageBreak();
        $section->addTitle('Résumé exécutif', 1);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport ? $rapport->getResume(): '', false, false);

        $section = $phpWord->addSection();
        $footer = $section->addFooter();
        $textRun = $footer->addTextRun(array('alignment' => 'right'));
        $textRun->addField('PAGE', array('format' => 'arabic'));
        $section->getStyle()->setPageNumberingStart(1);

        $section->addTitle('Introduction', 1);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport? $rapport->getIntroduction():'', false, false);

        $section->addTitle('Méthodologie générale', 1);
        $section->addTextBreak(1);
        Html::addHtml($section, $rapport ? $rapport->getMethodologie() :'', false, false);

        $section->addTitle('Partie 1 : Situation socio-économique en '.$year->getName(), 1);
        $section->addTextBreak(1);
        $section->addTitle('Partie 2 : Etat des lieux du suivi des ODD', 1);
        $section->addTextBreak(1);
        $section->addTitle('Partie 3 : Progrès accomplis dans la mise en œuvre des ODD', 1);
        $i=1;
        $piliers = $this->getDoctrine()->getRepository(Mainstay::class)->findAll();
        foreach ($piliers as $pilier) {
            $section->addTitle('3.'.$i.' Pilier « '.$pilier->getName().' »', 2);
            $section->addTextBreak(1);
            $section->addTitle("3.".$i.".1 Niveau de réalisations des actions prioritaires au titre de l'année ".$year->getName(),3);
            $section->addText('Tableau '.$pilier->getId()." : Synthèse des taux d'exécution financière des actions prioritaires au titre de l'année ".$year->getName());

            $table = $section->addTable('myTable');

            $cellRowSpan = array('vMerge' => 'restart');
            $cellRowContinue = array('vMerge' => 'continue');
            $cellColSpan2 = array('gridSpan' => 2);
            $cellHCentered = array('align' => 'center');
            $cellVCentered = array('valign' => 'center');

            $table->addRow();
            $table->addCell(2000, $cellRowSpan)->addText("ODD", null, $cellVCentered);
            $table->addCell(2000, $cellRowSpan)->addText("Ministères", null, $cellVCentered);
            $table->addCell(4000, $cellColSpan2)->addText("Montants (en millions)");
            $table->addCell(2000, $cellRowSpan)->addText("TEF (%)", null, $cellVCentered);

            $table->addRow();
            $table->addCell(null, $cellRowContinue);
            $table->addCell(null, $cellRowContinue);
            $table->addCell(2000)->addText("Programmés");
            $table->addCell(2000)->addText("Réalisés");
            $table->addCell(null, $cellRowContinue);
            $programmeT=0; $realiseT=0;
            foreach ($pilier->getGoals() as $goal) {
                $ministeres= $this->getDoctrine()->getRepository(Ministry::class)->getFinancialPTA($year->getName(), $pilier, $goal);
                $programme=0; $realise=0; $k=1;
                if(count($ministeres)>0){
                    foreach ($ministeres as $ministere) {
                        $programme=$programme+$ministere['sumExpectedCost'];
                        $realise=$realise+$ministere['sumRealizedCost'];
                        if($k==1){
                            $table->addRow();
                            $table->addCell(2000, $cellRowSpan)->addText("ODD ".$goal->getCode());
                            $table->addCell(2000)->addText($ministere['code']);
                            $table->addCell(2000)->addText($ministere['sumExpectedCost']/1000000);
                            $table->addCell(2000)->addText($ministere['sumRealizedCost']/1000000);
                            $table->addCell(2000)->addText(round($ministere['rate'],2));
                            $k++;
                        }else{
                            $table->addRow();
                            $table->addCell(null, $cellRowContinue);
                            $table->addCell(2000)->addText($ministere['code']);
                            $table->addCell(2000)->addText($ministere['sumExpectedCost']/1000000);
                            $table->addCell(2000)->addText($ministere['sumRealizedCost']/1000000);
                            $table->addCell(2000)->addText(round($ministere['rate'],2));
                        }
                    }

                    $programmeT=$programmeT+$programme;
                    $realiseT=$realiseT+$realise;

                    $tef=$programme ? $realise/$programme : 0;
                    $table->addRow();
                    $table->addCell(4000, $cellColSpan2)->addText("Total ODD ".$goal->getCode());
                    $table->addCell(2000)->addText($programme/1000000);
                    $table->addCell(2000)->addText($realise/1000000);
                    $table->addCell(2000)->addText(round($tef * 100,2));
                }
            }
            $tefT=$programmeT ? $realiseT/$programmeT : 0;
            $table->addRow();
            $table->addCell(4000, $cellColSpan2)->addText("Total Pilier ".$pilier->getName());
            $table->addCell(2000)->addText($programmeT/1000000);
                        $table->addCell(2000)->addText($realiseT/1000000);
                        $table->addCell(2000)->addText(round($tefT * 100,2));

            $section->addText('Source DGCS-ODD');
            $section->addTextBreak(1);
            $j=1;
            foreach ($pilier->getGoals() as $goal) {
                $section->addTitle("3.".$i.".1.".$j." ODD ".$goal->getCode()." : ".$goal->getName(),4);
                $section->addTextBreak(1);
                $j++;
            }
            $section->addTitle("3.".$i.".2	Niveau des indicateurs ODD du pilier « ".$pilier->getName()." »",3);
            $j=1;
            foreach ($pilier->getGoals() as $goal) {
                $section->addTitle("3.".$i.".1.".$j." ODD ".$goal->getCode()." : ".$goal->getName(),4);
                $section->addTextBreak(1);
                $j++;
            }
            $i++;
        }
        $section->addTitle('Partie 4 : Contraintes- leçons apprises-recommandations et perspectives', 1);
        $section->addTitle('4.1 Contraintes majeures', 2);
        $i=1;
        foreach ($piliers as $pilier) {
            $section->addTitle('4.1.'.$i.' Contraintes majeures liées aux ODD du pilier « '.$pilier->getName().' »', 3);
            $section->addTextBreak(1);
            $i++;
        }
        $section->addTitle('4.2 Leçons apprises, recommandations et perspectives', 2);
        $section->addTextBreak(1);
        $section->addTitle('4.2.1 Leçons apprises et perspectives globales', 3);
        $section->addTextBreak(1);
        $section->addTitle('4.2.2 Recommandations et perspectives par pilier', 3);
        foreach ($piliers as $pilier) {
            $section->addTitle('4.2.2.'.$i.' Recommandations et perspectives du pilier  « '.$pilier->getName().' »', 4);
            $section->addTextBreak(1);
            $i++;
        }
        
        $section->addTitle('Conclusion', 1);
        Html::addHtml($section, $rapport ? $rapport->getConclusion(): '', false, false);
       
        // Add text elements
        $section->addPageBreak();
        $section->addTitle('Table des matières', 0);
        $section->addTextBreak(1);
        $toc = $section->addTOC();
        $toc->setMinDepth(1);
        $toc->setMaxDepth(4);

        // Saving the document as OOXML file...
        $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
        
        $filename = 'Rapport de suivi des ODD '.$year->getName().'.docx';

        $objWriter->save($filename);

        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.$filename);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($filename));
        flush();
        readfile($filename);
        unlink($filename); // deletes the temporary file
        exit;
    }


    /**
     * @Route("/app/rapport/publication", name="app_publier")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function publicationAction(Request $request, SettingsManager $settingsManager)
    {
        $year = $settingsManager->getYear($request->getSession()->get('_year'));

        return $this->render('rapport/publication.html.twig', [
            'year' => $year,
        ]);
    }


     /**
     * @Route("/app/rapport/publication/post", name="app_publier_post")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function publicationPostAction(Request $request, SettingsManager $settingsManager)
    {
        $year = $settingsManager->getYear($request->getSession()->get('_year'));

        $suivi = $request->files->get('suivi');
        if(!$suivi && !empty($suivi)){
            $suiviName = 'Rapport_Suivi_ODD_' . $year->getName() .'.' . $suivi->guessExtension();
                $folder = $this->getParameter('kernel.project_dir') . '/public/upload/rapports/';
                if (file_exists($folder . $suiviName)) {
                    chmod($folder . $suiviName, 0755);
                    unlink($folder . $suiviName);
                }
                $suivi->move($folder, $suiviName);
                $year->setRapportSuivi($suiviName);

        }
        
        $indicateur = $request->files->get('indicateur');
        if(!$indicateur && !empty($indicateur)){
            $indicateurName = 'Rapport_Indicateurs_' . $year->getName() .'.' . $indicateur->guessExtension();
                $folder = $this->getParameter('kernel.project_dir') . '/public/upload/rapports/';
                if (file_exists($folder . $indicateurName)) {
                    chmod($folder . $indicateurName, 0755);
                    unlink($folder . $indicateurName);
                }
                $indicateur->move($folder, $indicateurName);
                $year->setRapportIndicateurs($indicateurName);
        }
            $year->setRapport(true);

            $this->getDoctrine()->getManager()->persist($year);
            $this->getDoctrine()->getManager()->flush();

            $this->addFlash('success', 'Données de publiées '. $request->getSession()->get('_year') .' avec succès');
            return $this->redirectToRoute('app_config_dashboard');
    }

    /**
     * @Route("/app/rapport_pta/publication", name="app_publier_pta")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function publicationPTAAction(Request $request, SettingsManager $settingsManager)
    {
        $year = $settingsManager->getYear($request->getSession()->get('_year'));
        return $this->render('rapport/publicationpta.html.twig', [
            'year' => $year,
        ]);
    }

    /**
     * @Route("/app/rapport_pta/publication/post", name="app_publierpta_post")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function publicationPTAPostAction(Request $request, SettingsManager $settingsManager)
    {
        $year = $settingsManager->getYear($request->getSession()->get('_year'));

        $pta = $request->files->get('pta');
        if(!$pta && !empty($pta)){
            $ptaName = 'Rapport_Sensibilite_' . $year->getName() .'.' . $pta->guessExtension();
                $folder = $this->getParameter('kernel.project_dir') . '/public/upload/rapports/';
                if (file_exists($folder . $ptaName)) {
                    chmod($folder . $ptaName, 0755);
                    unlink($folder . $ptaName);
                }
                $pta->move($folder, $ptaName);
                $year->setRapportPTA($ptaName);
        }
        $year->setPublierPTA(true);

        $this->getDoctrine()->getManager()->persist($year);
        $this->getDoctrine()->getManager()->flush();
        $this->addFlash('success', 'Données de sensibilité des PTA de '. $request->getSession()->get('_year') .' publiées avec succès');
        return $this->redirectToRoute('app_config_dashboard');
    }


    /**
     * @Route("/app/sigles", name="app_sigles")
     */
    //@IsGranted("ROLE_MANAGER")
    public function siglesAction()
    {
        $sigles = $this->getDoctrine()->getRepository(Sigle::class)->findAll();

        return $this->render('rapport/sigle_list.html.twig', [
            'sigles' => $sigles,
        ]);
    }

    /**
     * @Route("/app/sigle/new", name="app_sigle_new")
     
     */
    //@IsGranted("ROLE_MANAGER")
    public function newSigleAction(Request $request)
    {
        $sigle = new Sigle();

        $form = $this->createForm(SigleType::class, $sigle);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $Sigle = $form->getData();
            $this->getDoctrine()->getManagerForClass(Sigle::class)->persist($Sigle);
            $this->getDoctrine()->getManagerForClass(Sigle::class)->flush();

            $this->addFlash('success', 'Sigle ajouté avec succès');
            return $this->redirectToRoute('app_sigle_new');
        }

        return $this->render('rapport/sigle_form.html.twig', [
            'sigle' => $sigle,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/sigle/{id}", name="app_sigle")
     
     */
    //* @IsGranted("ROLE_MANAGER")
    public function SigleAction($id, Request $request)
    {
        $sigle = $this->getDoctrine()->getRepository(Sigle::class)->findOneBy(['id' => $id]);

        $form = $this->createForm(SigleType::class, $sigle);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $Sigle = $form->getData();

            $this->getDoctrine()->getManagerForClass(Sigle::class)->flush();
            $this->addFlash('success', 'Sigle modifié avec succès');
            return $this->redirectToRoute('app_Sigles');
        }

        return $this->render('rapport/sigle_form.html.twig', [
            'sigle' => $sigle,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/sigle/{id}/delete", name="app_sigle_delete")
     * 
     */
    //@IsGranted("ROLE_MANAGER")
    public function deleteSigleAction($id, Request $request)
    {
        try {
            $sigle = $this->getDoctrine()->getRepository(Sigle::class)->find($id);
            $this->getDoctrine()->getManager()->remove($sigle);
            $this->getDoctrine()->getManager()->flush();
        } catch (\Exception $e) {
            $this->addFlash('error', 'Une erreur s\'est produite. Veuillez réssayer ou contacter le développeur');
            return $this->redirectToRoute('app_goals');
        }
        $this->addFlash('success', 'Sigle supprimé avec succès');
        return $this->redirectToRoute('app_sigles');
    }
}
