<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace App\Controller\Admin;

use App\Entity\Adresse;
use App\Entity\AdresseComplement;
use App\Entity\Client;
use App\Entity\ClientAdresse;
use App\Entity\ClientEmail;
use App\Entity\ClientSite;
use App\Entity\ClientTel;
use App\Entity\Contrat;
use App\Entity\ContratMotifResiliation;
use App\Entity\ContratResiliation;
use App\Entity\ContratType;
use App\Entity\Equipement;
use App\Entity\EquipementAlimentation;
use App\Entity\EquipementComplement;
use App\Entity\EquipementFamille;
use App\Entity\EquipementFamilleContrat;
use App\Entity\EquipementFluide;
use App\Entity\EquipementGroupe;
use App\Entity\EquipementGroupeType;
use App\Entity\EquipementInstallation;
use App\Entity\EquipementLocal;
use App\Entity\EquipementMarque;
use App\Entity\EquipementOption;
use App\Entity\EquipementPreferencesPlanification;
use App\Entity\EquipementPuissance;
use App\Entity\EquipementType;
use App\Entity\EquipementTypePuissance;
use App\Entity\EquipementZone;
use App\Entity\EtatCivil;
use App\Entity\FactureLigne;
use App\Entity\GroupeDroitPortail;
use App\Entity\GroupeType;
use App\Entity\HistoriqueEquipementLocal;
use App\Entity\HistoriqueEquipementUtilisateur;
use App\Entity\Intervention;
use App\Entity\Energie;
use App\Entity\LockEntites;
use App\Entity\Option;
use App\Entity\OptionTarif;
use App\Entity\HorairePassage;
use App\Entity\Produit;
use App\Entity\Raccordement;
use App\Entity\Secteur;
use App\Entity\SecteurEquipement;
use App\Entity\Site;
use App\Entity\TauxTva;
use App\Entity\TypeAdresse;
use App\Entity\TypeClient;
use App\Entity\TypeComplement;
use App\Entity\TypeComplementAdresse;
use App\Entity\TypeEnergie;
use App\Entity\TypeEnvoi;
use App\Entity\TypeLogement;
use App\Entity\TypeSav;
use App\Entity\TypeUtilisateur;
use App\Entity\TypeZone;
use App\Entity\Utilisateur;
use App\Form\UtilisateurType;
use App\Service\ClientManager;
use App\Service\EquipementManager;
use App\Service\LockManager;
use App\Service\TarifManager;
use App\Utils\Functions;
use DateTime;
use DateTimeZone;
use Doctrine\ORM\Cache\Lock;
use Proxies\__CG__\App\Entity\CategoriePro;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * @Route("/equipement")
 * @IsGranted("ROLE_USER")
 *
 */
class EquipementController extends ParentAdminController
{
    /**
     * Lists all entities.
     * @Route("/patch/equipement_type/{id}", methods="PATCH", name="patch_equipement_type")
     */
    public function updateAction($id = null, Request $request, SerializerInterface $serializer): Response
    {
         $em = $this->getDoctrine()->getManager();
         $datas = $request->request->all();
         $metadata = $em->getClassMetadata(EquipementType::class);

         if ($equipementType =  $em->getRepository(EquipementType::class)->find($id)) {
             foreach ($datas as $key => $value) {
                 if (in_array($key, ['date_debut', 'date_fin'])) {
                     if ($key == 'date_debut' && $value != $equipementType->getDateDebutSerializer()) {
                         $equipementType->setDateDebut($value);
                         $equipementType->updateFamilyDebut();
                     }
                     if ($key == 'date_fin' && $value != $equipementType->getDateFinSerializer()) {
                         $equipementType->setDateFin($value);
                         $equipementType->updateFamilyFin();
                     }
                 }
                 else {
                     $methodName = 'set' . $this->formatSetter(ucfirst($key));
                     $value = $this->getRealValue($value, $metadata, $key);

                     if (method_exists($equipementType, $methodName))
                         $equipementType->$methodName($value);
                 }
             }
         }
         $em->persist($equipementType);
         $em->flush();

         return new JsonResponse('', Response::HTTP_OK);
     }

    /**
     * Ajouter un équipement
     * @Route("/add/{id}", methods="POST", name="add_equipement")
     */
     public function addEquipement(Client $client, Request $request) {
         $em = $this->getDoctrine()->getManager();
         $datas = $request->request->all();
         if ($datas['type_add'] == '#choix-recherche-equipement' && isset($datas['equipement_search_value']) && !empty($datas['equipement_search_value'])) {
             $equipement = $em->getRepository(Equipement::class)->find((int)$datas['equipement_search_value']);
             if ($equipement->getClientSouscripteur() !=  $client) {
                 //on desactive l'ancien equipement et on clone pour un nouveau
                 $equipement->setActif(false);
                 $newEquipement = clone $equipement;
                 $newEquipement->setClientSouscripteur($client);
                 $newEquipement->setActif(true);
                 $client->addEquipement($newEquipement);
                 $newEquipement->setSalarieFrisquet(false);
                 $newEquipement->setChantier(false);
                 $em->persist($equipement);
                 $em->persist($newEquipement);

                 if (!$equipement->getClientUtilisateur() && !$client->getAdresse())
                 {
                     $clientAdresse = new ClientAdresse();
                     $clientAdresse->setActif(true);
                     $clientAdresse->setAdresse($equipement->getAdresse());
                     $clientAdresse->setClient($client);
                     $client->addClientAdress($clientAdresse);
                 }
             }

             $em->persist($client);
             $em->flush();

             return new JsonResponse([
                 'path' => $this->generateUrl('show_client', ['id' => $client->getId()]).'?id_equipement='.$newEquipement->getId(),
                 'messages' => ['success' => ["Ajout effectué avec succès"]]], Response::HTTP_OK);

         } else if ($datas['type_add'] == '#choix-new-equipement' && ((isset($datas['adresse_add']) && !empty($datas['adresse_add']))
                 || (isset($datas['equipement_existant_select']) && !empty($datas['equipement_existant_select'])))) {
             $site = $em->getRepository(Site::class)->find($datas['site']);
             $equipement = new Equipement();
             $equipement->setSite($site);
             $equipement->setClientSouscripteur($client);
             if (isset($datas['adresse_add']) && !empty($datas['adresse_add'])) {
                 $adresse = new Adresse();
                 $adresse->setAdresse($datas['adresse_add']);
                 $typeLogement = $em->getRepository(TypeLogement::class)->find($datas['adresse_type_add']);
                 $adresse->setTypeLogement($typeLogement);
                 if (isset($datas['code_postal_add'])) $adresse->setCodePostal($datas['code_postal_add']);
                 if (isset($datas['ville_add'])) $adresse->setVille($datas['ville_add']);
                 if (isset($datas['coordinates_add'])) {
                     $coordinates = explode(',',$datas['coordinates_add']);
                     $adresse->setLatitude($coordinates[1]);
                     $adresse->setLongitude($coordinates[0]);
                     $newSecteurs = $em->getRepository(Secteur::class)->getSecteursFromCoordinates($coordinates[0],$coordinates[1]);
                     foreach($newSecteurs as $secteur) {
                         $equipement_secteur = new SecteurEquipement();
                         $equipement_secteur->setEquipement($equipement)->setSecteur($secteur);
                         $equipement->addSecteurEquipement($equipement_secteur);
                         $em->persist($equipement);
                     }
                 }
                 $equipement->setAdresse($adresse);
                 if (!$client->getAdresse()) {
                     $clientAdresse = new ClientAdresse();
                     $clientAdresse->setActif(true);
                     $clientAdresse->setAdresse($adresse);
                     $clientAdresse->setClient($client);
                     $client->addClientAdress($clientAdresse);
                 }
             } else if(isset($datas['equipement_existant_select']) && !empty($datas['equipement_existant_select'])) {
                 $equipement_existant = $this->getDoctrine()->getRepository(Equipement::class)->find((int)$datas['equipement_existant_select']);
                 $newAdresse = clone $equipement_existant->getAdresse();
                 $equipement->setAdresse($newAdresse);
                 foreach ($equipement_existant->getSecteurEquipements() as $secteurEquipement)
                 {
                     $newSecteurEquipement =  new SecteurEquipement();
                     $newSecteurEquipement->setEquipement($equipement)->setSecteur($secteurEquipement->getSecteur());
                     $equipement->addSecteurEquipement($newSecteurEquipement);
                     $em->persist($equipement);
                 }
             }
             $client->addEquipement($equipement);
             $em->persist($client);
             $em->flush();

             return new JsonResponse([
                 'path' => $this->generateUrl('show_client', ['id' => $client->getId()]).'?id_equipement='.$equipement->getId(),
                 'messages' => ['success' => ["Ajout effectué avec succès"]]], Response::HTTP_OK);
         }

        return new JsonResponse('', Response::HTTP_OK);
     }

    /**
     * getEquipement complement adresse
     * @Route("/complement_adresse/{id}", methods="GET", name="get_complement_adresse")
     */
    public function getComplementAdresseGrid(Equipement $equipement) {
        $result = [];
        foreach ($equipement->getAdresse()->getAdresseComplements() as $adresseComplement) {
            $result[] = [
                'id' => $adresseComplement->getId(),
                'type_complement_adresse' => (($adresseComplement->getTypeComplementAdresse()) ? $adresseComplement->getTypeComplementAdresse()->getId(): null),
                'valeur' => $adresseComplement->getValeur() ,
                'commentaire_valeur' => $adresseComplement->getCommentaireValeur(),
            ];
        }
        $response = json_encode(['data' => $result, 'totalCount' => count($result)]);

        return new Response(
            $response,
            Response::HTTP_OK,
            ['Content-type' => 'application/json']
        );
    }

    /**
     * create equipement  complement adresse
     * @Route("/complement_adresse/{id}", methods="POST", name="post_complement_adresse")
     */
    public function createComplementAdresse(Equipement $equipement, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();

        foreach($datas as $key => $value) {
            $datas[$key] = Functions::clearData($value);
        }
        $adresseComplement = new AdresseComplement();
        $adresseComplement = $this->majDatasAdresseComplement($adresseComplement, $datas, $em);
        $adresseComplement->setAdresse($equipement->getAdresse());

        $em->persist($adresseComplement);
        $em->flush();

        //$this->addFlash('success', "Modification effectuée avec succès");
       // return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
        $html = $this->renderView('clients/localisation/_complements_adresse_view_result.html.twig', [
            'equipement' => $equipement,
            'typeComplementAdresse' => $this->getDoctrine()->getRepository(TypeComplementAdresse::class)->findAll()
        ]);

        return new JsonResponse(['messages' =>['success' => ["Ajout effectué avec succès"]],'html' => $html], Response::HTTP_OK);
    }

    /**
     * delete adresseComplement
     * @Route("/delete/adresse_complement/{id}", methods="GET", name="delete_adresse_complement")
     *  @ParamConverter("adresseComplement", class="App:AdresseComplement")
     */
    public function deleteAdresseComplement(AdresseComplement $adresseComplement, LockManager $lockManager) {
        $this->getDoctrine()->getManager()->remove($adresseComplement);
        $this->getDoctrine()->getManager()->flush();

//        $equipement = $adresseComplement->getAdresse()->getEquipements()->first();
        return new JsonResponse(['messages' => ['success' => ["Suppression effectuée avec succès"]]], Response::HTTP_OK);
        //return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
    }

    /**
     * update adresseComplement
     * @Route("/update/adresse_complement/{id}/{id_equipement}", methods="POST", name="update_adresse_complement")
     *  @ParamConverter("adresseComplement", class="App:AdresseComplement")
     */
    public function updateAdresseComplement(AdresseComplement $adresseComplement, Equipement $equipement, Request $request, LockManager $lockManager) {
        $lockManager->checkLock('Equipement', $equipement->getId(), $this->getUser());
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();

        foreach($datas as $key => $value) {
            $datas[$key] = Functions::clearData($value);
        }
        $adresseComplement = $this->majDatasAdresseComplement($adresseComplement, $datas, $em);
        $em->persist($adresseComplement);
        $em->flush();

        $equipement = $adresseComplement->getAdresse()->getEquipements()->first();

        $this->addFlash('success', "Modification effectuée avec succès");
        //return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
        $html = $this->renderView('clients/localisation/_complements_adresse_view_result.html.twig', [
            'equipement' => $equipement,
            'typeComplementAdresse' => $this->getDoctrine()->getRepository(TypeComplementAdresse::class)->findAll()
        ]);

        return new JsonResponse(['messages' =>['success' => ["Modification effectuée avec succès"]],'html' => $html], Response::HTTP_OK);
    }

    private function majDatasAdresseComplement($adresseComplement, $datas, $em) {
        if (isset($datas['type_complement_adresse'])) {
            $typeComplement = $em->getRepository(TypeComplementAdresse::class)->find($datas['type_complement_adresse']);
            if ($typeComplement) {
                $adresseComplement->setTypeComplementAdresse($typeComplement);

                if (isset($datas['commentaire_valeur'])) $adresseComplement->setCommentaireValeur($datas['commentaire_valeur']);
                if (isset($datas['valeur'])) $adresseComplement->setValeur($datas['valeur']);
            }
        }
        return $adresseComplement;
    }

    /**
     * getEquipement option
     * @Route("/option/{id}", methods="GET", name="get_equipement_option")
     */
    public function getEquipementOptionGrid(Equipement $equipement, EquipementManager $equipementManager) {
        $result = $equipementManager->getEquipementOptionsFormatted($equipement);

        $response = json_encode(['data' => $result, 'totalCount' => count($result)]);

        return new Response(
            $response,
            Response::HTTP_OK,
            ['Content-type' => 'application/json']
        );
    }

    /**
     * create equipement  complement adresse
     * @Route("/option/{id}", methods="POST", name="post_equipement_option")
     */
    public function createEquipementOption(Equipement $equipement, Request $request, TarifManager $tarifManager) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();

        foreach($datas as $key => $value) {
            $datas[$key] = Functions::clearData($value);
        }

        if (isset($datas['option'])) {
            $option = $this->getDoctrine()->getRepository(Option::class)->find($datas['option']);
            if ($option) {
                $equipementOption = new EquipementOption();
                $equipementOption->setOption($option);
                $equipementOption->setEquipement($equipement);
                $equipementOption->setDateSouscription(new DateTime());
                if ($equipement->getLastContrat() && $equipement->getLastContrat()->getDateFinContrat() > new DateTime())
                    $equipementOption->setDateDebut($equipement->getLastContrat()->getDateFinContrat());

                if ($equipement->getLastContrat()) {
                    $prix = $tarifManager->calculOptionTarif($option, $equipement->getEquipementTypePuissance()->getEquipementType(),$equipement->getAge(), $equipement->getLastContrat()->getContratType());
                    $equipementOption->setPrixHt($prix);
                    $equipementOption->setSousContrat(true);
                } else {
                    $equipementOption->setSousContrat(false);
                }

                $em->persist($equipementOption);
                $em->flush();
            }
        }

        return new JsonResponse(['messages' => ['success' => ["Ajout effectué avec succès"]]], Response::HTTP_OK);
    }

    /**
     * delete equipement  option
     * @Route("/option/delete/{id}", methods="DELETE", name="delete_equipement_option")
     */
    public function deleteEquipementOption(int $id = null): JsonResponse
    {
        $em = $this->getDoctrine()->getManager();
        try {
            $equipementOption = $em->getRepository(EquipementOption::class)->find($id);
            if (!$equipementOption) {
                throw new \Exception('Option non trouvée');
            }
            if ($equipementOption->getDateDebut() <= new DateTime() && !$equipementOption->getDateFin()) {
                $equipementOption->setDateResiliation(new DateTime());
                if ($equipementOption->getEquipement()->getLastContrat() && $equipementOption->getEquipement()->getLastContrat()->getDateFinContrat() > new DateTime())
                    $equipementOption->setDateFin($equipementOption->getEquipement()->getLastContrat()->getDateFinContrat());
                $em->persist($equipementOption);
            } else {
                if ($equipementOption->getDateDebut() > new DateTime()) {
                    $em->remove($equipementOption);
                }
            }

            $em->flush();

            return new JsonResponse(['success' => true]);
        } catch (\Exception $e) {
            return new JsonResponse([
                'success' => false,
                'message' => $e->getMessage()
            ], 400);
        }
    }

    /**
     * @Route("/resilier_contrat/{id}/", methods="POST", name="post_equipement_resilier_contrat")
     */
    public function resilierContrat(Equipement $equipement, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();
        $contratResiliation = null;

        if (isset($datas['id_contrat_resiliation']) && !empty($datas['id_contrat_resiliation'])) {
            $contratResiliation = $this->getDoctrine()->getRepository(ContratResiliation::class)->find($datas['id_contrat_resiliation']);
        }

        if (!empty($datas['mode_resilisation_client'])) {
            $date_resiliation = (isset($datas['date_resiliation']) && !empty($datas['date_resiliation']) && $datas['type_date_resiliation'] != 'contrat')
                ? DateTime::createFromFormat('Y-m-d', $datas['date_resiliation'])
                : $equipement->getLastContrat()->getDateFinContrat();
            $typeEnvoi = $this->getDoctrine()->getRepository(TypeEnvoi::class)->findOneBy(['libelle' => $datas['mode_resilisation_client']]);
            $motifResiliationDonne = (isset($datas['motif_resiliation_donne']) && $datas['motif_resiliation_donne'] == 'oui') ? true : false;

            $contrat = $equipement->getLastContrat();
            if ($contrat) {
                if (!$contratResiliation) {
                    $contratResiliation = new ContratResiliation();
                }

                $contratResiliation->setDate($date_resiliation);
                $contratResiliation->setContrat($contrat);
                $contratResiliation->setTypeEnvoi($typeEnvoi);

                if ($motifResiliationDonne) {
                    $motif = $this->getDoctrine()->getRepository(ContratMotifResiliation::class)->find($datas['motif']);
                    $contratResiliation->setContratMotifResiliation($motif);
                    if (isset($datas['marque_change']) && !empty($datas['marque_change'])){
                        $marqueAutre = $this->getDoctrine()->getRepository(EquipementMarque::class)->find($datas['marque_change']);
                        $contratResiliation->setEquipementMarque($marqueAutre);
                    } else if (isset($datas['resiliation_autre_input']) && !empty($datas['resiliation_autre_input'])) {
                        $contratResiliation->setMotifSiAutre($datas['resiliation_autre_input']);
                    } else if (isset($datas['resiliation_intervention_insatisfait']) && !empty($datas['resiliation_intervention_insatisfait'])) {
                        $intervention = $this->getDoctrine()->getRepository(Intervention::class)->find($datas['resiliation_intervention_insatisfait']);
                        $contratResiliation->setIntervention($intervention);
                    }
                }
                $em->persist($contratResiliation);
                $em->flush();
            }
        }
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
    }

    /**
     * @Route("/annuler/resilier_contrat/{id}", methods="GET", name="equipement_cancel_resiliation_contrat")
     */
    public function AnnulationResiliationContrat(ContratResiliation $contratResiliation) {
        $em = $this->getDoctrine()->getManager();
        $idClient = $contratResiliation->getContrat()->getClient()->getId();
        $idEquipement = $contratResiliation->getContrat()->getEquipement()->getId();

        $em->remove($contratResiliation);
        $em->flush();

        $this->addFlash('success', "Résiliation de contrat annulée avec succès");

        return $this->redirect($this->generateUrl('show_client', ['id' => $idClient]).'?id_equipement='.$idEquipement);
    }

    /**
     * @Route("/logement_vide/{id}", methods="GET", name="equipement_logement_vide")
     */
    public function LogementVide(Equipement $equipement) {
        $em = $this->getDoctrine()->getManager();
        $equipement->setClientUtilisateur(null)->setLogementVide(true);
        //on historise le changement
        $historiqueEquipementUtilisateur = new HistoriqueEquipementUtilisateur();
        $historiqueEquipementUtilisateur->setEquipement($equipement)->setUtilisateurModif(null)->setDateHeure(new DateTime())->setUtilisateurModif($this->getUser());
        $em->persist($historiqueEquipementUtilisateur);
        $em->persist($equipement);
        $em->flush();

        $this->addFlash('success', "Ajout logement vide avec succès");
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
    }


    /**
     * @Route("/equipement_details/{id}/", methods="POST", name="post_equipement_details_installation")
     */
    public function equipementDetails(Equipement $equipement, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();

        $zones = $equipement->getEquipementZones();
        if (isset($datas['equipement_detail_energie']) && $datas['equipement_detail_energie'] != $equipement->getEnergie()->getId()) {
            $energie = $this->getDoctrine()->getRepository(Energie::class)->find((int)$datas['equipement_detail_energie']);
            $equipement->setEnergie($energie);
        }
        if (isset($datas['equipement_detail_raccordement']) && !empty($datas['equipement_detail_raccordement'])) {
            $raccordement = $this->getDoctrine()->getRepository(Raccordement::class)->find((int)$datas['equipement_detail_raccordement']);
            $equipement->setRaccordement($raccordement);
        }
        for($i=0; $i<=2;$i++) {
            $name = 'zone' . $i;
            if (isset($datas['equipement_zone_' . $i]) && !empty($datas['equipement_zone_'.$i])) {
                $typeZone = $this->getDoctrine()->getRepository(TypeZone::class)->find((int)$datas['equipement_zone_' . $i]);
                if (isset($zones[$i])) {
                    if ($typeZone != $zones[$i]->getTypeZone()) $zones[$i]->setTypeZone($typeZone);
                    $em->persist($zones[$i]);
                } else {
                    $$name = new EquipementZone();
                    $$name->setEquipement($equipement);
                    $$name->setNumero($i +1);
                    $$name->setTypeZone($typeZone);
                    $em->persist($$name);
                }
            }
            if (isset($datas['zone_' . $i . '_autre']) && !empty($datas['zone_' . $i . '_autre'])) {
                if (isset($zones[$i])) {
                    $zones[$i]->setPrecisionSiAutre($datas['zone_' . $i . '_autre']);
                    $em->persist($zones[$i]);
                }
                else {
                    $$name->setPrecisionSiAutre($datas['zone_' . $i . '_autre']);
                    $em->persist($$name);
                }
            }
        }
        $em->persist($equipement);
        $em->flush();

        $this->addFlash('success', "Modification effectuée avec succès");

        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
    }
    /**
 * getAgent appareils
 * @Route("/equipement/{id}/installations", methods="GET", name="get_equipement_installations")
 */
    public function getEquipementInstallationGrid(Equipement $equipement) {
        $result = [];
        foreach ($equipement->getEquipementInstallations() as $equipementInstallation) {
            $type = '';
            if ($equipementInstallation->getProtectionSanitaire()) $type = $equipementInstallation->getProtectionSanitaire()->getLibelle();
            else if ($equipementInstallation->getRobinetRemplissage()) $type = $equipementInstallation->getRobinetRemplissage()->getLibelle();
            else if ($equipementInstallation->getRobinetSiAutre()) $type = $equipementInstallation->getRobinetSiAutre();
            $result[] = [
                'id' => $equipementInstallation->getId(),
                'installation' => $equipementInstallation->getTypeInstallation()->getId(),
                'type' => $type  ,
                'localisation' => $equipementInstallation->getLocalisation(),
            ];
        }
        $response = json_encode(['data' => $result, 'totalCount' => count($result)]);

        return new Response(
            $response,
            Response::HTTP_OK,
            ['Content-type' => 'application/json']
        );
    }

    /**
     * getEquipement compléments
     * @Route("/equipement/{id}/complements", methods="GET", name="get_equipement_complements")
     */
    public function getEquipementComplementsGrid(Equipement $equipement) {
        $result = [];
        foreach ($equipement->getEquipementComplements() as $equipementComplement) {

            $result[] = [
                'id' => $equipementComplement->getEquipement()->getId() .'-'.$equipementComplement->getTypeComplement()->getId(),
                'type' => $equipementComplement->getTypeComplement()->getId(),
                'presence' => $equipementComplement->getPresent()  ,
                'marque' => ($equipementComplement->getEquipementMarque()) ? $equipementComplement->getEquipementMarque()->getId() : null,
                'num_serie' => $equipementComplement->getNumSerieFrisquet(),
            ];
        }
        $response = json_encode(['data' => $result, 'totalCount' => count($result)]);

        return new Response(
            $response,
            Response::HTTP_OK,
            ['Content-type' => 'application/json']
        );
    }

    /**
     * create / maj equipement  complement
     * @Route("/equipement/{id}/complement", methods="POST", name="post_equipement_complement")
     * @Route("/equipement/complement/{idEquipementComplement}", methods="PATCH", name="patch_equipement_complement")
     */
    public function createMajEquipementComplement(Equipement $equipement = null, Request $request, $idEquipementComplement = null) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();

        foreach($datas as $key => $value) {
            $datas[$key] = Functions::clearData($value);
        }

        if ($idEquipementComplement) {
            $exploded = explode('-', $idEquipementComplement);
            $equipement = $this->getDoctrine()->getRepository(Equipement::class)->find($exploded[0]);
            $typeComplement = $this->getDoctrine()->getRepository(TypeComplement::class)->find($exploded[1]);

            $equipementComplement = $this->getDoctrine()->getRepository(EquipementComplement::class)->findOneBy(['equipement' => $equipement, 'type_complement' => $typeComplement]);
        } else {
            $equipementComplement = new EquipementComplement();
            $equipementComplement->setEquipement($equipement);
        }
        if (isset($datas['type'])) {
            $type = $this->getDoctrine()->getRepository(TypeComplement::class)->find($datas['type']);
            $equipementComplement->setTypeComplement($type);
        }
        if (isset($datas['marque'])) {
            $marque = $this->getDoctrine()->getRepository(EquipementMarque::class)->find($datas['marque']);
            $equipementComplement->setEquipementMarque($marque);
            if ($datas['marque'] == EquipementMarque::ID_MARQUE_FRISQUET && isset($datas['num_serie'])) {
                $equipementComplement->setNumSerieFrisquet($datas['num_serie']);
            }
        }
        if (isset($datas['presence'])) $equipementComplement->setPresent($datas['presence']);

        $em->persist($equipementComplement);
        $em->flush();

        return new JsonResponse(['messages' => ['success' => ["Ajout effectué avec succès"]]], Response::HTTP_OK);
    }

    /**
     * deleteAgent qualifications
     * @Route("/equipement_complement/{idEquipementComplement}", methods="DELETE", name="delete_equipement_complement")
     */
    public function deleteEquipementComplement($idEquipementComplement = null) {
        if ($idEquipementComplement) {
            $exploded = explode('-', $idEquipementComplement);
            $equipement = $this->getDoctrine()->getRepository(Equipement::class)->find($exploded[0]);
            $typeComplement = $this->getDoctrine()->getRepository(TypeComplement::class)->find($exploded[1]);

            $equipementComplement = $this->getDoctrine()->getRepository(EquipementComplement::class)->findOneBy(['equipement' => $equipement, 'type_complement' => $typeComplement]);
            $this->getDoctrine()->getManager()->remove($equipementComplement);
            $this->getDoctrine()->getManager()->flush();
        }

        return new JsonResponse(['messages' => ['success' => ["Suppression effectuée avec succès"]]], Response::HTTP_OK);
    }

    /**
     * maj equipement groupe
     * @Route("/groupe", methods="POST", name="post_equipement_groupe")
     */
    public function postEquipementGroupe(Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();
        $groupeEquipement = 0;
        $groupeType = null;
        $message_error = '';
        $num_groupe =  null;

        if ($datas['idclient'] && isset($datas['equips']) && ((count($datas['equips']) > 1 && $datas['action'] == 'link') || $datas['action'] == 'del')) {
            foreach ($datas['equips'] as $equipId) {
                if ($datas['id_groupe_' . $equipId])  {
                    $groupeEquipement = $datas['id_groupe_' . $equipId];
                    $groupeType = $em->getRepository(EquipementGroupeType::class)->find($datas['groupe_type_' . $equipId]);
                    break;
                }
            }
            if (!$groupeEquipement)  {
                $groupe = $em->getRepository(EquipementGroupe::class)->getNextGroupe();
                $groupeEquipement = (!empty($groupe[0])) ? $groupe[0] : 1;
            }
            if (!$groupeType && isset($datas['groupe_type']) && !empty($datas['groupe_type'])) {
                $groupeType = $em->getRepository(EquipementGroupeType::class)->find($datas['groupe_type']);
            }
            if ($groupeType) {
                foreach($datas['equips'] as $equipId) {
                    $equipement = $em->getRepository(Equipement::class)->find($equipId);

                    if ($datas['action'] == 'link' && count($equipement->getEquipementGroupes()) == 0) {
                        $equipementGroupe = new EquipementGroupe();
                        $equipementGroupe->setEquipement($equipement);
                        $equipementGroupe->setNumeroGroupe($groupeEquipement);
                        $equipementGroupe->setGroupeType($groupeType);

                        $equipement->addEquipementGroupe($equipementGroupe);

                        $em->persist($equipement);

                    } elseif ($datas['action'] == 'del') {
                        foreach ($equipement->getEquipementGroupes() as $groupe) {
                            $num_groupe = $groupe->getNumeroGroupe();
                            $em->remove($groupe);
                        }
                    }
                }
                $em->flush();
                //si on a un num groupe, on regarde si il reste des éléments dans le groupe sinon on le supprime
                if ($num_groupe)  {
                    $equipementGroupes = $this->getDoctrine()->getRepository(EquipementGroupe::class)->findBy(['numero_groupe' => $num_groupe]);
                    if (count($equipementGroupes) == 1) {
                        $em->remove($equipementGroupes[0]);
                    }

                }
                $em->flush();
            } else {
                $message_error = 'Vous devez sélectionner un type de groupe';
            }
        }
        $groupeTypes = $this->getDoctrine()->getRepository(EquipementGroupeType::class)->findAll();
        $client = $em->getRepository(Client::class)->find($datas['idclient']);

        $html = $this->renderView('clients/_equipements_lies.html.twig', [
            'groupeTypes' => $groupeTypes,
            'client' => $client,
            'message_error' => $message_error
        ]);

        return new JsonResponse(['html' => $html], Response::HTTP_OK);
    }
    /**
     * désactiver un equipement
     * @Route("/inactif/{id}", methods="POST", name="equipement_inactif")
     */
    public function inactifEquipement(Equipement $equipement,Request $request) {
        $datas = $request->request->all();
        $em = $this->getDoctrine()->getManager();
        $equipement->setActif(false);
        if (isset($datas['commentaire_desactivation-'.$equipement->getId()]) && !empty($datas['commentaire_desactivation-'.$equipement->getId()]))
            $equipement->setCommentaireDesactivation($datas['commentaire_desactivation-'.$equipement->getId()]);
        $num_groupe = '';
        foreach ($equipement->getEquipementGroupes() as $equipementGroupe) {
            $em->remove($equipementGroupe);
            $num_groupe = $equipementGroupe->getIdgroupe();
        }
        $em->flush();
        if ($num_groupe)  {
            $equipementGroupes = $this->getDoctrine()->getRepository(EquipementGroupe::class)->findBy(['idgroupe' => $num_groupe]);
            if (count($equipementGroupes) == 1) {
                $em->remove($equipementGroupes[0]);
            }
        }

        $em->flush();
        $em->persist($equipement);
        $em->flush();

        $this->addFlash('success', "Equipement désactivé avec succès");
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]) . '?id_equipement=' . $equipement->getId());
    }

    /**
     * désactiver un equipement
     * @Route("/cancel_inactif/{id}", methods="GET", name="equipement_cancel_inactif")
     */
    public function cancelInactifEquipement(Equipement $equipement) {
        $em = $this->getDoctrine()->getManager();
        $equipement->setActif(true);
        $equipement->setCommentaireDesactivation(null);

        $em->persist($equipement);
        $em->flush();

        $this->addFlash('success', "Equipement activé avec succès");
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]) . '?id_equipement='.$equipement->getId());
    }

    /**
     * change client utilisateur to souscripteur
     * @Route("/utilisateur_souscripteur/{id}", methods="POST", name="equipement_utilisateur_souscripteur")
     */
    public function utilisateurToSouscripteur(Equipement $equipement,Request $request) {
        $datas = $request->request->all();
        $em = $this->getDoctrine()->getManager();
        $actualSouscripteur = $equipement->getClientSouscripteur();
        if (isset($datas['type_transformation'])) {
            if ($datas['type_transformation'] == 'meme_equipement') {
                $actualSouscripteur = $equipement->getClientSouscripteur();
                $equipement->setClientSouscripteur($equipement->getClientUtilisateur());
                $equipement->setClientUtilisateur(null);
                $equipement->setClientAncienSouscripteur($actualSouscripteur);
                $equipement->setDateAncienSouscripteur(new DateTime());
                $historiqueEquipementUtilisateur = new HistoriqueEquipementUtilisateur();
                $historiqueEquipementUtilisateur
                    ->setEquipement($equipement)
                    ->setDateHeure(new DateTime())
                    ->setUtilisateurModif($this->getUser())
                    ->setUtilisateur(null)->setCommentaire("Utilisateur transformé en souscripteur");

                $em->persist($historiqueEquipementUtilisateur);
                $em->persist($equipement);
                $em->flush();

                $this->addFlash('success', "L'utilisateur a bien été transformé en souscripteur");
                return $this->redirect($this->generateUrl('show_client', ['id' => $actualSouscripteur->getId()]));
            }else if ($datas['type_transformation'] == 'new_equipement') {
                return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientUtilisateur()->getId()]));
            }
        }
        return $this->redirect($this->generateUrl('show_client', ['id' => $actualSouscripteur->getId()]));
    }

    /**
     * search Equipement
     * @Route("/search", methods="POST", name="equipement_search")
     */
    public function searchEquipement(Request $request) {
        $datas = $request->request->all();
        $equipement = null;
        $hasFacture = false;
        //mettre une anomalie si il reste une facture à payer par l'ancien souscripteur de l'equipement
        if (isset($datas['adresse_equipement_search']) && !empty($datas['adresse_equipement_search'])) {
            $equipements = $this->getDoctrine()->getRepository(Equipement::class)->findByAdresse($datas);
            /*if ($equipement) {
                foreach ($equipement->getFactures() as $facture) {
                    if ($facture->getMontantTtc() >0) {
                        if (count($facture->getPaiements()) == 0) {
                            $hasFacture = true;
                            continue;
                        }
                    }
                }
            }*/
        }

        $html = $this->renderView('clients/_result_search_equipement.html.twig', [
            'equipements' => $equipements,
            'hasFacture' => $hasFacture,
        ]);

        return new JsonResponse(['html' => $html], Response::HTTP_OK);
    }

    /**
     * changement de souscripteur
     * @Route("/change_souscripteur/{id}", methods="POST", name="change_souscripteur")
     * @ParamConverter("client", class="App:Client")
     */
    public function changeSouscripteur(Client $client,Request $request, ClientManager $clientManager, EquipementManager $equipementManager) {
        $datas = $request->request->all();
        $em = $this->getDoctrine()->getManager();
        if (isset($datas['id_equipement']) && isset($datas['type_add'])) {
            if ($datas['type_add'] == 'recherche' && isset($datas['new_client_souscripteur']) && !empty($datas['new_client_souscripteur'])) {
                $newClient = $em->getRepository(Client::class)->find($datas['new_client_souscripteur']);
            } else if ($datas['type_add'] == 'new' &&
                (
                    ($datas['type_client'] == TypeClient::ID_TYPE_PARTICULIER && !empty($datas['client_nom']))
                    || ($datas['type_client'] == TypeClient::ID_TYPE_PRO && !empty($datas['client_entreprise']))
                )
            ) {
                $newClient = $clientManager->createClient($datas);
                $em->persist($newClient);
            }

            $idEquipement = $datas['id_equipement'];
            $equipement = $em->getRepository(Equipement::class)->find((int)$idEquipement);

            if (!$newClient->getAdresse() ) {
                $clientAdresse = new ClientAdresse();
                $clientAdresse->setActif(true);
                $clientAdresse->setAdresse($equipement->getAdresse());
                $clientAdresse->setClient($newClient);
                $newClient->addClientAdress($clientAdresse);
            }

            $equipement->setClientAncienSouscripteur($equipement->getClientSouscripteur());
            $equipement->setDateAncienSouscripteur(new DateTime());
            $equipement->setClientSouscripteur($newClient);
            if (!$equipement->getClientUtilisateur() && $equipement->getEquipementPreferencesPlanification())  {
                $equipement->setEquipementPreferencesPlanification(null);
            }

            $em->persist($newClient);
            $em->persist($equipement);


            $em->flush();

            $this->addFlash('success', "Changement de souscripteur effectué avec succès");
        }

        return $this->redirect($this->generateUrl('show_client', ['id' => $newClient->getId()]).'?id_equipement='.$idEquipement);
    }

    /**
     * Ajout d'un utilisateur
     * @Route("/add_utilisateur/{id}", methods="POST", name="equipement_add_utilisateur")
     * @ParamConverter("equipement", class="App:Equipement")
     */
    public function addUtilisateur(Equipement $equipement,Request $request, ClientManager $clientManager) {
        $datas = $request->request->all();
        $em = $this->getDoctrine()->getManager();
        if (isset($datas['type_add'])) {
            $historiqueEquipementUtilisateur = new HistoriqueEquipementUtilisateur();
            $historiqueEquipementUtilisateur->setEquipement($equipement)->setDateHeure(new DateTime())->setUtilisateurModif($this->getUser());
            if ($datas['type_add'] == 'recherche' && isset($datas['new_client_souscripteur']) && !empty($datas['new_client_souscripteur'])) {
                $utilisateur = $em->getRepository(Client::class)->find($datas['new_client_souscripteur']);
                $equipement->setClientUtilisateur($utilisateur)->setLogementVide(false);
                $historiqueEquipementUtilisateur->setUtilisateur($utilisateur);
                $em->persist($historiqueEquipementUtilisateur);
                $em->persist($equipement);
                $em->flush();
            }
            if ($datas['type_add'] == 'new' &&
                (
                    ($datas['type_client'] == TypeClient::ID_TYPE_PARTICULIER && !empty($datas['client_nom']))
                || ($datas['type_client'] == TypeClient::ID_TYPE_PRO && !empty($datas['client_entreprise']))
                )
            ) {
                $client = $clientManager->createClient($datas);
                $em->persist($client);
                $equipement->setClientUtilisateur($client)->setLogementVide(false);
                $historiqueEquipementUtilisateur->setUtilisateur($client);
                $em->persist($historiqueEquipementUtilisateur);
                $em->persist($equipement);
                $em->flush();
            }


            $this->addFlash('success', "Ajout d'un utilisateur effectué avec succès");
        }
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId());
    }

    /**
     * maj des informations techniques equipement
     * @Route("/maj_infos_technique{id}", methods="POST", name="equipement_maj_infos_technique")
     */
    public function maj_infos_technique(Equipement $equipement,Request $request) {
        $datas = $request->request->all();
        $em = $this->getDoctrine()->getManager();

        if (isset($datas['type_change']) && !empty($datas['type_change']))
        {
            $id = $datas['data_value'];
            if (stripos( $datas['type_change'],'famille_equipement') !== false) {
                $equipementFamille = $em->getRepository(EquipementFamille::class)->find((int)$id);
                $types = $em->getRepository(EquipementType::class)->getTypeByFamille($id);
                $is_pac = $equipementFamille->isPAC();
                $template_name = ($is_pac ? 'pac' : 'chaudiere');
                $famillesEquipement = $this->getDoctrine()->getRepository(EquipementFamille::class)->findAll();
                $puissances = $this->getDoctrine()->getRepository(EquipementPuissance::class)->findAll();
                $locaux = $this->getDoctrine()->getRepository(EquipementLocal::class)->findAll();
                $raccordements = $this->getDoctrine()->getRepository(Raccordement::class)->findAll();
                $energies = $this->getDoctrine()->getRepository(Energie::class)->findAll();
                $typesEnergie = $this->getDoctrine()->getRepository(TypeEnergie::class)->findAll();
                $equipementAlimentations = $this->getDoctrine()->getRepository(EquipementAlimentation::class)->findAll();
                $equipementFluides = $this->getDoctrine()->getRepository(EquipementFluide::class)->findAll();
               //sur un changement de famille , PAC => Chaudiere et inversement, on doit recharger toute la visu qui est différente...

               $html = $this->renderView('clients/informations_technique/infostec_'.$template_name.'.html.twig', [
                   'typesEquipement' => $types,
                   'equipement' => $equipement,
                   'is_pac' => $is_pac,
                   'famillesEquipement' => $famillesEquipement,
                   'selected_famille' => $id,
                   'puissances' => $puissances,
                   'energies' => $energies,
                   'raccordements' => $raccordements,
                   'locaux' => $locaux,
                   'typesEnergie' => $typesEnergie,
                   'equipementAlimentations' => $equipementAlimentations,
                   'equipementFluides' => $equipementFluides,
                   'disabled' => '',
               ]);

            } elseif (stripos( $datas['type_change'],'equipement_type') !== false) {
                $equipementType = $em->getRepository(EquipementType::class)->find((int)$id);
                $puissances = $em->getRepository(EquipementPuissance::class)->getPuissancesByType($id);
                $html = $this->renderView('clients/informations_technique/_select_equipement_puissances.html.twig', [
                    'puissances' => $puissances,
                    'equipement' => $equipement,
                    'disabled' => '',
                    'is_pac' => $equipementType->getEquipementTypeFamilles()->first()->getEquipementFamille()->isPAC(),
                ]);
            } else {
                $typeEnergie = $em->getRepository(TypeEnergie::class)->find((int)$id);
                $energies = $em->getRepository(Energie::class)->findBy(['type_energie' => $typeEnergie]);
                $html = $this->renderView('clients/informations_technique/_energie.html.twig', [
                    'energies' => $energies,
                    'equipement' => $equipement,
                    'disabled' => '',
                ]);
            }
        }
        return new JsonResponse(['html' => $html], Response::HTTP_OK);
    }

    /**
     * maj équipement
     * @Route("/maj_equipement", methods="POST", name="equipement_maj")
     */
    public function majEquipement(Request $request, LockManager $lockManager){
        $datas = $request->request->all();
        $em = $this->getDoctrine()->getManager();
        $idEquipement = $datas['id_equipement_update'];
        $idClient = $datas['id_client'];
        $exist = false;
        if ($idEquipement) {
            $equipement = $em->getRepository(Equipement::class)->find((int)$idEquipement);
            $souscripteur = $equipement->getClientSouscripteur();
            $utilisateur = $equipement->getClientUtilisateur();
        } else {
            $souscripteur = $em->getRepository(Client::class)->find((int)$idClient);
            $equipement = null;
            $utilisateur = null;
        }

        //check Site
        if (count($souscripteur->getClientSites())  == 0) {
            if (isset($datas['souscripteur_site'])) $site = $em->getRepository(Site::class)->find((int)$datas['souscripteur_site']);
            else $site = $this->getUser()->getUtilisateurSites()->first()->getSite();
            $clientSite = new ClientSite();
            $clientSite->setClient($souscripteur);
            $clientSite->setSite($site);
            $em->persist($clientSite);
        }
        //check souscripteur
        if (isset($datas['type_client']) && (!$souscripteur->getTypeClient() || ($souscripteur->getTypeClient() && $souscripteur->getTypeClient()->getId() != $datas['type_client']))) {
            $typeClient = $em->getRepository(TypeClient::class)->find((int)$datas['type_client']);
            $souscripteur->setTypeClient($typeClient);
        }
        if (isset($datas['categorie_pro']) && (!$souscripteur->getCategoriePro() || ($souscripteur->getCategoriePro() && $souscripteur->getCategoriePro()->getId() != $datas['categorie_pro']))) {
            $categoriePro = $em->getRepository(CategoriePro::class)->find((int)$datas['categorie_pro']);
            $souscripteur->setCategoriePro($categoriePro);
        }
        if (isset($datas['client_entreprise'])) $souscripteur->setNomEntreprise($datas['client_entreprise']);
        if (isset($datas['etat_civil']) && (!$souscripteur->getEtatCivil() || ($souscripteur->getEtatCivil() && $souscripteur->getEtatCivil()->getId() != $datas['etat_civil']))) {
            $etatCivil = $em->getRepository(EtatCivil::class)->find((int)$datas['etat_civil']);
            $souscripteur->setEtatCivil($etatCivil);
        }
        if (isset($datas['souscripteur_nom'])) $souscripteur->setNom($datas['souscripteur_nom']);
        if (isset($datas['souscripteur_prenom'])) $souscripteur->setPrenom($datas['souscripteur_prenom']);

        //todo numéro et email
        if (isset($datas['souscripteur_code_postal'])) {
            if ($souscripteur->getAdresse()) {
                $adresse = $souscripteur->getClientAdresses()[0]->getAdresse();
                $exist = true;
            } else {
                $adresse = new Adresse();
            }
            if(isset($datas['client_adresse_auto']) && !empty($datas['client_adresse_auto']) &&  $adresse->getLisibleAdresse() != $datas['client_adresse_auto']) {
                $adresse->setCodePostal($datas['souscripteur_code_postal']);
                $adresse->setVille($datas['souscripteur_ville']);
                $adresse->setAdresse($datas['souscripteur_adresse']);
                $coordinates = explode(',',$datas['souscripteur_coordinates']);
                if ($equipement && (!$utilisateur  || $equipement->getAdresse() == $adresse)) {
                    $secteursActual = $em->getRepository(Secteur::class)->getSecteursFromCoordinates($adresse->getLongitude(),$adresse->getLatitude());
                    $newSecteurs = $em->getRepository(Secteur::class)->getSecteursFromCoordinates($coordinates[0],$coordinates[1]);
                    foreach($secteursActual as $secteur) {
                        $equipement_secteur = $em->getRepository(SecteurEquipement::class)->findOneBy(['equipement' => $equipement, 'secteur' => $secteur]);
                        if ($equipement_secteur) $em->remove($equipement_secteur);
                    };
                    foreach($newSecteurs as $secteur) {
                        $equipement_secteur = $em->getRepository(SecteurEquipement::class)->findOneBy(['equipement' => $equipement, 'secteur' => $secteur]);
                        if (!$equipement_secteur) {
                            $equipement_secteur = new SecteurEquipement();
                            $equipement_secteur->setEquipement($equipement)->setSecteur($secteur);
                            $equipement->addSecteurEquipement($equipement_secteur);
                            $em->persist($equipement);
                        }
                    }
                }
                $adresse->setLatitude($coordinates[1]);
                $adresse->setLongitude($coordinates[0]);

            }
            $em->persist($adresse);
            if (!$exist) {
                $clientAdresse = new ClientAdresse();
                $clientAdresse->setAdresse($adresse)->setClient($souscripteur);
                $em->persist($clientAdresse);
            }
        }
        //gestion tel et email
        if (isset($datas['client'])) $this->handleTelEmail($souscripteur, $datas['client']);
        if (isset($datas['utilisateur']) && $utilisateur) $this->handleTelEmail($utilisateur, $datas['utilisateur'][$utilisateur->getId()]);

        if ($souscripteur)
            $em->persist($souscripteur);
        //check informations techniques
        if (isset($datas['famille_equipement-' . $idEquipement]) && (!$equipement->getEquipementFamille() || ($equipement->getEquipementFamille() && $equipement->getEquipementFamille()->getId() != $datas['famille_equipement-' . $idEquipement]))) {
            $familleEquipement = $em->getRepository(EquipementFamille::class)->find((int)$datas['famille_equipement-' . $idEquipement]);
            $equipement->setEquipementFamille($familleEquipement);
        }
        if (isset($datas['numero_serie-' . $idEquipement])) $equipement->setNumSeriePrincipal(str_replace(' ', '',$datas['numero_serie-' . $idEquipement]));
        if (isset($datas['numero_serie_secondaire-' . $idEquipement])) $equipement->setNumSerieSecondaire(str_replace(' ', '',$datas['numero_serie_secondaire-' . $idEquipement]));
        if (isset($datas['numero_upec-' . $idEquipement])) $equipement->setNumUpec($datas['numero_upec-' . $idEquipement]);
        if (isset($datas['equipement_type-' . $idEquipement]) && isset($datas['equipement_puissance-' . $idEquipement])) {
            $equipementType = $em->getRepository(EquipementType::class)->find((int)$datas['equipement_type-' . $idEquipement]);
            $equipementPuissance = $em->getRepository(EquipementPuissance::class)->find((int)$datas['equipement_puissance-' . $idEquipement]);
            $equipementTypePuissance = $em->getRepository(EquipementTypePuissance::class)->findOneBy(['equipement_type' => $equipementType,'equipement_puissance' => $equipementPuissance]);
            $equipement->setEquipementTypePuissance($equipementTypePuissance);
        }
        if (isset($datas['equipement_energie-' . $idEquipement])  && (!$equipement->getEnergie() || ($equipement->getEnergie() && $equipement->getEnergie()->getId() != $datas['equipement_energie-' . $idEquipement]))) {
            $energie = $em->getRepository(Energie::class)->find((int)$datas['equipement_energie-' . $idEquipement]);
            $equipement->setEnergie($energie);
        }
        if (isset($datas['equipement_fluide-' . $idEquipement])  && (!$equipement->getEquipementFluide() || ($equipement->getEquipementFluide() && $equipement->getEquipementFluide()->getId() != $datas['equipement_fluide-' . $idEquipement]))) {
            $equipementFluide = $em->getRepository(EquipementFluide::class)->find((int)$datas['equipement_fluide-' . $idEquipement]);
            $equipement->setEquipementFluide($equipementFluide);
        }
        if (isset($datas['equipement_charge_totale-' . $idEquipement])) {
            $charge_total = (empty($datas['equipement_charge_totale-' . $idEquipement]) ? null : $datas['equipement_charge_totale-' . $idEquipement]);
            $equipement->setChargeTotale($charge_total);
        }
        if (isset($datas['equipement_tonnage-' . $idEquipement])) {
            $tonnage = (empty($datas['equipement_tonnage-' . $idEquipement]) ? null : $datas['equipement_tonnage-' . $idEquipement]);
            $equipement->setTonnageEqCo2($tonnage);
        }
        if (isset($datas['lieu_si_autre-' . $idEquipement])) $equipement->setLieuSiAutre($datas['lieu_si_autre-' . $idEquipement]);
        if (isset($datas['equipement_raccordement-' . $idEquipement])  && (!$equipement->getRaccordement() || ($equipement->getRaccordement() && $equipement->getRaccordement()->getId() != $datas['equipement_raccordement-' . $idEquipement]))) {
            $raccordement = $em->getRepository(Raccordement::class)->find((int)$datas['equipement_raccordement-' . $idEquipement]);
            $equipement->setRaccordement($raccordement);
        }
        if (isset($datas['salarie_frisquet'])) {
            $equipement->setSalarieFrisquet(($datas['salarie_frisquet'] != "false" && $datas['salarie_frisquet'] != ""));
        }
        if (isset($datas['equipement_chantier'])) {
            $chantier = str_replace('N°', '', $datas['equipement_chantier']);
            $chantier = (!empty($chantier)) ? $chantier : 0;
            $equipement->setChantier($chantier);
        } else {
            $equipement->setChantier(null);
        }
//        if (isset($datas['vmc-' . $idEquipement])) {
//            $vmc = ($datas['vmc-' . $idEquipement] == 'oui') ? true : false;
//            $equipement->setVmc($vmc);
//        }
        if (isset($datas['date_premier_allumage-' . $idEquipement]) && !empty($datas['date_premier_allumage-' . $idEquipement])) {
            $date_allumage =  DateTime::createFromFormat('Y-m-d', $datas['date_premier_allumage-' . $idEquipement]);
            $equipement->setDatePremierAllumage($date_allumage);
        }
        if (isset($datas['equipement_local-' . $idEquipement])  && (($equipement->getEquipementLocal() && $equipement->getEquipementLocal()->getId() != $datas['equipement_local-' . $idEquipement]) || !$equipement->getEquipementLocal())) {
            $equipementLocal = $em->getRepository(EquipementLocal::class)->find((int)$datas['equipement_local-' . $idEquipement]);
            //on historise si la valeur à changer
            if ($equipementLocal != $equipement->getEquipementLocal()) {
                $historiqueEquipementLocal = new HistoriqueEquipementLocal();
                $historiqueEquipementLocal->setEquipement($equipement)->setEquipementLocal($equipementLocal)->setDateHeure(new DateTime())->setUtilisateurModif($this->getUser());
                $em->persist($historiqueEquipementLocal);
            }
            $equipement->setEquipementLocal($equipementLocal);

        }
        if (isset($datas['tva-' . $idEquipement])  && (!$equipement->getTauxTva() || ($equipement->getTauxTva() && $equipement->getTauxTva()->getId() != $datas['tva-' . $idEquipement]))) {
            $taux = $em->getRepository(TauxTva::class)->find((int)$datas['tva-' . $idEquipement]);
            $equipement->setTauxTva($taux);
        }
        if ($equipement)
            $em->persist($equipement);

        //check localisation
        if (isset($datas['logement_type-' . $idEquipement]) && !empty($datas['logement_type-' . $idEquipement])  && (!$equipement->getAdresse()->getTypeLogement() || ($equipement->getAdresse()->getTypeLogement() && $equipement->getAdresse()->getTypeLogement()->getId() != $datas['logement_type-' . $idEquipement]))) {
            $typeLogement = $em->getRepository(TypeLogement::class)->find((int)$datas['logement_type-' . $idEquipement]);
            $equipement->getAdresse()->setTypeLogement($typeLogement);
            $em->persist($equipement->getAdresse());
        }
        if (isset($datas['equipement_code_postal-' . $idEquipement]) && !empty($datas['equipement_code_postal-' . $idEquipement])) {
            //si on a pas d'utilisateur, on met à jours l'adresse souscripteur et donc equipement
            $besoin_nouvelle_adresse = ($equipement->getClientUtilisateur()  && $equipement->getAdresse() == $equipement->getClientSouscripteur()->getAdresseActive())
                ? true
                : false
            ;

            $adresse_equipement = ($besoin_nouvelle_adresse || !$equipement->getAdresse() ) ? new Adresse() : $equipement->getAdresse();

            $adresse_equipement->setCodePostal($datas['equipement_code_postal-'. $idEquipement]);
            $adresse_equipement->setVille($datas['equipement_ville-'. $idEquipement]);
            $adresse_equipement->setAdresse($datas['equipement_adresse-'. $idEquipement]);
            $coordinates = explode(',',$datas['equipement_coordinates-'. $idEquipement]);

            //maj secteur
            $secteursActual = $em->getRepository(Secteur::class)->getSecteursFromCoordinates($adresse->getLongitude(),$adresse->getLatitude());
            $newSecteurs = $em->getRepository(Secteur::class)->getSecteursFromCoordinates($coordinates[0],$coordinates[1]);
            foreach($secteursActual as $secteur) {
                $equipement_secteur = $em->getRepository(SecteurEquipement::class)->findOneBy(['equipement' => $equipement, 'secteur' => $secteur]);
                if ($equipement_secteur) $em->remove($equipement_secteur);
            };
            foreach($newSecteurs as $secteur) {
                $equipement_secteur = $em->getRepository(SecteurEquipement::class)->findOneBy(['equipement' => $equipement, 'secteur' => $secteur]);
                if (!$equipement_secteur) {
                    $equipement_secteur = new SecteurEquipement();
                    $equipement_secteur->setEquipement($equipement)->setSecteur($secteur);
                    $equipement->addSecteurEquipement($equipement_secteur);
                    $em->persist($equipement);
                }
            }

            $adresse_equipement->setLatitude($coordinates[1]);
            $adresse_equipement->setLongitude($coordinates[0]);
            $em->persist($adresse_equipement);
            if ($besoin_nouvelle_adresse || !$equipement->getAdresse()) {
                $equipement->setAdresse($adresse_equipement);
                $em->persist($equipement);
            }
        }

        //check contrat
        $contrat = ($equipement && $equipement->getLastContrat()) ? $equipement->getLastContrat() : new Contrat();
        $contrat_change = false;
        if (isset($datas['famille_contrat-' . $idEquipement]) && !empty($datas['famille_contrat-' . $idEquipement])   && (!$equipement->getEquipementFamilleContrat() || ($equipement->getEquipementFamilleContrat() && $equipement->getEquipementFamilleContrat()->getId() != $datas['famille_contrat-' . $idEquipement]))) {
            $contrat_change = true;
            $equipementFamilleContrat = $em->getRepository(EquipementFamilleContrat::class)->find((int)$datas['famille_contrat-' . $idEquipement]);
            $equipement->setEquipementFamilleContrat($equipementFamilleContrat);
        }
        if (isset($datas['contrat_type-' . $idEquipement]) && !empty($datas['contrat_type-' . $idEquipement])   && (!$contrat->getContratType() || ($contrat->getContratType() && $contrat->getContratType()->getId() != $datas['contrat_type-' . $idEquipement]))) {
            $contratType = $em->getRepository(ContratType::class)->find((int)$datas['contrat_type-' . $idEquipement]);
            $contrat->setContratType($contratType);
            $contrat_change = true;
        }
        if (isset($datas['date_souscription-' . $idEquipement]) && !empty($datas['date_souscription-' . $idEquipement])) {
            $date_souscription =  DateTime::createFromFormat('Y-m-d', $datas['date_souscription-' . $idEquipement]);
            $contrat->setDateSouscription($date_souscription);
            $contrat_change = true;
        }
        if (isset($datas['date_debut_contrat-' . $idEquipement]) && !empty($datas['date_debut_contrat-' . $idEquipement])) {
            $date_debut_contrat =  DateTime::createFromFormat('Y-m-d', $datas['date_debut_contrat-' . $idEquipement]);
            $contrat->setDateDebutContrat($date_debut_contrat);
            $contrat_change = true;
        }
        if (isset($datas['date_fin_contrat-' . $idEquipement]) && !empty($datas['date_fin_contrat-' . $idEquipement])) {
            $date_fin_contrat =  DateTime::createFromFormat('Y-m-d', $datas['date_fin_contrat-' . $idEquipement]);
            $contrat->setDateFinContrat($date_fin_contrat);
            $contrat_change = true;
        }
        if (isset($datas['date_paiement_contrat-' . $idEquipement]) && !empty($datas['date_paiement_contrat-' . $idEquipement])) {
            $date_paimement_contrat =  DateTime::createFromFormat('Y-m-d', $datas['date_paiement_contrat-' . $idEquipement]);
            $contrat->setDatePaiement($date_paimement_contrat);
            $contrat_change = true;
        }
        if (isset($datas['logement_2_ans-' . $idEquipement])) {
            $logement2ans = ($datas['logement_2_ans-' . $idEquipement] == 'oui') ? true : false;
            $equipement->setLogementPlus2Ans($logement2ans);
            $em->persist($equipement);
        }
        if (isset($datas['date_echeance-' . $idEquipement]) && !empty($datas['date_echeance-' . $idEquipement])) {
            $date_echeance =  DateTime::createFromFormat('Y-m-d', $datas['date_echeance-' . $idEquipement]);
            $contrat->setDateAvisEcheance($date_echeance);
            $contrat_change = true;
        }
        if (isset($datas['coefficient-' . $idEquipement]) && !empty($datas['coefficient-' . $idEquipement])) $contrat->setCoefficient((float)str_replace('%', '',$datas['coefficient-' . $idEquipement]));
        if ($contrat_change) {
            $contrat->setEquipement($equipement);
            $contrat->setClient($equipement->getClientSouscripteur());
            $em->persist($contrat);
        }
        $em->flush();
        $lockManager->checkLock('Equipement', $idEquipement , $this->getUser());

        if ($datas['process'] == 'close') {
            $lockManager->deleteLock('Equipement', $idEquipement , $this->getUser());
            $script = '<script>window.close();</script>';
            return new Response($script);
        }

        $this->addFlash('success', "Mise à jour effectuée avec succès");
        return $this->redirect($this->generateUrl('show_client', ['id' => $souscripteur->getId()]).'?id_equipement='.$idEquipement);
    }

    private function handleTelEmail($client, $datas) {
        $em = $this->getDoctrine()->getManager();
        if (isset($datas) && isset($datas['clientTels'])) {
            $clientTelsAdd = [];
            $clientTelsNew = $datas['clientTels'];
            $clientTelsActual = $client->getClientTels();
            if (count($clientTelsActual) == 0 && count($clientTelsNew) > 0) {
                for ($i = 1; $i <= count($clientTelsNew) ;$i++) {
                    $numTel = $clientTelsNew[$i]['numTel'];
                    $newClientTel = new ClientTel();
                    $newClientTel->setClient($client)->setNumTel($numTel)->setCommentaireTel($clientTelsNew[$i]['commentaireTel'])->setFr($clientTelsNew[$i]['fr']);
                    $em->persist($newClientTel);
                    $client->addClientTel($newClientTel);
                }
            } else {
                foreach ($clientTelsActual as $clientTel) {
                    $exist = false;
                    for ($i = 1; $i <= count($clientTelsNew) ;$i++) {
                        $numTel = $clientTelsNew[$i]['numTel'];
                        $commentaire = $clientTelsNew[$i]['commentaireTel'];
                        $fr = $clientTelsNew[$i]['fr'];
                        if (isset($clientTelsNew[$i]['id']) && !empty($clientTelsNew[$i]['id'])) {
                            if ($clientTelsNew[$i]['id'] == $clientTel->getId()) {
                                if (empty($numTel)) $exist = false;
                                else {
                                    $exist = true;
                                    $clientTel->setNumTel($numTel)->setCommentaireTel($commentaire)->setFr($fr);
                                    $em->persist($clientTel);
                                }
                            }
                        } else {
                            if (!in_array($numTel,$clientTelsAdd) && !empty($numTel)) {
                                $newClientTel = new ClientTel();
                                $newClientTel->setClient($client)->setNumTel($numTel)->setCommentaireTel($commentaire)->setFr($fr);
                                $em->persist($newClientTel);
                                $client->addClientTel($newClientTel);
                                $clientTelsAdd[] = $numTel;
                            }
                        }
                    }
                    if (!$exist) $client->removeClientTel($clientTel);
                }
            }
        }
        if (isset($datas) && isset($datas['clientEmails'])) {
            $clientEmailsAdd = [];
            $clientEmailsNew = $datas['clientEmails'];
            $clientEmailsActual = $client->getClientEmails();
            if (count($clientEmailsActual) == 0 && count($clientEmailsNew) > 0) {
                for ($i = 1; $i <= count($clientEmailsNew);$i++) {
                    $email = $clientEmailsNew[$i]['email'];
                    $newClientEmail = new ClientEmail();
                    $newClientEmail->setClient($client)->setEmail($email)->setCommentaireEmail($clientEmailsNew[$i]['commentaireEmail']);
                    $em->persist($newClientEmail);
                    $client->addClientEmail($newClientEmail);
                }
            } else {
                foreach ($clientEmailsActual as $clientEmail) {
                    $exist = false;
                    for ($i = 1; $i <= count($clientEmailsNew) ;$i++) {
                        $email = $clientEmailsNew[$i]['email'];
                        $commentaire = $clientEmailsNew[$i]['commentaireEmail'];
                        if (isset($clientEmailsNew[$i]['id']) && !empty($clientEmailsNew[$i]['id'])) {
                            if ($clientEmailsNew[$i]['id'] == $clientEmail->getId()) {
                                if (empty($email)) $exist = false;
                                else {
                                    $exist = true;
                                    $clientEmail->setEmail($email)->setCommentaireEmail($commentaire);
                                    $em->persist($clientEmail);
                                }
                            }
                        } else {
                            if (!in_array($email,$clientEmailsAdd) && !empty($email)) {
                                $newClientEmail = new ClientEmail();
                                $newClientEmail->setClient($client)->setEmail($email)->setCommentaireEmail($commentaire);
                                $em->persist($newClientEmail);
                                $client->addClientEmail($newClientEmail);
                                $clientEmailsAdd[] = $email;
                            }
                        }
                    }
                    if (!$exist) $client->removeClientEmail($clientEmail);
                }
            }
        }
        $em->persist($client);
    }

    private function handlePreferencesplanification($equipement, $datas, $em) {
        $preferencesPlanifications = $equipement->getEquipementPreferencesPlanification();
        if (!$preferencesPlanifications) {
            $preferencesPlanifications = new EquipementPreferencesPlanification();
            $preferencesPlanifications->setEquipement($equipement);
        }
        $apres_recurrente = (isset($datas['apres_recurrente']) && $datas['apres_recurrente'] == 'oui') ? true : false;
        $preferencesPlanifications->setApresRecurrente($apres_recurrente);

        $avant_recurrente = (isset($datas['avant_recurrente']) && $datas['avant_recurrente'] == 'oui') ? true : false;
        $preferencesPlanifications->setAvantRecurrente($avant_recurrente);

        $inclusion_recurrente = (isset($datas['inclusion_recurrente']) && $datas['inclusion_recurrente'] == 'oui') ? true : false;
        $preferencesPlanifications->setInclusionRecurrente($inclusion_recurrente);

        if (isset($datas['date_a_partir_du'])) {
            $format = $apres_recurrente ? 'd F' : 'd/m/Y';
            $date_a_partir_du =  (!empty($datas['date_a_partir_du']))? DateTime::createFromFormat($format, Functions::monthFrToEn($datas['date_a_partir_du'])) : null;
            $preferencesPlanifications->setDateAPartirDu($date_a_partir_du);
        }
        if (isset($datas['date_avant_le'])) {
            $format = $avant_recurrente ? 'd F' : 'd/m/Y';
            $date_avant_le =  (!empty($datas['date_avant_le']))? DateTime::createFromFormat($format, Functions::monthFrToEn($datas['date_avant_le'])) : null;
            $preferencesPlanifications->setDateAvantLe($date_avant_le);
        }
        if (isset($datas['date_entre_debut'])) {
            $format = $inclusion_recurrente ? 'd F' : 'd/m/Y';
            $date_entre_debut = (!empty($datas['date_entre_debut']))? DateTime::createFromFormat($format, Functions::monthFrToEn($datas['date_entre_debut'])) : null;
            $preferencesPlanifications->setDateEntreDebut($date_entre_debut);
        }
        if (isset($datas['date_entre_fin'])) {
            $format = $inclusion_recurrente ? 'd F' : 'd/m/Y';
            $date_entre_fin =  (!empty($datas['date_entre_fin']))? DateTime::createFromFormat($format, Functions::monthFrToEn($datas['date_entre_fin'])) : null;
            $preferencesPlanifications->setDateEntreFin($date_entre_fin);
        }
        if (isset($datas['planifier_preference']))
            $preferencesPlanifications->setPlanifierPreference($datas['planifier_preference']);

        $planifier_jour = (isset($datas['planifier_jour'])) ? implode(',',$datas['planifier_jour']) : '';
        $preferencesPlanifications->setPlanifierJour($planifier_jour);

        if (Functions::isSetAndNotEmpty($datas['planifier_partie_journee']))
            $preferencesPlanifications->setPlanifierPartieJournee($datas['planifier_partie_journee']);

        $uniquement_scolaire = (isset($datas['uniquement_scolaire']) && $datas['uniquement_scolaire'] == 'oui') ? true : false;
        $preferencesPlanifications->setUniquementScolaire($uniquement_scolaire);

        $premiere_visite = (isset($datas['premiere_visite']) && $datas['premiere_visite'] == 'oui') ? true : false;
        $preferencesPlanifications->setPremiereVisite($premiere_visite);

        $envoyer_rts = (isset($datas['envoyer_rts']) && $datas['envoyer_rts'] == 'oui') ? true : false;
        $preferencesPlanifications->setEnvoyerRts($envoyer_rts);

        $envoyer_agent = (isset($datas['envoyer_2_agents']) && $datas['envoyer_2_agents'] == 'oui') ? true : false;
        $preferencesPlanifications->setEnvoyer2Agents($envoyer_agent);

        if (isset($datas['planifier_plage_horaire'])) {
            $horairePassage = null;
            if (!empty($datas['planifier_plage_horaire'])) {
                $horairePassage = $em->getRepository(HorairePassage::class)->find((int)$datas['planifier_plage_horaire']);
            }
            $preferencesPlanifications->setHorairePassage($horairePassage);
        }

        if (isset($datas['planifier_agent']))
            $preferencesPlanifications->setPlanifierAgent($datas['planifier_agent']);
        if (isset($datas['preference_agent']) && !empty($datas['preference_agent'])) {
            $agent = $em->getRepository(Utilisateur::class)->find((int)$datas['preference_agent']);
            $preferencesPlanifications->setAgent($agent);
        }

        $em->persist($preferencesPlanifications);
    }

    /**
     * MAJ agent adresse
     * @Route("/search/{id}/secteur", methods="POST", name="search_equipement_secteur")
     */
    public function searchEquipementSecteur(Equipement $equipement, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();
        $response = [];

        if (isset($datas['coordinates'])){
            $secteurs = $em->getRepository(Secteur::class)->getSecteursFromCoordinates($datas['coordinates'][0],$datas['coordinates'][1]);
            foreach ($secteurs as $secteur) {
                if ($secteur->getSectorisationVersion()
                    && $secteur->getSectorisationVersion()->getEnProd() == true
                    && $equipement->getSecteur()
                    && $secteur->getSectorisationVersion()->getSite() != $equipement->getSecteur()->getSectorisationVersion()->getSite()) {
                    $site = $secteur->getSectorisationVersion()->getSite();
                    $agence = $site->getAgences()->first();
                    $response = ['error' => true, 'message' => 'Cette adresse fait partie d\'un secteur géré par le site de ' . $site->getNom() . ' ' . $agence->getNumTel()];
                }
            }
        }


        return new JsonResponse($response, Response::HTTP_OK);
    }

    /**
     * @Route("/create/equipement_famille/{id}", methods={"POST", "PATCH"}, name="create_maj_equipement_famille")
     */
    public function createMajEquipementFamille($id= null, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();
        foreach($datas as $key => $value) {
            $datas[$key] = Functions::clearData($value);
        }
        $message = 'Création';
        if ($datas['libelle'] != '') {
            //  error_log
            if ($id) {
                $equipementFamille = $em->getRepository(EquipementFamille::class)->find($id);
                $message = 'Modification';
            }  else   $equipementFamille = new EquipementFamille();
            if ($equipementFamille->getLibelle() != $datas['libelle']) {
                //on recherche si ce libelle n'existe pas déjà
                $equipementFamilleSame = $em->getRepository(EquipementFamille::class)->findOneBy(['libelle' => $datas['libelle']]);
                if ($equipementFamilleSame) {
                    return new JsonResponse(['messages' => ['error' => ["$message impossile, cette Famille existe déjà"]]], 200);
                }
            }
            $equipementFamille = $equipementFamille->setLibelle($datas['libelle']);
           //nouvel Equipement Famille on dot récup le dernier code
            if (!$id) {
               $maxId = $em->getRepository(EquipementFamille::class)->getMaxId();
               $equipementFamille->setCode($maxId +1);
           }

            $em->persist($equipementFamille);
            $em->flush();

        }

        return new JsonResponse(['messages' => ['success' => ["$message effectuée avec succès"]]], 200);
    }

    /**
     * @Route("/edit/{id}", methods={"GET"}, name="equipement_edit")
     */
    public function editEquipement(Equipement $equipement, LockManager $lockManager) {
        $checkLock = $lockManager->checkLock('Equipement', $equipement->getId(), $this->getUser());
        $type_affichage =  ($checkLock['return']) ? 'edit' : 'view';
        if ($type_affichage == 'view') {
            $this->addFlash('danger', 'Cet équipement est déjà en cours de modification par '. $checkLock['utilisateur']);
        }
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId().'&type_affichage='.$type_affichage);
    }

    /**
     * @Route("/cancel_edit/{id}", methods={"GET"}, name="equipement_cancel_edit")
     */
    public function cancelEditEquipement(Equipement $equipement, LockManager $lockManager) {
        $lockManager->deleteLock('Equipement', $equipement->getId(), $this->getUser());
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId().'&type_affichage=view');
    }
    /**
     * @Route("/gestion_pref_planification/{id}", methods={"POST"}, name="equipement_pref_planification")
     */
    public function gestionPreferencesPlanification(Equipement $equipement, LockManager $lockManager, Request $request) {
        $lockManager->checkLock('Equipement', $equipement->getId() , $this->getUser());

        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();
        foreach($datas as $key => $value) {
            $datas[$key] = (!is_array($value)) ? Functions::clearData($value) : $value;
        }
        if (Functions::isSetAndNotEmpty($datas['type_add'])) {
            if ($datas['type_add'] == 'recuperer') {
                if (Functions::isSetAndNotEmpty($datas['recup_equipement'])) {
                    $equipementRecup = $em->getRepository(Equipement::class)->find((int)$datas['recup_equipement']);
                    if ($equipement->getEquipementPreferencesPlanification()) $em->remove($equipement->getEquipementPreferencesPlanification());
                    $em->flush();
                    $em->refresh($equipement);
                    $prefRecup = clone $equipementRecup->getEquipementPreferencesPlanification();
                    $prefRecup->setEquipement($equipement);
                    $em->persist($prefRecup);
                }
            } else if ($datas['type_add'] == 'dupliquer') {
                if (Functions::isSetAndNotEmpty($datas['equipement_dupliquer'])) {
                    if (!is_array($datas['equipement_dupliquer'])) $datas['equipement_dupliquer'] = [$datas['equipement_dupliquer']];
                    $prefADupliquer = ($equipement->getEquipementPreferencesPlanification())
                        ? clone $equipement->getEquipementPreferencesPlanification()
                        : new EquipementPreferencesPlanification();
                    foreach ($datas['equipement_dupliquer'] as $equipementDupId) {
                        $equipementDup = $em->getRepository(Equipement::class)->find((int)$equipementDupId);
                        if ($equipementDup->getEquipementPreferencesPlanification()) $em->remove($equipementDup->getEquipementPreferencesPlanification());
                        $em->flush();
                        $em->refresh($equipementDup);
                        $prefADupliquerTmp = clone $prefADupliquer;
                        $prefADupliquerTmp->setEquipement($equipementDup);
                        $em->persist($prefADupliquerTmp);
                    }
                }
            }
            $em->flush();
        }
        $this->addFlash('success', "Mise à jour effectuée avec succès");
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId().'&type_affichage=view');
    }

    /**
     * @Route("/get_path_contrat_groupe/{id}", methods={"GET"}, name="equipement_get_path_contrat_groupe")
     */
    public function getPathContratGroupe(Equipement $equipement) {
        $paths = [];
        $contratsGroupe = $this->getDoctrine()->getManager()->getRepository(Contrat::class)->getContratsByGroupe($equipement->getLastContrat()->getGroupe());
        if ($contratsGroupe) {
            foreach ($contratsGroupe as $contratGroupe) {
                if ($contratGroupe->getEquipement() != $equipement) {
                    $paths[] = $this->generateUrl('show_client', ['id' => $contratGroupe->getClient()->getId()]).'?id_equipement='. $contratGroupe->getEquipement()->getId();
                }
            }
        }
        return new JsonResponse($paths, Response::HTTP_OK);
    }

    /**
     * @Route("/maj_preferences_planification/{id}", methods={"POST"}, name="equipement_maj_preferences_planification")
     */
    public function majPreferencesPlanification(Equipement $equipement, Request $request) {
        $em = $this->getDoctrine()->getManager();
        $datas = $request->request->all();

        $this->handlePreferencesplanification($equipement, $datas, $em);
        $em->flush();

        $this->addFlash('success', "Mise à jour effectuée avec succès");
        return $this->redirect($this->generateUrl('show_client', ['id' => $equipement->getClientSouscripteur()->getId()]).'?id_equipement='.$equipement->getId().'&type_affichage=view');
    }

    /**
     * @Route("/intervention/result/{id}", name="intervention_result")
     */
    public function interventionResult(Intervention $intervention)
    {
        return $this->render('clients/intervention/_intervention_result.html.twig', [
            'intervention' => $intervention
        ]);
    }

    /**
     * @Route("/intervention/facturation/{id}", name="intervention_facturation")
     */
    public function interventionFacturation(Intervention $intervention)
    {
        return $this->render('clients/intervention/_facturation.html.twig', [
            'intervention' => $intervention
        ]);
    }
}