<?php
/**
* Created by PhpStorm.
* User: michael
* Date: 19/06/2019
* Time: 14:59
*/
namespace App\Controller\Front;
use App\Controller\Front\LandingPage\AbstractProspectCreationController;
use App\Entity\CityPost;
use App\Entity\Prospect;
use App\Entity\Store;
use App\Form\FilterCityType;
use App\Form\Model\FilterCityModel;
use App\Form\ProspectType;
use App\Repository\CityPostRepository;
use App\Repository\ProspectOnStoreRepository;
use App\Repository\StoreRepository;
use App\Service\GmapsService;
use App\Service\RefereeService;
use App\Service\StoreService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Geocoder\Exception\Exception;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CityController extends AbstractProspectCreationController
{
/**
* @Route("/villes", name="city_post_list")
* @param CityPostRepository $cityPostRepository
* @param PaginatorInterface $paginator
* @param Request $request
* @return Response
*/
public function listCityAction(CityPostRepository $cityPostRepository, PaginatorInterface $paginator, Request $request): Response
{
$search = new FilterCityModel();
$form = $this->createForm(FilterCityType::class, $search);
$form->handleRequest($request);
$pagination = $paginator->paginate(
$cityPostRepository->getFilteredCity($search),
$request->query->getInt('page', 1)
);
return $this->render('front_v4/mca/city/list.html.twig', [
'pagination' => $pagination,
'form' => $form->createView()
]);
}
/**
* @Route("/ville/{slug}", name="city_post_show", methods={"GET", "POST"})
* @param Request $request
* @param CityPost $cityPost
* @param RefereeService $refereeService
* @param StoreService $storeService
* @param GmapsService $gmapsService
* @param StoreRepository $storeRepository
* @param PaginatorInterface $paginator
* @param ProspectOnStoreRepository $prospectOnStoreRepository
* @param EntityManagerInterface $em
* @return Response
* @throws Exception
* @throws NonUniqueResultException
*/
public function showCity(
Request $request,
CityPost $cityPost,
RefereeService $refereeService,
StoreService $storeService,
GmapsService $gmapsService,
StoreRepository $storeRepository,
PaginatorInterface $paginator,
ProspectOnStoreRepository $prospectOnStoreRepository,
EntityManagerInterface $em
): Response
{
/* @var Prospect $propect */
$prospect = new Prospect();
$prospectForm = $this->createForm(ProspectType::class, $prospect);
// Initializations
$scrollToLeadForm = false; // autoscroll to lead_form
$numberStoresPerPage = 3;
$stores = null;
$arrayPresentableStore = [];
$arraySelectionStore = [];
$arraySelectionSerialize = [];
// geocoding and find store around city
$geocodeAddress = $gmapsService->getLatitudeLongitudeFromAddress(
$cityPost->getName(),
['components' => 'zipcode:' . $cityPost->getZipcode()]
);
if ($geocodeAddress !== null) {
$storeAndDistance = $storeRepository->findActiveStoresAroundLocation(
$geocodeAddress[0],
$geocodeAddress[1],
$request->query->get('area_search', Store::AREA_SEARCH)
);
if (!empty($storeAndDistance)) {
foreach ($storeAndDistance as $storeWithDistance) {
// store handling
$store = $storeWithDistance[0];
$distance = $storeWithDistance['distance'];
$arrayPresentableStore[$store->getId()] = $storeService->serializeStoreForView($store, $distance);
}
// page handling
// display preferredStores only on the first page
if ($request->query->getInt('page', 1) == 1) {
$arraySelectionStore = $refereeService->getHightligthStore($geocodeAddress[0], $geocodeAddress[1]);
}
foreach ($arraySelectionStore as $selectedStoreWithDistance) {
$selectedStoreId = $selectedStoreWithDistance['store']->getId();
// withdraw preferredStore of listing store
unset($arrayPresentableStore[$selectedStoreId]);
// array of selected store with serialization
$arraySelectionSerialize[$selectedStoreId] = $storeService->serializeStoreForView(
$selectedStoreWithDistance['store'],
$selectedStoreWithDistance['distance_reel']
);
}
$paginatorOnStore = $paginator->paginate(
$arrayPresentableStore,
$request->query->getInt('page', 1),
$numberStoresPerPage,
array('wrap-queries' => true)
);
$stores = $paginatorOnStore->getItems();
}
// send form modal
$prospectForm->handleRequest($request);
if ($prospectForm->isSubmitted()) {
$scrollToLeadForm = true;
}
if ($prospectForm->isSubmitted() && $prospectForm->isValid()) {
$prospect = $prospectForm->getData();
$prospect->setRequest('checkup');
// create a prospect or redirect to a specific page if duplicate has been found
$redirection = $this->createProspectOrRedirect($prospect);
// apply redirection if one is returned
if (!is_null($redirection)) {
return $redirection;
}
$em->flush();
unset($prospectForm);
$pos = $prospectOnStoreRepository->findLastedProspectOnStore($prospect);
// redirect to success page
return $this->render('front_v4/mca/city/single.html.twig', [
'preferred_stores' => $arraySelectionSerialize,
'stores' => empty($paginatorOnStore) ? null : $paginatorOnStore->getItems(),
'city_post' => $cityPost,
'scroll_to_lead_form' => $scrollToLeadForm,
'status' => 'send_success',
'lead_number' => md5($prospect->getEmail()),
'pos_id' => empty($pos) ? null : $pos->getId(),
]);
}
}
return $this->render('front_v4/mca/city/single.html.twig', [
'preferred_stores' => $arraySelectionSerialize,
'stores' => $stores,
'city_post' => $cityPost,
'prospectForm' => $prospectForm->createView(),
'scroll_to_lead_form' => $scrollToLeadForm,
]);
}
}