<?php

namespace App\Controller\Admin;

use App\Entity\AgentGps;
use App\Entity\EquipementFamilleContrat;
use App\Entity\Groupe;
use App\Entity\Intervention;
use App\Entity\Site;
use App\Entity\Utilisateur;
use App\Entity\Equipement;
use App\Entity\Client;
use App\Entity\CommunicationClient;
use App\Entity\CommunicationCanal;
use Faker\Provider\DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Secteur;
use App\Entity\SectorisationVersion;
use App\Entity\User;
use App\Entity\Historique;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\SerializerInterface;
use App\Utils\Functions;


//use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
//use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
//use Symfony\Component\Form\Extension\Core\Type\SubmitType;
//use Symfony\Component\HttpFoundation\JsonResponse;
//use Symfony\Component\HttpFoundation\Request;
//use Symfony\Component\HttpFoundation\Response;
//use Symfony\Component\Routing\Annotation\Route;
//use Symfony\Component\Serializer\Encoder\JsonEncoder;
//use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
//use Symfony\Component\Serializer\Serializer;

/** @Route("/map") */
class MapController extends ParentAdminController {

//    /**
//     * @Route("/")
//     */
//    public function index() {
//        return $this->render('homepage/index.html.twig', ['mainNavHome'=>true, 'title'=>'Sectorisation']);
//    }

    /**
     * @Route("/")
     */
    public function index()
    {
        $em = $this->getDoctrine()->getManager();
        $site = $this->getUser()->getSite();
//        $em->getRepository('App:Secteur')->recupAntennes();
//        die('ok');

        $version = $em->getRepository('App:Secteur')->getVersion($site)['id'];
        $resAgents = $em->getRepository('App:Agent')->getAgentsWithClients($site, $version);
        $resAgents = array_merge($resAgents, $em->getRepository('App:Agent')->getAgentsWithoutClients($site, $version));
        $resAgents = $this->array_sort($resAgents, 'code_agent', SORT_ASC);
        $resResponsables = $em->getRepository('App:Agent')->getResponsables($site);

        $resHisto = $em->getRepository('App:Secteur')->getHistorique($site);
        return $this->render('member/js.html.twig', [
            'resAgents' => $resAgents,
            'resResponsables' => $resResponsables,
            'resHisto' => $resHisto,
            'version' => $version,
            'dateJour' => date('Y-m-d')
        ]);
    }

    /**
     * @Route("/opcache_reset")
     */
    public function opcacheReset()
    {
        opcache_reset();
        return new Response('opcache reset');
    }

    function array_sort($array, $on, $order=SORT_ASC)
    {
        $new_array = array();
        $sortable_array = array();

        if (count($array) > 0) {
            foreach ($array as $k => $v) {
                if (is_array($v)) {
                    foreach ($v as $k2 => $v2) {
                        if ($k2 == $on) {
                            $sortable_array[$k] = $v2;
                        }
                    }
                } else {
                    $sortable_array[$k] = $v;
                }
            }

            switch ($order) {
                case SORT_ASC:
                    asort($sortable_array);
                    break;
                case SORT_DESC:
                    arsort($sortable_array);
                    break;
            }

            foreach ($sortable_array as $k => $v) {
                $new_array[$k] = $array[$k];
            }
        }

        return $new_array;
    }

    /**
     * @Route("/get_secteurs", name="get_secteurs", methods={"POST"})
     */
    public function getSecteursAction(SerializerInterface $serializer, Request $req){
        $sites = $this->getUser()->getSites();
        $version = $this->getDoctrine()->getManager()->getRepository(SectorisationVersion::class)->getLastVersion($sites[0]); //on prend le premier site de l'utilisateur
        if($version) {
            $secteurs = $this->getDoctrine()->getManager()->getRepository(Secteur::class)->getSecteurs($version);
        }
        $liste = $this->getDoctrine()->getManager()->getRepository(Secteur::class)->getNbEquipement();
        $nbEquipement = [];
        foreach ($liste as $element){
            $nbEquipement[$element['id_secteur']]['nb_'.$element['id_famille']] = $element['nb'];
            if(!isset($nbEquipement[$element['id_secteur']]['nb_total'])){
                $nbEquipement[$element['id_secteur']]['nb_total'] = 0;
            }
            $nbEquipement[$element['id_secteur']]['nb_total'] += $element['nb'];
        }
        foreach ($secteurs as $cle => $secteur) {
            $secteur->setNbEquipement($nbEquipement[$secteur->getId()]);
        }
        $datasSecteurs = Functions::getSerialisedEntities($secteurs, $serializer, 'map');

        return new JsonResponse($datasSecteurs);

//        $em = $this->getDoctrine()->getManager();
//        $site = $this->getUser();
//        $content = json_decode($req->getContent(), true);
//        if(isset($content['version']) && $content['version'] != ''){
//            $version = $content['version'];
//        }else {
//            $version = $em->getRepository('App:Secteur')->getVersion($site)['id'];
//        }
//        $listeSecteurs = $em->getRepository('App:Secteur')->getSecteurs($site, $version);
//        $listeSecteursWithoutAgent = $em->getRepository('App:Secteur')->getSecteursWithoutAgent($site, $version);
//        $secteurs = '{"type":"FeatureCollection","features":[';
//        $count = 0;
//        foreach ($listeSecteurs as $secteur){
//            $secteurs .= '{"type":"Feature","idPolygon":'.$secteur['id'].',"nbClients":'.$secteur['nb_clients'].',"famille0":'.$secteur['famille0'].',"famille1":'.$secteur['famille1'].',"famille2":'.$secteur['famille2'].',"famille3":'.$secteur['famille3'].',"famille4":'.$secteur['famille4'].',"famille5":'.$secteur['famille5'].',"nomSecteur":"'.$secteur['nom_secteur'].'","codeAgent":'.$secteur['code_agent'].',"codeGroupe":'.$secteur['code_groupe'].',"suppleant1":"'.$secteur['suppleant_1'].'","suppleant2":"'.$secteur['suppleant_2'].'","suppleant3":"'.$secteur['suppleant_3'].'","suppleant4":"'.$secteur['suppleant_4'].'","site":"'.$secteur['site'].'","geometry":';
//            $secteurs .= $secteur['polygon'];
//            $secteurs .= '}';
//            $count++;
//            if($count != count($listeSecteurs) || count($listeSecteursWithoutAgent) != 0){
//            //if($count != count($listeSecteurs) ){
//                $secteurs .= ',';
//            }
//        }
//        $count = 0;
//        foreach ($listeSecteursWithoutAgent as $secteur){
//            $secteurs .= '{"type":"Feature","idPolygon":'.$secteur['id'].',"nbClients":'.$secteur['nb_clients'].',"famille0":'.$secteur['famille0'].',"famille1":'.$secteur['famille1'].',"famille2":'.$secteur['famille2'].',"famille3":'.$secteur['famille3'].',"famille4":'.$secteur['famille4'].',"famille5":'.$secteur['famille5'].',"nomSecteur":"'.$secteur['nom_secteur'].'","codeAgent":'.$secteur['code_agent'].',"codeGroupe":"","suppleant1":"'.$secteur['suppleant_1'].'","suppleant2":"'.$secteur['suppleant_2'].'","suppleant3":"'.$secteur['suppleant_3'].'","suppleant4":"'.$secteur['suppleant_4'].'","site":"'.$secteur['site'].'","geometry":';
//            $secteurs .= $secteur['polygon'];
//            $secteurs .= '}';
//            $count++;
//            if($count != count($listeSecteursWithoutAgent)){
//                $secteurs .= ',';
//            }
//        }
//        $secteurs .= ']}';
//
//        $resHisto = $em->getRepository('App:Secteur')->getHistorique($site);
//        $timeline = $this->render('member/timeline.html.twig', [
//            'resHisto' => $resHisto,
//            'version' => $version
//        ])->getContent();

    }

    /**
     * @Route("/get_big_polygon", name="get_big_polygon", methods={"POST"})
     */
    public function getBigPolygonAction(Request $req){
        $em = $this->getDoctrine()->getManager();
        $site = $this->getUser()->getSite();
        $content = json_decode($req->getContent(), true);
        if($content['type'] == 'local'){
            $secteurs = json_decode($content['secteurs'])->features;
            $resultBigPolygon = $em->getRepository('App:Secteur')->getBigPolygonLocal($secteurs);
            //var_dump($resultBigPolygon);
        }else {
            $resultBigPolygon = $em->getRepository('App:Secteur')->getBigPolygon($site);
        }
        $bigPolygon = '{"type":"Feature","properties": {},"geometry":';
        $bigPolygon .= $resultBigPolygon[0]['bigPolygon'];
        $bigPolygon .= '}';
        if($site == 'ROSNY') {
            $antennes = $em->getRepository('App:Secteur')->getAntennes();
            $secteursAntennes = '{"type":"FeatureCollection","features":[';
            $count = 0;
            foreach ($antennes as $secteur){
                $secteursAntennes .= '{"type":"Feature","geometry":';
                $secteursAntennes .= $secteur['secteur'];
                $secteursAntennes .= '}';
                $count++;
                if($count != count($antennes)){
                    $secteursAntennes .= ',';
                }
            }
            $secteursAntennes .= ']}';
            $resultBigPolygonAntennes = $em->getRepository('App:Secteur')->getBigPolygonAntennes();
            //var_dump($resultBigPolygonAntennes[0]);
            $bigPolygonAntennes = '{"type":"Feature","properties": {},"geometry":';
            //$bigPolygonAntennes .= $resultBigPolygonAntennes[1]['secteur'];
            $bigPolygonAntennes .= $resultBigPolygonAntennes[0]['bigPolygonAntennes'];
            $bigPolygonAntennes .= '}';
//            $resultBigPolygonGlobal = $em->getRepository('App:Secteur')->getBigPolygonGlobal($resultBigPolygon[0]['bigPolygon'],$resultBigPolygonAntennes[0]['bigPolygonAntennes']);
//            $bigPolygonGlobal = '{"type":"Feature","properties": {},"geometry":';
//            $bigPolygonGlobal .= $resultBigPolygonGlobal[0]['bigPolygon'];
//            $bigPolygonGlobal .= '}';
            $return = json_encode(array('bigPolygon' => $bigPolygon, 'bigPolygonAntennes' => $bigPolygonAntennes, 'antennes' => $antennes));
        }else{
            $return = json_encode(array('bigPolygon' => $bigPolygon, 'bigPolygonAntennes' => ''));
        }
        //var_dump($bigPolygonAntennes);

        return new JsonResponse($return);
    }

//    /**
//     * @Route("/get_agents", name="get_agents", methods={"GET"})
//     */
//    public function getAgentsAction(Request $req){
//        $em = $this->getDoctrine()->getManager();
//        $site = $this->getUser()->getSite();
//        $listeAgents = $em->getRepository('App:Agent')->getAgents($site);
//
//        $agents = '{"type":"FeatureCollection","features":[';
//        $count = 0;
//        foreach ($listeAgents as $agent){
//            $agents .= '{"type":"Feature","properties":{
//                        "codeAgent": "'.$agent['code_agent'].'",
//                        "codeGroupe": "'.$agent['code_groupe'].'",
//                        "popupContent": "Agent '.$agent['code_agent'].' : '.$agent['nom_agent'].' '.$agent['prenom_agent'].'"
//                    },"geometry":';
//            $agents .= $agent['point'];
//            $agents .= '}';
//            $count++;
//            if($count != count($listeAgents)){
//                $agents .= ',';
//            }
//        }
//        $agents .= ']}';
//
//        return new JsonResponse($agents);
//    }



    /**
     * @Route("/get_densite", name="get_densite", methods={"POST"})
     */
    public function getDensiteAction(Request $req){
        $em = $this->getDoctrine()->getManager();
        $site = $this->getUser()->getSite();
        $content = json_decode($req->getContent(), true);
        if(isset($content['version']) && $content['version'] != ''){
            $version = $content['version'];
        }else {
            $version = $em->getRepository('App:Secteur')->getVersion($site)['id'];
        }
        $listeClients = $em->getRepository('App:Client')->getClients($site,$version);
        if(count($listeClients) == 0){
            $em->getRepository('App:Client')->initSecteurOfClients();
        }

        $tab = $tab0 = $tab1 = $tab2 = $tab3 = array();
        $clients = '{"type":"FeatureCollection","features":[';
        $count = 0;
        foreach ($listeClients as $client){
            $coordinates = json_decode($client['point'])->coordinates;
            switch ($client['num_famille']){
                case 0:
                    array_push($tab0, array($coordinates[1], $coordinates[0]));
                case 1:
                    array_push($tab1, array($coordinates[1], $coordinates[0]));
                case 2:
                    array_push($tab2, array($coordinates[1], $coordinates[0]));
                case 3:
                    array_push($tab3, array($coordinates[1], $coordinates[0]));
            }
            $clients .= '{"type":"Feature","properties":{
                        "popupContent": "Client '.$client['numClient'].'",
                        "idSecteur": "'.$client['id_secteur'].'",
                        "idClient": "'.$client['id'].'"
                    },"geometry":';
            $clients .= $client['point'];
            $clients .= '}';
            $count++;
            if($count != count($listeClients)){
                $clients .= ',';
            }
        }
        $clients .= ']}';
        $tab['famille0'] = $tab0;
        $tab['famille1'] = $tab1;
        $tab['famille2'] = $tab2;
        $tab['famille3'] = $tab3;
        $return = json_encode(array('tab' => $tab, 'listeClients' => $clients));
        return new JsonResponse($return);
    }

    /**
     * @Route("/get_nb_clients", name="get_nb_clients", methods={"POST"})
     */
    public function getNbClientsAction(Request $req){
        $em = $this->getDoctrine()->getManager();
        $site = $this->getUser()->getSite();
        $content = json_decode($req->getContent(), true);
        $polygon = json_decode($content['polygon'])->features[0];
        $flagAntenne = false;
        if ($site == 'ADMIN') {
            $tabAntennes = ['VERGNIEUX', 'HANNIQUET', 'GOSNET', 'CHEZE', 'LAHALLE'];
            foreach ($tabAntennes as $antenne) {
                if (strstr($polygon->properties->nomSecteur, $antenne)) {
                    $flagAntenne = true;
                }
            }
        }
        if(!$flagAntenne) {
            $nbClientsCurrent = $em->getRepository('App:Client')->getNbClientsCurrent($polygon, $site);
        }else{
            $nbClientsCurrent = 0;
        }

        // var_dump($nbClientsCurrent);
        $polygonsAdjacent = $nbClientsAdjacent = [];
        if(isset($content['polygonsAdjacent'])) {
            $polygonsAdjacent = json_decode($content['polygonsAdjacent'])->features;
        }
        if(count($polygonsAdjacent) != 0) {
            $nbClientsAdjacent = $em->getRepository('App:Client')->getNbClientsAdjacent($polygonsAdjacent, $site);
        }
        $return = json_encode(array('current' => $nbClientsCurrent, 'adjacent' => $nbClientsAdjacent));

        return new JsonResponse($return);
    }

    /**
     * @Route("/fusion_secteurs", name="fusion_secteurs", methods={"POST"})
     */
    public function fusionSecteursAction(Request $req){
        $em = $this->getDoctrine()->getManager();
        $content = json_decode($req->getContent(), true);
        $secteurs = json_decode($content['secteurs'])->features;
        $resultFusion = $em->getRepository('App:Secteur')->fusionSecteurs($secteurs[0], $secteurs[1]);

        $fusion = '{"type":"Feature","geometry":';
        $fusion .= $resultFusion['fusion'];
        $fusion .= '}';

        return new JsonResponse($fusion);
    }

    /**
     * @Route("/save_secteurs", name="save_secteurs", methods={"POST"})
     */
    public function saveSecteursAction(Request $req){
        $em = $this->getDoctrine()->getManager();
        $site = $this->getUser()->getSite();
        $content = json_decode($req->getContent(), true);
        $secteurs = json_decode($content['secteurs'])->features;
        $clients = json_decode($content['clients'])->features;
        $dateMep = new \DateTime($content['dateMep']);
        $commentaires = $content['commentaires'];
        $date = new \DateTime();

        $histo = $em->getRepository('App:Historique')->findOneBy(['dateMep' => $dateMep]);
        if ($histo == null) {
            $histo = new Historique();
        }
        $histo->setSite($site);
        $histo->setDateMep($dateMep);
        $histo->setDateModif($date);
        $histo->setCommentaires($commentaires);
        $this->getDoctrine()->getManager()->persist($histo);
        $this->getDoctrine()->getManager()->flush();
        $idHisto = $histo->getId();

        $resultSave = $em->getRepository('App:Secteur')->saveSecteurs($idHisto, $secteurs, $clients, $site);
        $versionActuelle = $em->getRepository('App:Secteur')->getVersion($site)['id'];

        $resHisto = $em->getRepository('App:Secteur')->getHistorique($site);

        $timeline = $this->render('member/timeline.html.twig', [
            'resHisto' => $resHisto,
            'version' => $versionActuelle
        ])->getContent();

        $return = json_encode(array('timeline' => $timeline, 'version' => $idHisto, 'dateMep' => $dateMep->format('d/m/Y'), 'dateModif' => $date->format('d/m/Y'), 'commentaires' => $commentaires, 'versionActuelle' => $versionActuelle));

        return new JsonResponse($return);
    }


    /**
     * @Route("/synchro", name="synchro", methods={"POST"})
     */
    public function synchro(){
        $kernel = $this->get('kernel');
        $application = new Application($kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput([
            'command' => 'sectorisation:synchro-secto',
        ]);
        // You can use NullOutput() if you don't need the output
        //$output = new BufferedOutput();
        $output = new NullOutput();
        $application->run($input, $output);

        // return the output, don't use if you used NullOutput()
        // $content = $output->fetch();

        // return new Response(""), if you used NullOutput()
        return new Response("OK");

    }


    /**
     * @Route("/contient", name="contient", methods={"POST"})
     */
    public function contient(Request $req){
        $em = $this->getDoctrine()->getManager();
        $content = json_decode($req->getContent(), true);
        $polygons = json_decode($content['polygons'])->features;
        $point = json_decode($content['point']);
        $resultFusion = $em->getRepository('App:Secteur')->contient($polygons, $point);
        return new JsonResponse($resultFusion);
    }

    /**
     * Lists all entities.
     * @Route("/contrats_a_servir", methods="GET", name="contrats_a_servir")
     */
    public function contratAServir(SerializerInterface $serializer,Security $security): Response
    {
        $sites = $security->getUser()->getSites();
        $groupes = null;
        $secteurs = null;
        if(count($sites) == 1){//initialisation select groupe + agent
            $groupes = $this->getDoctrine()->getRepository(Groupe::class)->findBy(['site' => $sites[0]]);
        }
        return $this->render('map/contrats_a_servir.html.twig', [
            'page' => 'Contrats à servir',
            'sites' => $sites,
            'groupes' => $groupes,
            'agents' => null,
            'interventions' => null,
            'cas' => null,
            'path_client' => $this->generateUrl('show_client', ['id' => 1])
        ]);
    }

    /**
     * maj formulaire cas
     * @Route("/maj_cas_recherche", methods="POST", name="maj_cas_recherche")
     */
    public function majCasRecherche(Request $request) {
        $datas = $request->request->all();

        if (isset($datas['type_change']) && !empty($datas['type_change']))
        {
            $id = (int)$datas['data_value'];
            $date = $datas['date_value'];
            if ($datas['type_change'] == 'site') {
                $site = $this->getDoctrine()->getRepository(Site::class)->find($id);
                $groupes = $this->getDoctrine()->getRepository(Groupe::class)->findBy(['site' => $site]);
                $html = $this->renderView('map/_select_cas_groupe.html.twig', [
                    'groupes' => $groupes,
                ]);
            } else if ($datas['type_change'] == 'groupe') {
                $groupe = $this->getDoctrine()->getRepository(Groupe::class)->find($id);
                $agents = $this->getDoctrine()->getRepository(Utilisateur::class)->getAgentsCarto($groupe);
                $html = $this->renderView('map/_select_cas_agent.html.twig', [
                    'agents' => $agents
                ]);
            } else {
                $agent = $this->getDoctrine()->getRepository(Utilisateur::class)->find($id);
                $interventions = $this->getDoctrine()->getRepository(Intervention::class)->getInterventionsCarto($agent, $date);
                $html = $this->renderView('map/_select_cas_intervention.html.twig', [
                    'interventions' => $interventions
                ]);
            }
        }
        return new JsonResponse(['html' => $html], Response::HTTP_OK);
    }

    /**
     * filter carto
     * @Route("/search_cas", methods="POST", name="search_cas")
     */
    public function searchCas(SerializerInterface $serializer, Request $request, Security $security) {
        $datas = $request->request->all();
        $page = isset($datas['page']) ? (int)$datas['page'] : 1;
        $limit = 10;
        
        $agentId = isset($datas['agent']) ? $datas['agent'] : null;
        $agent = $agentId ? $this->getDoctrine()->getRepository(Utilisateur::class)->find($agentId) : null;
        $date = isset($datas['date']) ? $datas['date'] : date('Y-m-d');
        $siteId = isset($datas['site']) ? $datas['site'] : null;

        $interventions = [];
        if ($agent) {
            $interventions = $this->getDoctrine()->getRepository(Intervention::class)->getInterventionsCarto($agent, $date);
        }

        $versionSecto = [];
        $secteurs = [];
        if ($siteId) {
            $versionSecto = $this->getDoctrine()->getManager()->getRepository(SectorisationVersion::class)->findBy(['site' => $siteId, 'en_prod' => true]);
            if ($versionSecto) {
                $secteurs = $this->getDoctrine()->getRepository(Secteur::class)->findBy(['sectorisation_version' => $versionSecto]);
            }
        }

        //on recherche les coordonnées
        $latitude = $longitude = null;
        if(isset($datas['intervention']) && $datas['intervention']!=''){
            $intervention = $this->getDoctrine()->getRepository(Intervention::class)->find($datas['intervention']);
            if ($intervention && $intervention->getEquipement() && $intervention->getEquipement()->getAdresse()) {
                $latitude = $intervention->getEquipement()->getAdresse()->getLatitude();
                $longitude = $intervention->getEquipement()->getAdresse()->getLongitude();
            }
        } elseif (isset($datas['coordinates']) && !empty($datas['coordinates'])) {
            $coordinates = explode(',', $datas['coordinates']);
            $longitude = $coordinates[0] ?? null;
            $latitude = $coordinates[1] ?? null;
        }

        $equipementRepo = $this->getDoctrine()->getRepository(Equipement::class);
        $rayon = isset($datas['rayon']) ? $datas['rayon'] : null;
        $tri = isset($datas['tri']) ? $datas['tri'] : null;

        // Si on a un rayon mais pas de coordonnées, on ne peut pas faire la recherche spatiale
        if ($rayon && ($latitude === null || $longitude === null)) {
            return new JsonResponse([
                'status' => 'error',
                'message' => 'Impossible de déterminer les coordonnées pour la recherche.',
                'html' => '<div class="alert alert-warning m-3 text-center">Impossible de déterminer les coordonnées pour la recherche. Veuillez vérifier l\'adresse.</div>'
            ]);
        }

        // Vérification du numéro client si renseigné
        if (isset($datas['num_client']) && !empty($datas['num_client'])) {
            $client = $this->getDoctrine()->getRepository(Client::class)->findOneBy(['numero_client' => $datas['num_client']]);
            if (!$client) {
                return new JsonResponse([
                    'status' => 'error',
                    'message' => 'Le numéro client saisi n\'existe pas en base.',
                    'html' => '<div class="alert alert-warning m-3 text-center">Le numéro client saisi n\'existe pas en base.</div>'
                ]);
            }
        }

        // Gestion des qualifications du technicien
        $familleIds = null;
        if (isset($datas['check_qualif']) && $datas['check_qualif'] === 'on' && $agent) {
            $familleIds = [];
            foreach ($agent->getAgentQualifications() as $qualification) {
                if ($qualification->getEquipementFamille()) {
                    $familleIds[] = $qualification->getEquipementFamille()->getId();
                }
            }
        }
        $cas = $equipementRepo->getEquipementAServir($latitude, $longitude, $rayon, $tri, $page, $limit, $familleIds);
        $totalResults = $equipementRepo->countEquipementAServir($latitude, $longitude, $rayon, $familleIds);

        //Pour simuler un résultat vide
        //$cas ='';
        //$totalResults = 0;

        // Limiter à 200 résultats maximum (20 pages de 10)
        if ($totalResults > 200) {
            $totalResults = 200;
        }
        
        $totalPages = ceil($totalResults / $limit);

        $labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'];
        if (is_iterable($cas)) {
            foreach ($cas as $key => $equipement) {
                $label = $labels[$key] ?? ($key + 1);
                $equipement->setMapLabel($label);
            }
        }

        $returnDatas = [
            'interventions' => Functions::getSerialisedEntities($interventions, $serializer, 'map'),
            'agent'         => Functions::getSerialisedEntities($agent, $serializer, 'map'),
            'secteurs'      => Functions::getSerialisedEntities($secteurs, $serializer, 'cas'),
            'cas'           => Functions::getSerialisedEntities($cas, $serializer, 'map'),
            'totalResults'  => $totalResults,
            'totalPages'    => $totalPages,
            'currentPage'   => $page,
            'center'        => ['lat' => $latitude, 'lon' => $longitude, 'rayon' => $rayon],
            'html'          => $this->renderView('map/_list_cas.html.twig', [
                'cas' => $cas,
                'currentPage' => $page,
                'totalPages' => $totalPages
            ])
        ];

        return new JsonResponse($returnDatas);
    }

    /**
     * Lists all entities.
     * @Route("/cartographie_interventions", methods="GET", name="cartographie_interventions")
     */
    public function cartographieInterventions(SerializerInterface $serializer,Security $security): Response
    {
        $sites = $security->getUser()->getSites();
        $groupes = $agents = $interventions = '';
        if(count($sites) == 1){//initialisation select groupe + agent
            $groupes = $this->getDoctrine()->getRepository(Groupe::class)->findBy(['site' => $sites[0]]);
            $agents = $this->getDoctrine()->getRepository(Utilisateur::class)->getAgentsCarto($groupes);
            $date = date('d/m/Y');
            $interventions = $this->getDoctrine()->getRepository(Intervention::class)->getInterventionsCarto($agents, $date);
            $returnDatas = ['interventions' => Functions::getSerialisedEntities($interventions, $serializer, 'map'), 'agents' => Functions::getSerialisedEntities($agents, $serializer, 'map')];
        }
        return $this->render('map/cartographie.html.twig', [
            'page' => 'Cartographie',
            'sites' => $sites,
            'groupes' => $groupes,
            'agents' => $agents,
            'data' => $returnDatas,
            'path_client' => $this->generateUrl('show_client', ['id' => 1])
        ]);
    }


    /**
     * filter carto
     * @Route("/filter_carto", methods="POST", name="filter_carto")
     */
    public function filterCarto(SerializerInterface $serializer, Request $request, Security $security) {
        $datas = $request->request->all();
        $returnDatas = [];
        // Initialisation site, groupes, agents
        if (empty($datas['site'])) {
            $sites = $security->getUser()->getSites();
            $datas['site'] =  $sites;
        }
        $groupes = $this->getDoctrine()->getRepository(Groupe::class)->findBy(['site' => $datas['site']]);
        if($datas['groupes'][0] !='0'){
            $groupes = $datas['groupes'];
        }
        $agents = $this->getDoctrine()->getRepository(Utilisateur::class)->getAgentsCarto($groupes);

        if ($datas['name'] === 'site') {
            $returnDatas = [
                'groupes' => Functions::getSerialisedEntities($groupes, $serializer, 'map'),
                'agents'  => Functions::getSerialisedEntities($agents, $serializer, 'map')
            ];
        } elseif ($datas['name'] === 'groupes') {
            $returnDatas = [
                'agents' => Functions::getSerialisedEntities($agents, $serializer, 'map')
            ];
        } elseif ($datas['name'] === 'submit') {
            $etiquettes='';
            if($datas['agents'][0] !='0'){
                $agents = $this->getDoctrine()->getRepository(Utilisateur::class)->findBy(['id' => $datas['agents']]);
                $etiquettes = $this->renderView('map/_cartographie_etiquettes.html.twig', ['agents' => $agents, 'date' =>  $datas['date']]);
            }
            $interventions = $this->getDoctrine()->getRepository(Intervention::class)->getInterventionsCarto($agents, $datas['date']);
            $returnDatas = [
                'interventions' => Functions::getSerialisedEntities($interventions, $serializer, 'map'),
                'agents'        => Functions::getSerialisedEntities($agents, $serializer, 'map'),
                'etiquettes'    => $etiquettes
            ];
        } elseif ($datas['name'] === 'reset') {
            // Réinitialisation des filtres
            $groupes = $this->getDoctrine()->getRepository(Groupe::class)->findBy(['site' => $security->getUser()->getSites()]);
            $agents = $this->getDoctrine()->getRepository(Utilisateur::class)->getAgentsCarto($groupes);
            $date = date('d/m/Y');
            $interventions = $this->getDoctrine()->getRepository(Intervention::class)->getInterventionsCarto($agents, $date);

            $returnDatas = [
                'groupes'       => Functions::getSerialisedEntities($groupes, $serializer, 'map'),
                'agents'        => Functions::getSerialisedEntities($agents, $serializer, 'map'),
//                'interventions' => Functions::getSerialisedEntities($interventions, $serializer, 'map'),
                'interventions' => '',
                'etiquettes'    => ''
            ];
        }
        return new JsonResponse($returnDatas);
    }

    /**
     * Suivi gps
     * @Route("/gps", methods="POST", name="gps")
     */
    public function gps(SerializerInterface $serializer, Request $request, Security $security) {
        $datas = $request->request->all();
        $coords = $this->getDoctrine()->getRepository(AgentGps::class)->getCoordsGps($datas['agent'], $datas['date']);
        $coords = Functions::getSerialisedEntities($coords, $serializer, 'map');
        return new JsonResponse($coords);
    }

}
