<?php
namespace App\Controller\Front;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Search;
use App\Entity\Estate;
use App\Entity\Agent;
use App\Entity\TutorielCategory;
use App\Entity\Tutoriel;
use App\Entity\Progiciel;
use App\Entity\SousType;
use App\Filter\EstateFilterType;
use App\Manager\SearchManager;
use App\Form\UserFormType;
use App\Entity\User;
use App\Service\SoftDeleteFilter;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class AccountController extends AbstractController
{
private $searchManager;
private $softDeleteFilter;
public function __construct(searchManager $searchManager, SoftDeleteFilter $softDeleteFilter)
{
$this->searchManager = $searchManager;
$this->softDeleteFilter = $softDeleteFilter;
}
/**
* @Route("/mon_compte", name="mon_compte")
*/
public function index(): Response
{
$datas = ['current_page' => 'mon_compte'];
return $this->render('front/account/index.html.twig', $datas );
}
/**
* @Route("/espace_conseiller_v1", name="espace_conseiller_v1")
*/
public function espaceConseillerV1(): Response
{
$datas = ['current_page' => 'espace_conseiller_v1'];
if($this->isGranted('ROLE_CONSEILLER')){
$user = $this->getUser();
$agent = $this->getDoctrine()->getRepository(Agent::class)->findOneByEmail($user->getEmail());
if(!is_null($agent)){
$my_estates = $this->getDoctrine()->getRepository(Estate::class)->findAllByAgent($agent->getId());
$datas['my_estates'] = $my_estates;
$datas['encoded_my_estates'] = ['estates' => Estate::encode($my_estates)];
$datas['with_map'] = true;
}
// // $ffprobe = FFMpeg\FFProbe::create();
// // foreach($tutoriels as $video){
// // $duration = $ffprobe->format( $full_video_path )->get('duration');
// // }
// $tutoriels_by_categories = $this->getDoctrine()->getRepository(Tutoriel::class)->findAllByCategories();
// $datas['tutoriels_by_categories'] = $tutoriels_by_categories;
$datas['tutoriel_categories'] = $this->getDoctrine()->getRepository(TutorielCategory::class)->findAll();
$datas['tutoriels'] = $this->getDoctrine()->getRepository(Tutoriel::class)->findAll();
dump($datas['tutoriels']);
$progiciels = $this->getDoctrine()->getRepository(Progiciel::class)->findAll();
$datas['progiciels'] = $progiciels;
}
return $this->render('front/account/espace_conseiller_v1.html.twig', $datas );
}
/**
* @Route("/espace_conseiller", name="espace_conseiller")
*/
public function espaceConseiller(): Response
{
$datas = ['current_page' => 'espace_conseiller'];
if($this->isGranted('ROLE_CONSEILLER')){
$user = $this->getUser();
$agent = $this->getDoctrine()->getRepository(Agent::class)->findOneByEmail($user->getEmail());
if(!is_null($agent)){
$my_estates = $this->getDoctrine()->getRepository(Estate::class)->findAllByAgent($agent->getId());
$datas['my_estates'] = $my_estates;
$datas['encoded_my_estates'] = ['estates' => Estate::encode($my_estates)];
$datas['with_map'] = true;
}
$progiciels = $this->getDoctrine()->getRepository(Progiciel::class)->findAll();
$datas['progiciels'] = $progiciels;
}
return $this->render('front/account/espace_conseiller.html.twig', $datas );
}
/**
* include userForm
*/
public function userForm(): Response
{
$user = $this->getUser();
$form = $this->createForm(UserFormType::class, $user);
return $this->render('front/account/_user_form.html.twig', ['form' => $form->createView()]);
}
/**
* @Route("/mon_compte/save_user", name="save_user")
*/
public function saveUser(Request $request, UserPasswordEncoderInterface $userPasswordEncoderInterface): Response
{
$user = $this->getUser();
$form = $this->createForm(UserFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$plainPassword = $form->get('plainPassword')->getData();
$msg = 'Votre compte a été modifié';
if(!is_null($plainPassword)){
// encode the plain password
$user->setPassword(
$userPasswordEncoderInterface->encodePassword(
$user,
$plainPassword
)
);
$msg .= ', et le mot de passe aussi';
}
$em = $this->getDoctrine()->getManager();
$em->flush();
$output = [
'success' => true,
'msg' => $msg .'.',
'profile' => $user->getProfile(),
'form' => $this->renderView('front/account/_user_form.html.twig', ['form' => $form->createView()]),
];
}
else{
$output = [
'error' => true,
'form' => $this->renderView('front/account/_user_form.html.twig', ['form' => $form->createView()]),
];
}
return $this->json($output );
}
/**
* @Route("/mon_compte/delete_user", name="delete_user")
*/
public function deleteUSer(Request $request): Response
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$this->softDeleteFilter->removeSoftDeleteFilter($em);
$em->remove($user);
$em->flush();
$this->softDeleteFilter->undoRemoveSoftDeleteFilter($em);
//Déconnection ...
$session = $this->get('session');
$session = new Session();
$session->invalidate();
$output = [
'msg' => "Votre compte a été supprimé, vous allez être redirigé vers la page d'accueil",
'success' => true,
];
return $this->json($output );
}
/**
* @Route("/mon_compte/save_search", name="save_search")
*/
public function saveSearch(Request $request): Response
{
if ( $request->isXmlHttpRequest() ) {
$user = $this->getUser();
$page = $request->request->get('page');
$name = $request->request->get('name');
$alert = $request->request->get('alert');
$datas = $request->request->get('datas');
$savedSearchExist = $this->searchManager->savedSearchExist($datas, $user);
if($savedSearchExist){
$output = ["warning" => true, "msg" => sprintf('Une Recherche similaire "%s" existe déjà dans vos sauvegardes', $savedSearchExist)];
}
else{
$result = $this->searchManager->saveWithName($request, $datas, $page, $user, $name, $alert);
if($result){
$output = ["success" => true, "msg" =>'Recherche sauvegardée'];
}
else{
$output = ["warning" => true, "msg" => sprintf('la recherche est vide')];
}
}
return $this->json($output);
}
else{
throw new AccessDeniedHttpException("L'action demandée est impossible");
}
}
/**
* @Route("/mon_compte/manage_search", name="manage_search")
*/
public function manageSearch(Request $request): Response
{
if ( $request->isXmlHttpRequest() ) {
$em = $this->getDoctrine()->getManager();
$search = $this->getDoctrine()->getRepository(Search::class)->find($request->request->get('id'));
$action = $request->request->get('action');
if($action == 'edit'){
$search->setName($request->request->get('name'));
$msg = 'Recherche sauvegardée';
}
if($action == 'alert'){
$search->setAlert($request->request->get('alert'));
$msg = 'Alerte modifiée';
}
elseif($action == 'delete'){
$em->remove($search);
$msg = 'Recherche supprimée';
}
$em->flush();
$output = ["success" => true, "msg" => $msg];
return $this->json($output);
}
else{
throw new AccessDeniedHttpException("L'action demandée est impossible");
}
}
public function userNav(): Response
{
return $this->render('front/account/_user_nav.html.twig', [
// 'username' => !is_null($this->getUser()) ? $this->getUser()->getEmail() : null
// 'user' => $this->getUser()
]);
}
/**
* include profil
*/
public function getProfile(): Response
{
return $this->render('front/account/_profile.html.twig', [
'user' => $this->getUser()
]);
}
/**
* include searches
*/
public function getSearches(): Response
{
$searches = $this->getDoctrine()->getRepository(Search::class)->findAllSavedByUser($this->getUser()->getId());
// A bouger dans le manager dans le construct de la class Search
foreach ($searches as $search){
$familly_type = $search->getPage();
$sous_types = $this->getDoctrine()->getRepository(SousType::class)->getChoices();
$filter = $this->get('form.factory')->create(EstateFilterType::class, null, ['familly_type' => $familly_type, 'sous_types' => $sous_types]);
$filter->submit($search->getDatas());
$count = $this->getDoctrine()->getRepository(Estate::class)->countAllWithAgent($filter);
$search->setNbResult($count);
}
return $this->render('front/account/_searches.html.twig', [
'searches' => $searches
]);
}
/**
* include favorites
*/
public function getFavorites(): Response
{
$user_favorites = $this->getDoctrine()->getRepository(Estate::class)->findAllSavedByUser($this->getUser()->getId());
return $this->render('front/account/_favorites.html.twig', [
'user_favorites' => $user_favorites,
'encoded_estates' => ['estates' => Estate::encode($user_favorites)],
]);
}
/**
* @Route("/mon_compte/toggle_favorite/{refannonce}", name="toggle_favorite")
*/
public function ToggleFavorite(Estate $estate, Request $request): Response
{
$user = $this->getUser();
$has_favorite = $user->hasFavorite($estate);
if($has_favorite){
$user->removeFavorite($estate);
$msg = "Le bien ".$estate->getRefannonce()." a été supprimé de vos favoris";
}
else{
$user->addFavorite($estate);
$msg = "Le bien ".$estate->getRefannonce()." a été ajouté à vos favoris";
}
;
$em = $this->getDoctrine()->getManager();
$em->flush();
$user_favorites = $em->getRepository(Estate::class)->favoriteIds($user->getId());
$request->getSession()->set('user_favorites', $user_favorites);
$output = [
'has_favorite' => !$has_favorite,
'user_favorites' => $user_favorites,
'msg' => $msg
];
die(json_encode($output));
return $this->json($output); //provoque une erreur que je ne comprends pass
}
}