<?php

namespace App\Controller;

use App\Entity\Desagregation;
use App\Entity\Goal;
use App\Entity\Target;
use App\Entity\Indicator;
use App\Form\GoalType;
use App\Form\TargetType;
use App\Form\CibleType;
use App\Form\IndicateurType;
use App\Form\IndicatorType;
use App\Entity\Cible2063;
use App\Entity\Indicateur2063;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Utils\YearsUtils;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class Agenda2063Controller extends AbstractController
{
    private $params;

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

    /**
     * @Route("/app/aspirations", name="app_aspirations")
     */
    public function aspirationsAction()
    {
        // Verify l'acces des communes
        if (($this->isGranted('ROLE_FOCAL') or $this->isGranted('ROLE_DPP')) and  $this->getUser()->getCommune()) {
            return $this->redirect($this->generateUrl('app_login'));
        }
        $goals = $this->getDoctrine()->getRepository(Goal::class)->findBy(['agenda' => 2063]);

        return $this->render('agenda2063/aspiration_list.html.twig', [
            'goals' => $goals,
        ]);
    }

    /**
     * @Route("/app/aspirations/new", name="app_aspiration_new")
     
     */
    //* @IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function newAspirationAction(Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_aspirations'));
        }

        $goal = new Goal();

        $form = $this->createForm(GoalType::class, $goal);

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

            $this->getDoctrine()->getManagerForClass(Goal::class)->persist($goal);
            $this->getDoctrine()->getManagerForClass(Goal::class)->flush();

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

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

    /**
     * @Route("/app/aspirations/{id}", name="app_aspiration")
     
     */
    //* @IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function AspirationAction($id, Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_aspirations'));
        }

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

        $form = $this->createForm(GoalType::class, $goal);

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

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

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

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

        /**
     * @Route("/app/aspiration/{id}/delete", name="app_aspiration_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteAspirationAction($id, Request $request)
    {
        try {
            $aspiration = $this->getDoctrine()->getRepository(Goal::class)->find($id);
            $this->getDoctrine()->getManagerForClass(Goal::class)->remove($aspiration);
            $this->getDoctrine()->getManagerForClass(Goal::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_aspirations');
        }
        $this->addFlash('success', 'Aspiration supprimée avec succès');
        return $this->redirectToRoute('app_aspirations');
    }

    /**
     * @Route("/app/objectifs", name="app_objectifs")
     */
    public function objectifsAction()
    {
        $targets = $this->getDoctrine()->getRepository(TArget::class)->findByAgenda(2063);

        return $this->render('agenda2063/objectif_list.html.twig', [
            'targets' => $targets,
        ]);
    }

    /**
     * @Route("/app/objectifs/new", name="app_objectif_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function newObjectifAction(Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_aspirations'));
        }

        $target = new Target();

        $form = $this->createForm(TargetType::class, $target, array('agenda' => 2063));

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

            $this->getDoctrine()->getManagerForClass(Target::class)->persist($target);
            $this->getDoctrine()->getManagerForClass(Target::class)->flush();

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

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

    /**
     * @Route("/app/objectifs/{id}", name="app_objectif")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function objectifAction($id, Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_aspirations'));
        }

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

        $form = $this->createForm(TargetType::class, $target, array('agenda' => 2063));

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

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

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

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

    /**
     * @Route("/app/objectif/{id}/delete", name="app_objectif_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteObjectifAction($id, Request $request)
    {
        try {
            $objectif = $this->getDoctrine()->getRepository(TArget::class)->find($id);
            $this->getDoctrine()->getManagerForClass(Target::class)->remove($objectif);
            $this->getDoctrine()->getManagerForClass(Target::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_objectifs');
        }
        $this->addFlash('success', 'Objectif supprimé avec succès');
        return $this->redirectToRoute('app_objectifs');
    }

    /**
     * @Route("/app/domaines", name="app_domaines")
     */
    public function domainesAction()
    {
        $indicators = $this->getDoctrine()->getRepository(Indicator::class)->findByAgenda(2063);

        return $this->render('agenda2063/domaine_list.html.twig', [
            'indicators' => $indicators,
        ]);
    }

    /**
     * @Route("/app/domaines/new", name="app_domaine_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function newDomainesAction(Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_aspirations'));
        }

        $indicator = new Indicator();

        /*$form = $this->createForm(IndicatorType::class, $indicator, [
            'choices' => YearsUtils::choicesYears($startYear),
        ]);*/

        $form = $this->createForm(IndicatorType::class, $indicator, ['agenda' => 2063]);


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

            /*$desagregations = $form->get('desagregations')->getData();
            $desagregationsarray = array();
            foreach ($desagregations as $desagregation) {
                $desagregationsarray[] = $desagregation->getId();
            }
            $indicator->setDesagregations($desagregationsarray);*/

            $this->getDoctrine()->getManagerForClass(Indicator::class)->persist($indicator);
            $this->getDoctrine()->getManagerForClass(Indicator::class)->flush();

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

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

    /**
     * @Route("/app/domaines/{id<\d+>?0}", name="app_domaine")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function domaineAction($id, Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_aspirations'));
        }

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

        if ($indicator->getDesagregations()) {
            $desagregations = array();
            foreach ($indicator->getDesagregations() as $desagragation) {
                $desagregations[] = $this->getDoctrine()->getRepository(Desagregation::class)->findOneBy(['id' => $desagragation]);
            }
            $indicator->setDesagregations($desagregations);
        }

        $form = $this->createForm(IndicatorType::class, $indicator, array('communal' => false, 'agenda' => 2063, 'goal'=>$indicator->getTarget()->getGoal()));

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

            $desagregations = $form->get('desagregations')->getData();
            $desagregationsarray = array();
            foreach ($desagregations as $desagregation) {
                $desagregationsarray[] = $desagregation->getId();
            }
            $indicator->setDesagregations($desagregationsarray);

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

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

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

    /**
     * @Route("/app/domaine/{id}/delete", name="app_domaine_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteDomainection($id, Request $request)
    {
        try {
            $indicator = $this->getDoctrine()->getRepository(Indicator::class)->find($id);
            $this->getDoctrine()->getManagerForClass(Indicator::class)->remove($indicator);
            $this->getDoctrine()->getManagerForClass(Indicator::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_domaines');
        }
        $this->addFlash('success', 'Domaine supprimé avec succès');
        return $this->redirectToRoute('app_domaines');
    }

    /**
     * @Route("/app/cibles", name="app_cibles")
     */
    public function ciblessAction()
    {
        $cibles = $this->getDoctrine()->getRepository(Cible2063::class)->findAll();

        return $this->render('agenda2063/cible_list.html.twig', [
            'cibles' => $cibles,
        ]);
    }

    /**
     * @Route("/app/cibles/new", name="app_cible_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function newCibleAction(Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_cibles'));
        }

        $cible = new Cible2063();

        $form = $this->createForm(CibleType::class, $cible);

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

            if($request->get('save')){
                $this->getDoctrine()->getManagerForClass(Cible2063::class)->persist($cible);
                $this->getDoctrine()->getManagerForClass(Cible2063::class)->flush();

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

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

    /**
     * @Route("/app/cibles/{id}", name="app_cible")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function cibleAction($id, Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_cibles'));
        }

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

        $form = $this->createForm(CibleType::class, $cible);

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

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

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

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

    /**
     * @Route("/app/cible/{id}/delete", name="app_cible_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteCibleAction($id, Request $request)
    {
        try {
            $item = $this->getDoctrine()->getRepository(Cible2063::class)->find($id);
            $this->getDoctrine()->getManagerForClass(Cible2063::class)->remove($item);
            $this->getDoctrine()->getManagerForClass(Cible2063::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_cibles');
        }
        $this->addFlash('success', 'Cible supprimée avec succès');
        return $this->redirectToRoute('app_cibles');
    }

    /**
     * @Route("/app/indicateurs", name="app_indicateurs")
     */
    public function indicateursAction()
    {
        $indicators = $this->getDoctrine()->getRepository(Indicateur2063::class)->findAll();

        return $this->render('agenda2063/indicateur_list.html.twig', [
            'indicators' => $indicators,
        ]);
    }

    /**
     * @Route("/app/indicateurs/new", name="app_indicateur_new")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function newIndicateurAction(Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_indicateurs'));
        }

        $indicateur = new Indicateur2063();

        $form = $this->createForm(IndicateurType::class, $indicateur);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $indicateur = $form->getData();
            if($request->get('save')){
                $this->getDoctrine()->getManagerForClass(Indicateur2063::class)->persist($indicateur);
                $this->getDoctrine()->getManagerForClass(Indicateur2063::class)->flush();

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

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

    /**
     * @Route("/app/indicateurs/{id}", name="app_indicateur")
     * 
     */
    //@IsGranted({"ROLE_ADMIN", "ROLE_MANAGER"})
    public function indicateurAction($id, Request $request)
    {
        if ($request->getSession()->get('_application') != 2) {
            return $this->redirect($this->generateUrl('app_indicateurs'));
        }

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

        $form = $this->createForm(IndicateurType::class, $indicateur);

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

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

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

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

    /**
     * @Route("/app/indicateur/{id}/delete", name="app_indicateur_delete")
     * 
     */
    //@IsGranted({"ROLE_ADMIN"})
    public function deleteIndicateurAction($id, Request $request)
    {
        try {
            $item = $this->getDoctrine()->getRepository(Indicateur2063::class)->find($id);
            $this->getDoctrine()->getManagerForClass(Indicateur2063::class)->remove($item);
            $this->getDoctrine()->getManagerForClass(Indicateur2063::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_indicateurs');
        }
        $this->addFlash('success', 'Indicateur supprimé avec succès');
        return $this->redirectToRoute('app_indicateurs');
    }


    /**
     * @Route("/app/agenda2063/import", name="app_agenda2063_import")
     */
    public function importxlxnormes(){
        $maquette = $this->getParameter('kernel.project_dir') . '/public/agenda2063.xlsx';

        $spreadsheet = IOFactory::load($maquette);
        /*$sheet = $spreadsheet->getSheet(0);
            for ($j = 2; $j <= 53; $j++) {
                if($sheet->getCell('C' . $j)->getCalculatedValue()){
                    $domaine = $this->getDoctrine()->getRepository(Indicator::class)->findOneBy(['code' => $sheet->getCell('C' . $j)->getCalculatedValue()]);
                    if($domaine){
                        $cible = new Cible2063();
                        $cible->setDomaine($domaine);
                        $cible->setCode($sheet->getCell('D' . $j)->getCalculatedValue());
                        $cible->setName($sheet->getCell('E' . $j)->getCalculatedValue());    
                        $this->getDoctrine()->getManager()->persist($cible);

                    }else{
                        dd('Plusieurs domaines '.$j);
                    }
                }else{
                    dd($j);
                }
            }

            $this->getDoctrine()->getManager()->flush();*/

            $sheet = $spreadsheet->getSheet(1);
            for ($j = 2; $j <= 67; $j++) {
                if($sheet->getCell('D' . $j)->getCalculatedValue()){
                    $cible = $this->getDoctrine()->getRepository(Cible2063::class)->findOneBy(['code' => $sheet->getCell('D' . $j)->getCalculatedValue()]);
                    $indicator = $this->getDoctrine()->getRepository(Indicator::class)->findOneBy(['code' => $sheet->getCell('H' . $j)->getCalculatedValue()]);
                    if($cible){
                        $indicateur = new Indicateur2063();
                        $indicateur->setCible($cible);
                        $indicateur->setCode($sheet->getCell('F' . $j)->getCalculatedValue());
                        $indicateur->setName($sheet->getCell('G' . $j)->getCalculatedValue()); 
                        $indicateur->setIndicateur2030($indicator);   
                        $this->getDoctrine()->getManager()->persist($indicateur);

                    }else{
                        dd('Plusieurs cibles '.$j);
                    }
                }else{
                    dd($j);
                }
            }

        $this->getDoctrine()->getManager()->flush();
        dd('Importation réussie');
    }
}
