<?php

namespace App\Controller;

use App\Entity\Goal;
use App\Entity\Target;
use App\Entity\Activity;
use App\Entity\Action;
use App\Entity\Ministry;
use App\Entity\Programm;
use App\Entity\Direction;
use App\Entity\Department;
use App\Entity\Commune;
use App\Entity\Poste;
use App\Entity\Nature;
use App\Entity\LocationRate;
use App\Entity\Appreciation;
use App\Entity\Accelerator;
use App\Entity\ActivityPTA;
use App\Entity\Arrondissement;
use App\Entity\Statut;
use App\Entity\Trend;
use App\Entity\Event;
use App\Entity\Indicator;
use App\Entity\Year;
use App\Form\MinistryType;
use App\Form\MinistryCommuneSelType;
use App\Form\MinistryCommuneType;
use App\Form\ProgrammType;
use App\Form\DirectionType;
use App\Form\DepartmentType;
use App\Form\CommuneType;
use App\Form\ArrondissementType;
use App\Form\PosteType;
use App\Form\NatureType;
use App\Form\EventType;
use App\Form\YearType;
use App\Form\LocationType;
use App\Form\AppreciationType;
use App\Form\AcceleratorType;
use App\Form\StatutType;
use App\Form\TrendType;
use App\Form\YearGetType;
use App\Utils\YearsUtils;
use App\Service\SettingsManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;

class SettingController extends AbstractController
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    /**
     * @Route("/app/mesodd_year", name="app_mesodd_year")
     */
    public function yearGetAction(Request $request)
    {
        $startYear = $this->params->get('mesodd_year');
        $sessionYear = $request->getSession()->get('_year');

        $form = $this->createForm(YearGetType::class, ['yearselect' => $sessionYear], [
            'action' => $this->generateUrl('app_mesodd_year'),
            'choices' => YearsUtils::choicesYearsMes($startYear),
        ]);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            $request->getSession()->set('_year', $data['yearselect']);
            return $this->redirectToRoute('app_mesodd_dashboard');
        }

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

    /**
     * @Route("/app/suiodd_year", name="app_suiodd_year")
     */
    public function yearGet2Action(Request $request)
    {
        $startYear = $this->params->get('suiodd_year');
        $sessionYear = $request->getSession()->get('_year');
        $form = $this->createForm(YearGetType::class, ['yearselect' => $sessionYear], [
            'action' => $this->generateUrl('app_suiodd_year'),
            'choices' => YearsUtils::choicesYears($startYear),
        ]);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            $request->getSession()->set('_year', $data['yearselect']); 
            if($this->getUser()->getCommune()){
                return $this->redirectToRoute('app_commune_dashboard');
            }else if($this->isGranted('ROLE_DDD')){
                return $this->redirectToRoute('app_departement_dashboard');
            }
            return $this->redirectToRoute('app_suiodd_dashboard');
        }

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

    /**
     * @Route("/app/config_year", name="app_config_year")
     */
    public function yearGet3Action(Request $request)
    {
        $startYear = $this->params->get('suiodd_year');
        $sessionYear = $request->getSession()->get('_year');

        $form = $this->createForm(YearGetType::class, ['yearselect' => $sessionYear], [
            'action' => $this->generateUrl('app_config_year'),
            'choices' => YearsUtils::choicesYears($startYear),
        ]);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            $request->getSession()->set('_year', $data['yearselect']);
            if($this->getUser()->getCommune()|| $this->isGranted('ROLE_DDD')){
                return $this->redirectToRoute('app_commune_dashboard');
            }
            return $this->redirectToRoute('app_config_dashboard');
        }

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


    /**
     * @Route("/app/gestion", name="app_gestion")
     */
    public function gestionAction(Request $request)
    {
        return $this->render('setting/mesodd_dashboard.html.twig', []);
    }

    /**
     * @Route("/app/suiodd_dashboard", name="app_suiodd_dashboard")
     */
    public function suioddDashboardAction(Request $request, SettingsManager $settingsManager)
    {
        $request->getSession()->set('_application', 1);
        $odd=1; $cible=2; $indicateur=3;

        $ministry = $request->getSession()->get('_ministry');
        $indicators=null;
        if($ministry){
            $ministry = $this->getDoctrine()->getRepository(Ministry::class)->findOneBy(['id' => $ministry->getId()]);
            $indicators = $ministry->getIndicators();
        }

        if($this->isGranted('ROLE_INSTAD')){
            $indicators = $this->getDoctrine()->getRepository(Indicator::class)->findBy(['communal' => false, 'instad' => true]);
        }
        $default=$this->getDoctrine()->getRepository(Year::class)->maxYear();
        if($request->getSession()->get('_year')>$default || !$request->getSession()->get('_year')){
            $request->getSession()->set('_year', $default);
        }
        $year = $settingsManager->getYear($request->getSession()->get('_year') );
        $etat = $settingsManager->autorisationSaisie($request->getSession()->get('_year')) || $settingsManager->autorisationSaisiePta($request->getSession()->get('_year'));
        $fin = null;
        if ($etat && $this->isGranted('ROLE_FOCAL')) {
            $fin = $year->getFinfocal();
        } else if ($etat && $this->isGranted('ROLE_DPP')) {
            $fin = $year->getFindpp();
        }

        $activities=[];
        if ($ministry) {
            $activities = $this->getDoctrine()
                ->getRepository(ActivityPTA::class)
                ->findByMinistry($year->getName(), $ministry);
        }

        $ministeres = $this->getDoctrine()->getRepository(Ministry::class)->ministryByYear($year->getName());

        $communes = $this->getDoctrine()->getRepository(Commune::class)->findAll();

        return $this->render('setting/suiodd_dashboard.html.twig', [
            'indicators' => $indicators,
            'odds' => $settingsManager->compter(2030,$odd),
            'aspirations' => $settingsManager->compter(2063,$odd),
            'cibles' => $settingsManager->compter(2030,$cible),
            'objectifs' => $settingsManager->compter(2063,$cible),
            'indicateurs' => $settingsManager->compter(2030,$indicateur),
            'domaines' => $settingsManager->compter(2063,$indicateur),
            'indicateurscommunaux' => $settingsManager->compter(2030,$indicateur,true),
            'users' => $settingsManager->compterUser('all'),
            'admins' => $settingsManager->compterUser('ROLE_ADMIN'),
            'managers' => $settingsManager->compterUser('ROLE_MANAGER'),
            'dpp' => $settingsManager->compterUser('ROLE_DPP'),
            'focaux' => $settingsManager->compterUser('ROLE_FOCAL'),
            'fin' => $fin,
            'activities' => $activities,
            'indicateursministere' => $ministry ? $ministry->getIndicators(): null,
            'indicateursinstad' => $settingsManager->getIndicateursInstad(),
            'year' => $year,
            'ministry' => $ministry,
            'ministeres' => $ministeres,
            'communes' => $communes,
        ]);
    }

    /**
     * @Route("/app/mesodd_dashboard", name="app_mesodd_dashboard")
     */
    public function mesoddDashboardAction(Request $request)
    { 
        $request->getSession()->set('_application', 0);
        $amount = 0;
        $ministry = $this->getDoctrine()
        ->getRepository(Ministry::class)
        ->findOneBy(['id' => $request->getSession()->get('_ministry')]); 

        $departement = $this->getDoctrine()
        ->getRepository(Department::class)
        ->findOneBy(['id' => $request->getSession()->get('_departement')]);

        $commune = $this->getDoctrine()
        ->getRepository(Commune::class)
        ->findOneBy(['id' => $request->getSession()->get('_commune')]);
        $barChart = ['labels' => [], 'bgColor' => [], 'values' => []];

        $form = $this->createForm(MinistryCommuneType::class, null, [
            'sessionYear' => $request->getSession()->get('_year'),
            'sessionMinistry' => $request->getSession()->get('_ministry'),
            'sessionCommune' => $request->getSession()->get('_commune'),
            'sessionDepartement' => $request->getSession()->get('_departement'),
            'sessionType' => 'ministere',
        ]);

        $year = $request->getSession()->get('_year');
        $type='';

        $totalProgramm = 0;
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            if($request->getSession()->get('_departement')){
                $type='commune';
            }else{
                $type = $form->get('type')->getData();
            }
            $entite = $form->get('entite')->getData();
            if($type=='ministere' && $entite){
                $ministry = $this->getDoctrine()->getRepository(Ministry::class)->findOneBy(['id' => $entite->getId()]);
            }else if($type=='commune' && $entite){
                $commune = $this->getDoctrine()->getRepository(Commune::class)->findOneBy(['id' => $entite->getId()]);
            }
            
        }

        $totalProgramm = $this->getDoctrine()
            ->getRepository(Programm::class)
            ->getTotal($year, $type, $ministry, $commune,$departement);


        //$actionRepository = $this->getDoctrine()->getRepository(Action::class);
        $totalAction = $this->getDoctrine()
            ->getRepository(Action::class)
            ->getTotal($year, $type, $ministry, $commune, $departement);
        $totalActionTreated = $this->getDoctrine()
            ->getRepository(Action::class)
            ->getTotalTreated($year, $type, $ministry,$commune, $departement);

        //$activityRepository = $this->getDoctrine()->getRepository(Activity::class);
        $nbActivityTotal = $this->getDoctrine()
            ->getRepository(Activity::class)
            ->getTotal($year, $type, $ministry, $commune, $departement, false);
        $nbActivityTreated = $this->getDoctrine()
            ->getRepository(Activity::class)
            ->getTotal($year, $type, $ministry,$commune, $departement, true);

        $natures = $this->getDoctrine()
            ->getRepository(Nature::class)
            ->getCostByNature($year, $type, $ministry, $commune, $departement);
        foreach ($natures as $key => $nature) {
            $amount += $natures[$key]['amount'];
        }

        $datas = $this->getDoctrine()
            ->getRepository(Goal::class)
            ->getSensitivityGlobal($year, $type, $ministry,$commune, $departement);
        $total = 0;
        $nombre = 0;
        $goals = $this->getDoctrine()->getRepository(Goal::class)->findBy(['agenda' => 2030]);
        foreach ($goals as $goal){
            $nombre++;
            $data = array_values(array_filter($datas, function($item) use ($goal) {
                return $item['code'] === $goal->getCode();
            }))[0] ?? null;
            if($data){
                $barChart['labels'][] = 'ODD '.$data['code'];
                $barChart['bgColor'][] = $data['color'];
                $barChart['values'][] = $data['sensitivity'];
                $total+=$data['sensitivity'];
            }else{
                $barChart['labels'][] = 'ODD '.$goal->getCode();
                $barChart['bgColor'][] = $goal->getColor();
                $barChart['values'][] = null;
            }
        }
        /*foreach ($datas as $key => $data) {
            $barChart['labels'][] = 'ODD ' . $datas[$key]['code'];
            $barChart['bgColor'][] = $datas[$key]['color'];
            $barChart['values'][] = $datas[$key]['sensitivity'];
            $nombre ++;
            $total+=$datas[$key]['sensitivity'];
        }*/

        return $this->render('setting/mesodd_dashboard.html.twig', [
            'barChart' => $barChart,
            'totalProgramm' => $totalProgramm,
            'totalAction' => $totalAction,
            'totalActionTreated' => $totalActionTreated,
            'nbActivityTotal' => $nbActivityTotal,
            'nbActivityTreated' => $nbActivityTreated,
            'natures' => $natures,
            'amount' => $amount,
            'ministry' => $ministry,
            'commune' => $commune,
            'departement' => $departement,
            'global' => $nombre ? $total /$nombre : 0,
            'form' => $form->createView(),
        ]);
    }
    

    /**
     * @Route("/app/ministries", name="app_ministries")
     */
    public function ministriesAction(Request $request)
    {
        $ministries = $this->getDoctrine()
            ->getRepository(Ministry::class)
            ->findAll();

        return $this->render('setting/ministry_list.html.twig', [
            'ministries' => $ministries,
        ]);
    }

    /**
     * @Route("/app/ministries/new", name="app_ministry_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newMinistryAction(Request $request)
    {
        $ministry = new Ministry();

        $form = $this->createForm(MinistryType::class, $ministry);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $ministry = $form->getData();
            $ministry->addYear($request->getSession()->get('_year'));
            $this->getDoctrine()->getManagerForClass(Ministry::class)->persist($ministry);
            $this->getDoctrine()->getManagerForClass(Ministry::class)->flush();
            $this->addFlash('success', 'Ministère ajouté avec succès');
            return $this->redirectToRoute('app_ministry_new');
        }

        return $this->render('setting/ministry_form.html.twig', [
            'ministry' => $ministry,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/ministries/{id}", name="app_ministry")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function ministryAction($id, Request $request)
    {
        $ministry = $this->getDoctrine()
            ->getRepository(Ministry::class)
            ->findOneBy(['id' => $id]);

        $startYear = $this->params->get('mesodd_year');
        $editableYears = YearsUtils::choicesYearsMes($startYear);

        $originalYears = array_filter($ministry->getYears(), function ($year) use ($editableYears) {
            return in_array($year, $editableYears);
        });

        $form = $this->createForm(MinistryType::class, $ministry, [
            'editable_years' => $editableYears
        ]);

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

            $years = $form->get('years')->getData();

            $yearsToRemove = array_diff($originalYears, $years);

            foreach ($yearsToRemove as $year) {
                $ministry->removeYear($year);
            }

            foreach ($years as $year) {
                if (!$ministry->hasYear($year)) {
                    $ministry->addYear($year);
                }
            }

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

        return $this->render('setting/ministry_form.html.twig', [
            'ministry' => $ministry,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/ministries/{id}/delete", name="app_ministry_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteMinistryAction($id, Request $request)
    {
        $ministry = $this->getDoctrine()->getRepository(Ministry::class)->find($id);

        $this->getDoctrine()->getManagerForClass(Ministry::class)->remove($ministry);
        $this->getDoctrine()->getManagerForClass(Ministry::class)->flush();
        $this->addFlash('success', 'Ministère supprimé avec succès');
        return $this->redirectToRoute('app_ministries');
    }

    /**
     * @Route("/app/programms", name="app_programms")
     */
    public function programmsAction(Request $request)
    {
        $programms = [];
        $entite= null;

        if($request->getSession()->get('_ministry')){
            $entite = $request->getSession()->get('_ministry');
            $programms = $this->getDoctrine()
            ->getRepository(Programm::class)
            ->createQueryBuilder('d')
            ->where('d.ministry = :ministry')
            ->setParameter('ministry', $request->getSession()->get('_ministry'))
            ->getQuery()->getResult();
        }else if($request->getSession()->get('_commune')){
            $entite = $request->getSession()->get('_commune');
            $programms = $this->getDoctrine()
            ->getRepository(Programm::class)
            ->createQueryBuilder('d')
            ->where('d.commune = :commune')
            ->setParameter('commune', $request->getSession()->get('_commune'))
            ->getQuery()->getResult();
        }

        $form = $this->createForm(MinistryCommuneSelType::class, null, [
            'sessionYear' => $request->getSession()->get('_year'),
            'sessionMinistry' => $request->getSession()->get('_ministry'),
            'sessionCommune' => $request->getSession()->get('_commune'),
            'sessionDepartement' => $request->getSession()->get('_departement'),
        ]);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            if($request->getSession()->get('_departement')){
                $type='commune';
            }else{
                $type = $form->get('type')->getData();
            }
            if($type==='ministere'){
                $entite=$form->get('entite')->getData();
                $programms = $this->getDoctrine()
                ->getRepository(Programm::class)
                ->createQueryBuilder('p')
                ->where('p.ministry = :ministry')
                ->setParameter('ministry', $form->get('entite')->getData())
                ->getQuery()->getResult();
            }else if($type==='commune'){
                $entite=$form->get('entite')->getData();
                $programms = $this->getDoctrine()
                ->getRepository(Programm::class)
                ->createQueryBuilder('p')
                ->where('p.commune = :commune')
                ->setParameter('commune', $form->get('entite')->getData())
                ->getQuery()->getResult();
            }
            
        }

        return $this->render('setting/programm_list.html.twig', [
            'programms' => $programms,
            'entite' => $entite,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/programms/new", name="app_programm_new")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newProgrammAction(Request $request)
    {
        $programm = new Programm();
        $startYear = $this->params->get('mesodd_year');
        $editableYears = YearsUtils::choicesYearsMes($startYear);

        $form = $this->createForm(ProgrammType::class, $programm, [
            'sessionYear' => $request->getSession()->get('_year'),
            'sessionMinistry' => $request->getSession()->get('_ministry'),
            'sessionCommune' => $request->getSession()->get('_commune'),
            'sessionDepartement' => $request->getSession()->get('_departement'),
            'editable_years' => $editableYears,
        ]);


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

            $years = $form->get('years')->getData();
            foreach ($years as $year) {
                if (!$programm->hasYear($year)) {
                    $programm->addYear($year);
                }
            }

            if($request->getSession()->get('_ministry')){
                $programm->setMinistry($this->getDoctrine()->getRepository(Ministry::class)->find($request->getSession()->get('_ministry')->getId()));
            }elseif($request->getSession()->get('_commune')){
                $programm->setCommune($this->getDoctrine()->getRepository(Commune::class)->find($request->getSession()->get('_commune')->getId()));
            }else{
                if($request->getSession()->get('_departement')){
                    $type='commune';
                }else{
                    $type = $form->get('type')->getData();
                }
                if($type==='ministere'){
                    $programm->setMinistry($form->get('entite')->getData());
                }else if($type==='commune'){
                    $programm->setCommune($form->get('entite')->getData());
                }
            }
            $this->getDoctrine()->getManagerForClass(Programm::class)->persist($programm);
            $this->getDoctrine()->getManagerForClass(Programm::class)->flush();
            $this->addFlash('success', 'Programme ajouté avec succès');
            return $this->redirectToRoute('app_programm_new');
        }

        return $this->render('setting/programm_form.html.twig', [
            'programm' => $programm,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/programms/{id}", name="app_programm")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function programmAction($id, Request $request)
    {
        $sessionYear = $request->getSession()->get('_year');
        $sessionMinistry = $request->getSession()->get('_ministry');
        $defaultType = null;
        $defaultEntite = null;

        $programm = $this->getDoctrine()
            ->getRepository(Programm::class)
            ->findOneBy(['id' => $id]);

        if ($programm) {
            if ($sessionMinistry) {
                $ministry = $this->getDoctrine()
                    ->getRepository(Ministry::class)
                    ->findOneBy(['id' => $sessionMinistry->getId()]);
                $authorized = $programm->checkAccess($ministry);
                if (!$authorized)
                    return "vous n'avez pas droit à cette ressource";
            }
        } else {
            return $this->redirectToRoute('app_programms');
        }

        $startYear = $this->params->get('mesodd_year');
        $editableYears = YearsUtils::choicesYearsMes($startYear);

        $originalYears = array_filter($programm->getYears(), function ($year) use ($editableYears) {
            return in_array($year, $editableYears);
        });
        if($programm->getMinistry()){
            $defaultType = 'ministere';
            $defaultEntite = $programm->getMinistry();
            $form = $this->createForm(ProgrammType::class, $programm, [
                'sessionYear' => $request->getSession()->get('_year'),
                'sessionMinistry' => $request->getSession()->get('_ministry'),
                'editable_years' => $editableYears,
                'uploadkey' => 'M' . str_pad($programm->getMinistry()->getId(), 2, "0", STR_PAD_LEFT)
                    . '-P' . str_pad($programm->getId(), 5, "0", STR_PAD_LEFT),
                'default_type' => $defaultType,    
                'default_entity' => $defaultEntite
            ]);
        }else{
            $defaultType = 'commune';
            $defaultEntite = $programm->getCommune();
            $form = $this->createForm(ProgrammType::class, $programm, [
                'sessionYear' => $request->getSession()->get('_year'),
                'sessionCommune' => $request->getSession()->get('_commune'),
                'editable_years' => $editableYears,
                'uploadkey' => 'C' . str_pad($programm->getCommune()->getId(), 2, "0", STR_PAD_LEFT)
                    . '-P' . str_pad($programm->getId(), 5, "0", STR_PAD_LEFT),
                'default_type' => $defaultType,    
                'default_entity' => $defaultEntite
            ]);
        }
        

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

            $years = $form->get('years')->getData();

            $yearsToRemove = array_diff($originalYears, $years);

            foreach ($yearsToRemove as $year) {
                $programm->removeYear($year);
            }

            foreach ($years as $year) {
                if (!$programm->hasYear($year)) {
                    $programm->addYear($year);
                }
            }

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

        return $this->render('setting/programm_form.html.twig', [
            'programm' => $programm,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/programms/{id}/delete", name="app_programm_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteProgrammAction($id, Request $request)
    {
        $programm = $this->getDoctrine()
            ->getRepository(Programm::class)
            ->find($id);

        $this->getDoctrine()->getManagerForClass(Programm::class)->remove($programm);
        $this->getDoctrine()->getManagerForClass(Programm::class)->flush();
        $this->addFlash('success', 'Programme supprimé avec succès');
        return $this->redirectToRoute('app_programms');
    }

    /**
     * @Route("/app/directions", name="app_directions")
     */
    public function directionsAction(Request $request)
    {
        $directions = [];
        $entite=null;

        if($request->getSession()->get('_ministry')){
            $entite=$request->getSession()->get('_ministry');
            $directions = $this->getDoctrine()
            ->getRepository(Direction::class)
            ->createQueryBuilder('d')
            ->where('d.ministry = :ministry')
            ->setParameter('ministry', $request->getSession()->get('_ministry'))
            ->getQuery()->getResult();
        }else if($request->getSession()->get('_commune')){
            $entite=$request->getSession()->get('_commune');
            $directions = $this->getDoctrine()
            ->getRepository(Direction::class)
            ->createQueryBuilder('d')
            ->where('d.commune = :commune')
            ->setParameter('commune', $request->getSession()->get('_commune'))
            ->getQuery()->getResult();
        }
       
        $form = $this->createForm(MinistryCommuneSelType::class, null, [
            'sessionYear' => $request->getSession()->get('_year'),
            'sessionMinistry' => $request->getSession()->get('_ministry'),
            'sessionCommune' => $request->getSession()->get('_commune'),
            'sessionDepartement' => $request->getSession()->get('_departement'),
        ]);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            if($request->getSession()->get('_departement')){
                $type='commune';
            }else{
                $type = $form->get('type')->getData();
            }
            if($type==='ministere'){
                $entite=$form->get('entite')->getData();
                $directions = $this->getDoctrine()
                    ->getRepository(Direction::class)
                    ->createQueryBuilder('d')
                    ->where('d.ministry = :ministry')
                    ->setParameter('ministry', $entite)
                    ->getQuery()->getResult();
            }else if($type==='commune'){
                $entite=$form->get('entite')->getData();
                $directions = $this->getDoctrine()
                    ->getRepository(Direction::class)
                    ->createQueryBuilder('d')
                    ->where('d.commune = :commune')
                    ->setParameter('commune', $entite)
                    ->getQuery()->getResult();
            }
        }

        return $this->render('setting/direction_list.html.twig', [
            'directions' => $directions,
            'entite' => $entite,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/directions/new", name="app_direction_new")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newDirectionAction(Request $request)
    {
        $direction = new Direction();

        $startYear = $this->params->get('mesodd_year');
        $editableYears = YearsUtils::choicesYearsMes($startYear);

        $form = $this->createForm(DirectionType::class, $direction, [
            'sessionYear' => $request->getSession()->get('_year'),
            'sessionMinistry' => $request->getSession()->get('_ministry'),
            'sessionCommune' => $request->getSession()->get('_commune'),
            'sessionDepartement' => $request->getSession()->get('_departement'),
            'editable_years' => $editableYears,
        ]);

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

            $years = $form->get('years')->getData();
            foreach ($years as $year) {
                if (!$direction->hasYear($year)) {
                    $direction->addYear($year);
                }
            }

            if($request->getSession()->get('_ministry')){
                $direction->setMinistry($this->getDoctrine()->getRepository(Ministry::class)->find($request->getSession()->get('_ministry')->getId()));
            }elseif($request->getSession()->get('_commune')){
                $direction->setCommune($this->getDoctrine()->getRepository(Commune::class)->find($request->getSession()->get('_commune')->getId()));
            }else{
                if($request->getSession()->get('_departement')){
                    $type='commune';
                }else{
                    $type = $form->get('type')->getData();
                }
                if($type==='ministere'){
                    $direction->setMinistry($form->get('entite')->getData());
                }else if($type==='commune'){
                    $direction->setCommune($form->get('entite')->getData());
                }
            }
            $this->getDoctrine()->getManagerForClass(Direction::class)->persist($direction);
            $this->getDoctrine()->getManagerForClass(Direction::class)->flush();
            $this->addFlash('success', 'Direction ajoutée avec succès');
            return $this->redirectToRoute('app_direction_new');
        }

        return $this->render('setting/direction_form.html.twig', [
            'direction' => $direction,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/directions/{id}", name="app_direction")
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function directionAction($id, Request $request)
    {
        $sessionYear = $request->getSession()->get('_year')+1;
        $sessionMinistry = $request->getSession()->get('_ministry');

        $direction = $this->getDoctrine()
            ->getRepository(Direction::class)
            ->findOneBy(['id' => $id]);

        if ($direction) {
            if ($sessionMinistry) {
                $ministry = $this->getDoctrine()
                    ->getRepository(Ministry::class)
                    ->findOneBy(['id' => $sessionMinistry->getId()]);
                $authorized = $direction->checkAccess($ministry);
                if (!$authorized)
                    return "vous n'avez pas droit à cette ressource";
            }
        } else {
            return $this->redirectToRoute('app_directions');
        }

        $startYear = $this->params->get('mesodd_year');
        $editableYears = YearsUtils::choicesYearsMes($startYear);

        $originalYears = array_filter($direction->getYears(), function ($year) use ($editableYears) {
            return in_array($year, $editableYears);
        });

        if($direction->getMinistry()){
            $defaultType = 'ministere';
            $defaultEntite = $direction->getMinistry();
            $form = $this->createForm(DirectionType::class, $direction, [
                'sessionYear' => $request->getSession()->get('_year'),
                'sessionMinistry' => $request->getSession()->get('_ministry'),
                'sessionCommune' => $request->getSession()->get('_commune'),
                'sessionDepartement' => $request->getSession()->get('_departement'),
                'editable_years' => $editableYears,
                'uploadkey' => 'M' . str_pad($direction->getMinistry()->getId(), 2, "0", STR_PAD_LEFT)
                    . '-D' . str_pad($direction->getId(), 5, "0", STR_PAD_LEFT),
                'default_type' => $defaultType,    
                'default_entity' => $defaultEntite
            ]);
        }else{
            $defaultType = 'commune';
            $defaultEntite = $direction->getCommune();
            $form = $this->createForm(DirectionType::class, $direction, [
                'sessionYear' => $request->getSession()->get('_year'),
                'sessionMinistry' => $request->getSession()->get('_ministry'),
                'sessionCommune' => $request->getSession()->get('_commune'),
                'sessionDepartement' => $request->getSession()->get('_departement'),
                'editable_years' => $editableYears,
                'uploadkey' => 'C' . str_pad($direction->getCommune()->getId(), 2, "0", STR_PAD_LEFT)
                    . '-D' . str_pad($direction->getId(), 5, "0", STR_PAD_LEFT),
                'default_type' => $defaultType,    
                'default_entity' => $defaultEntite
            ]);
        }

        

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

            $years = $form->get('years')->getData();

            $yearsToRemove = array_diff($originalYears, $years);

            foreach ($yearsToRemove as $year) {
                $direction->removeYear($year);
            }

            foreach ($years as $year) {
                if (!$direction->hasYear($year)) {
                    $direction->addYear($year);
                }
            }

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

        return $this->render('setting/direction_form.html.twig', [
            'direction' => $direction,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/directions/{id}/delete", name="app_direction_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteDirectionAction($id, Request $request)
    {
        $direction = $this->getDoctrine()
            ->getRepository(Direction::class)
            ->find($id);

        $this->getDoctrine()->getManagerForClass(Direction::class)->remove($direction);
        $this->getDoctrine()->getManagerForClass(Direction::class)->flush();
        $this->addFlash('success', 'Direction supprimée avec succès');
        return $this->redirectToRoute('app_directions');
    }

    /**
     * @Route("/app/communes", name="app_communes")
     */
    public function communesAction()
    {
        $communes = $this->getDoctrine()->getRepository(Commune::class)->findAll();

        return $this->render('setting/commune_list.html.twig', [
            'communes' => $communes,
        ]);
    }

    /**
     * @Route("/app/communes/new", name="app_commune_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newCommuneAction(Request $request)
    {
        $commune = new Commune();

        $form = $this->createForm(CommuneType::class, $commune);

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

            $cibles = $form->get('cibles')->getData();
            $ciblesarray = array();
            foreach ($cibles as $cible) {
                $ciblesarray[] = $cible->getId();
            }
            $commune->setCibles($ciblesarray);

            $this->getDoctrine()->getManagerForClass(Commune::class)->persist($commune);
            $this->getDoctrine()->getManagerForClass(Commune::class)->flush();
            $this->addFlash('success', 'Commune ajoutée avec succès');
            return $this->redirectToRoute('app_commune_new');
        }

        return $this->render('setting/commune_form.html.twig', [
            'commune' => $commune,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/communes/{id}", name="app_commune")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function communeAction($id, Request $request)
    {
        $commune = $this->getDoctrine()
            ->getRepository(Commune::class)
            ->findOneBy(['id' => $id]);

        if ($commune->getCibles()) {
            $cibles = array();
            foreach ($commune->getCibles() as $cible) {
                $cibles[] = $this->getDoctrine()->getRepository(Target::class)->findOneBy(['id' => $cible]);
            }
            $commune->setCibles($cibles);
        }

        $form = $this->createForm(CommuneType::class, $commune);

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

            $cibles = $form->get('cibles')->getData();
            $ciblesarray = array();
            foreach ($cibles as $cible) {
                $ciblesarray[] = $cible->getId();
            }
            $commune->setCibles($ciblesarray);

            $this->getDoctrine()->getManagerForClass(Commune::class)->flush();

            $this->addFlash('success', 'Commune modifiée avec succès');
            return $this->redirectToRoute('app_communes');
        }

        return $this->render('setting/commune_form.html.twig', [
            'commune' => $commune,
            'form' => $form->createView(),
        ]);
    }

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



    /**
     * @Route("/app/arrondissements", name="app_arrondissements")
     */
    public function arrondissementsAction()
    {
        $arrondissements = $this->getDoctrine()->getRepository(Arrondissement::class)->findAll();

        return $this->render('setting/arrondissement_list.html.twig', [
            'arrondissements' => $arrondissements,
        ]);
    }

    /**
     * @Route("/app/arrondissements/new", name="app_arrondissement_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newArrondissementAction(Request $request)
    {
        $arrondissement = new Arrondissement();

       

        $form = $this->createForm(ArrondissementType::class, $arrondissement);

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

            $this->getDoctrine()->getManagerForClass(Arrondissement::class)->persist($arrondissement);
            $this->getDoctrine()->getManagerForClass(Arrondissement::class)->flush();
            $this->addFlash('success', 'Arrondissement ajouté avec succès');
            return $this->redirectToRoute('app_arrondissement_new');
        }

        return $this->render('setting/arrondissement_form.html.twig', [
            'arrondissement' => $arrondissement,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/arrondissements/{id}", name="app_arrondissement")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function arrondissementAction($id, Request $request)
    {
        $arrondissement = $this->getDoctrine()
            ->getRepository(Arrondissement::class)
            ->findOneBy(['id' => $id]);

        $defaultDepartment =  $arrondissement->getCommune()->getDepartment();
        $defaultCommune = $arrondissement->getCommune();

        $form = $this->createForm(ArrondissementType::class, $arrondissement, [
            'default_department' => $defaultDepartment,    
            'default_commune' => $defaultCommune
        ]);

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

            $this->getDoctrine()->getManagerForClass(Arrondissement::class)->flush();

            $this->addFlash('success', 'Arrondissement modifié avec succès');
            return $this->redirectToRoute('app_arrondissements');
        }

        return $this->render('setting/arrondissement_form.html.twig', [
            'arrondissement' => $arrondissement,
            'form' => $form->createView(),
        ]);
    }

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



    /**
     * @Route("/app/postes", name="app_postes")
     */
    public function postesAction()
    {
        $postes = $this->getDoctrine()->getRepository(Poste::class)->findAll();

        return $this->render('setting/poste_list.html.twig', [
            'postes' => $postes,
        ]);
    }

    /**
     * @Route("/app/postes/new", name="app_poste_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newPosteAction(Request $request)
    {
        $poste = new Poste();

        $form = $this->createForm(PosteType::class, $poste);

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

            $this->getDoctrine()->getManagerForClass(Poste::class)->persist($poste);
            $this->getDoctrine()->getManagerForClass(Poste::class)->flush();
            $this->addFlash('success', 'Poste ajouté avec succès');
            return $this->redirectToRoute('app_poste_new');
        }

        return $this->render('setting/poste_form.html.twig', [
            'poste' => $poste,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/postes/{id}", name="app_poste")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function posteAction($id, Request $request)
    {
        $poste = $this->getDoctrine()
            ->getRepository(Poste::class)
            ->findOneBy(['id' => $id]);

        $form = $this->createForm(PosteType::class, $poste);

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

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

        return $this->render('setting/poste_form.html.twig', [
            'poste' => $poste,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/natures", name="app_natures")
     */
    public function naturesAction()
    {
        $natures = $this->getDoctrine()->getRepository(Nature::class)->findAll();

        return $this->render('setting/nature_list.html.twig', [
            'natures' => $natures,
        ]);
    }

    /**
     * @Route("/app/natures/new", name="app_nature_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newNatureAction(Request $request)
    {
        $nature = new Nature();

        $form = $this->createForm(NatureType::class, $nature);

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

            $this->getDoctrine()->getManagerForClass(Nature::class)->persist($nature);
            $this->getDoctrine()->getManagerForClass(Nature::class)->flush();
            $this->addFlash('success', 'Nature ajoutée avec succès');
            return $this->redirectToRoute('app_nature_new');
        }

        return $this->render('setting/nature_form.html.twig', [
            'nature' => $nature,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/natures/{id}", name="app_nature")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function natureAction($id, Request $request)
    {
        $nature = $this->getDoctrine()
            ->getRepository(Nature::class)
            ->findOneBy(['id' => $id]);

        $form = $this->createForm(NatureType::class, $nature);

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

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

        return $this->render('setting/nature_form.html.twig', [
            'nature' => $nature,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/locations", name="app_locations")
     */
    public function locationsAction()
    {
        $locations = $this->getDoctrine()->getRepository(LocationRate::class)->findAll();

        return $this->render('setting/location_list.html.twig', [
            'locations' => $locations,
        ]);
    }

    /**
     * @Route("/app/locations/new", name="app_location_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newLocationAction(Request $request)
    {
        $location = new LocationRate();

        $form = $this->createForm(LocationType::class, $location);

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

            $this->getDoctrine()->getManagerForClass(LocationRate::class)->persist($location);
            $this->getDoctrine()->getManagerForClass(LocationRate::class)->flush();
            $this->addFlash('success', 'Location ajoutée avec succès');
            return $this->redirectToRoute('app_locations');
        }

        return $this->render('setting/location_form.html.twig', [
            'location' => $location,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/locations/{id}", name="app_location")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function locationAction($id, Request $request)
    {
        $location = $this->getDoctrine()
            ->getRepository(LocationRate::class)
            ->findOneBy(['id' => $id]);

        $form = $this->createForm(LocationType::class, $location);

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

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

        return $this->render('setting/location_form.html.twig', [
            'location' => $location,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/appreciations", name="app_appreciations")
     */
    public function appreciationsAction()
    {
        $appreciations = $this->getDoctrine()->getRepository(Appreciation::class)->findAll();

        return $this->render('setting/appreciation_list.html.twig', [
            'appreciations' => $appreciations,
        ]);
    }

    /**
     * @Route("/app/appreciations/new", name="app_appreciation_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newAppreciationAction(Request $request)
    {
        $appreciation = new Appreciation();

        $form = $this->createForm(AppreciationType::class, $appreciation);

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

            $this->getDoctrine()->getManagerForClass(Appreciation::class)->persist($appreciation);
            $this->getDoctrine()->getManagerForClass(Appreciation::class)->flush();
            $this->addFlash('success', 'Appreciation ajoutée avec succès');
            return $this->redirectToRoute('app_appreciation_new');
        }

        return $this->render('setting/appreciation_form.html.twig', [
            'appreciation' => $appreciation,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/appreciations/{id}", name="app_appreciation")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function appreciationAction($id, Request $request)
    {
        $appreciation = $this->getDoctrine()
            ->getRepository(Appreciation::class)
            ->findOneBy(['id' => $id]);

        $form = $this->createForm(AppreciationType::class, $appreciation);

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

            $this->getDoctrine()->getManagerForClass(Appreciation::class)->flush();
            $this->addFlash('success', 'Appréciation ajoutée avec succès');
            return $this->redirectToRoute('app_appreciations');
        }

        return $this->render('setting/appreciation_form.html.twig', [
            'appreciation' => $appreciation,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/statuts", name="app_statuts")
     */
    public function statutsAction()
    {
        $statuts = $this->getDoctrine()->getRepository(Statut::class)->findAll();

        return $this->render('setting/statut_list.html.twig', [
            'statuts' => $statuts,
        ]);
    }

    /**
     * @Route("/app/statuts/new", name="app_statut_new")
     
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newStatutAction(Request $request)
    {
        $statut = new Statut();

        $form = $this->createForm(StatutType::class, $statut);

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

            $this->getDoctrine()->getManagerForClass(Statut::class)->persist($statut);
            $this->getDoctrine()->getManagerForClass(Statut::class)->flush();
            $this->addFlash('success', 'Status ajouté avec succès');
            return $this->redirectToRoute('app_statut_new');
        }

        return $this->render('setting/statut_form.html.twig', [
            'statut' => $statut,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/statuts/{id}", name="app_statut")
     
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function statutAction($id, Request $request)
    {
        $statut = $this->getDoctrine()
            ->getRepository(Statut::class)
            ->findOneBy(['id' => $id]);

        $form = $this->createForm(StatutType::class, $statut);

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

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

        return $this->render('setting/statut_form.html.twig', [
            'statut' => $statut,
            'form' => $form->createView(),
        ]);
    }


    /**
     * @Route("/app/trends", name="app_trends")
     */
    public function trendsAction()
    {
        $trends = $this->getDoctrine()->getRepository(Trend::class)->findAll();

        return $this->render('setting/trend_list.html.twig', [
            'trends' => $trends,
        ]);
    }

    /**
     * @Route("/app/trends/new", name="app_trend_new")
     
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newTrendAction(Request $request)
    {
        $trend = new Trend();

        $form = $this->createForm(TrendType::class, $trend);

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

            $this->getDoctrine()->getManagerForClass(Trend::class)->persist($trend);
            $this->getDoctrine()->getManagerForClass(Trend::class)->flush();
            $this->addFlash('success', 'Tendance ajoutée avec succès');
            return $this->redirectToRoute('app_trend_new');
        }

        return $this->render('setting/trend_form.html.twig', [
            'trend' => $trend,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/trends/{id}", name="app_trend")
     
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function trendAction($id, Request $request)
    {
        $trend = $this->getDoctrine()
            ->getRepository(Trend::class)
            ->findOneBy(['id' => $id]);

        $form = $this->createForm(TrendType::class, $trend);

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

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

        return $this->render('setting/trend_form.html.twig', [
            'trend' => $trend,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/years", name="app_years")
     */
    public function yearsAction()
    {
        $years = $this->getDoctrine()->getRepository(Year::class)->findAll();

        return $this->render('setting/year_list.html.twig', [
            'years' => $years,
        ]);
    }

    /**
     * @Route("/app/years/new", name="app_year_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newYearAction(Request $request)
    {
        $year = new Year();

        $rapport = false;

        $form = $this->createForm(YearType::class, $year, array('rapport' => $rapport));

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

            $this->getDoctrine()->getManagerForClass(Year::class)->persist($year);
            $this->getDoctrine()->getManagerForClass(Year::class)->flush();
            $this->addFlash('success', 'Année ajoutée avec succès');
            return $this->redirectToRoute('app_year_new');
        }

        return $this->render('setting/year_form.html.twig', [
            'year' => $year,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/years/{id}", name="app_year")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function yearAction($id, Request $request)
    {
        $year = $this->getDoctrine()
            ->getRepository(Year::class)
            ->findOneBy(['id' => $id]);

        $rapport = $year && $year->getRapport();

        $form = $this->createForm(YearType::class, $year, array('rapport' => $rapport));

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

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

        return $this->render('setting/year_form.html.twig', [
            'year' => $year,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/year/{id}/delete", name="app_year_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteYearAction($id, Request $request)
    {
        try {
            $year = $this->getDoctrine()->getRepository(Year::class)->find($id);

            $this->getDoctrine()->getManagerForClass(Year::class)->remove($year);
            $this->getDoctrine()->getManagerForClass(Year::class)->flush();

        } catch (\Exception $e) {
            $this->addFlash('error', 'Une erreur s\'est produite. Veuillez réssayer ou contacter le développeur');
           return $this->redirectToRoute('app_years');
        }
        $this->addFlash('success', 'Année supprimée avec succès');
        return $this->redirectToRoute('app_years');
    }

    /**
     * @Route("/app/events", name="app_events")
     */
    public function eventsAction()
    {
        $events = $this->getDoctrine()->getRepository(Event::class)->findAll();

        return $this->render('setting/event_list.html.twig', [
            'events' => $events,
        ]);
    }

    /**
     * @Route("/app/event/new", name="app_event_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function newEventAction(Request $request)
    {
        $event = new Event();

        $form = $this->createForm(EventType::class, $event);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $event = $form->getData();
            $file = $form['photo']->getData();
            if($file){
                $filename = md5(uniqid()).'.'.$file->guessExtension();
                $event->setPhoto($filename);
                $file->move($this->getParameter('kernel.project_dir') . '/public/dist/img/events/', $filename);
            }
            $this->getDoctrine()->getManagerForClass(Event::class)->persist($event);
            $this->getDoctrine()->getManagerForClass(Event::class)->flush();
            $this->addFlash('success', 'Evènement ajouté avec succès');
            return $this->redirectToRoute('app_event_new');
        }

        return $this->render('setting/event_form.html.twig', [
            'event' => $event,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/event/{id}", name="app_event")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function eventAction($id, Request $request)
    {
        $event = $this->getDoctrine()
            ->getRepository(Event::class)
            ->findOneBy(['id' => $id]);

        $filename = $event->getPhoto();

        $form = $this->createForm(EventType::class, $event);

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

            $file = $form['photo']->getData();
            if($file){
                $filename = md5(uniqid()).'.'.$file->guessExtension();
                $file->move($this->getParameter('kernel.project_dir') . '/public/dist/img/events/', $filename);
            }
            $event->setPhoto($filename);
            $this->getDoctrine()->getManagerForClass(Event::class)->flush();
            $this->addFlash('success', 'Evenement modifié avec succès');
            return $this->redirectToRoute('app_events');
        }

        return $this->render('setting/event_form.html.twig', [
            'event' => $event,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/app/event/{id}/delete", name="app_event_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function eventYearAction($id, Request $request)
    {
        try {
            $event = $this->getDoctrine()->getRepository(Event::class)->find($id);

            $this->getDoctrine()->getManagerForClass(Event::class)->remove($event);
            $this->getDoctrine()->getManagerForClass(Event::class)->flush();

        } catch (\Exception $e) {
            $this->addFlash('error', 'Une erreur s\'est produite. Veuillez réssayer ou contacter le développeur');
           return $this->redirectToRoute('app_events');
        }
        $this->addFlash('success', 'Evenement supprimé avec succès');
        return $this->redirectToRoute('app_events');
    }
}
