<?php
namespace App\Controller;
use App\Entity\Document;
use Location\Coordinate;
use App\Entity\DeliveryMan;
use App\Form\DeliveryManType;
use App\Service\FileUploader;
use App\Enum\TypeDocumentEnum;
use Location\Distance\Vincenty;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\Variables\UserTypeRepository;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class DeliveryManRegistrationController extends AbstractController
{
#[Route('/register/man', name: 'delivery_man_register')]
public function register(Request $request): Response
{
$deliveryMan = new DeliveryMan();
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
$session = $request->getSession();
$session->set('deliveryMan', $deliveryMan);
return $this->redirectToRoute('delivery_man_civility');
}
return $this->render('delivery_man_registration/register.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/register/man/civility', name: 'delivery_man_civility')]
public function civility(Request $request): Response
{
$session = $request->getSession();
$deliveryMan = $session->get('deliveryMan', 0);
if (!$deliveryMan) {
return $this->redirectToRoute('delivery_man_register', []);
}
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
$session->set('deliveryMan', $deliveryMan);
return $this->redirectToRoute('delivery_man_address', []);
}
return $this->render('delivery_man_registration/civility.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/register/man/address', name: 'delivery_man_address')]
public function address(Request $request, UserTypeRepository $userTypeRepository, ManagerRegistry $doctrine, UserPasswordHasherInterface $passwordHasher): Response
{
$session = $request->getSession();
$entityManager = $doctrine->getManager();
/** @var ?DeliveryMan $deliveryMan */
$deliveryMan = $session->get('deliveryMan', null);
if (!$deliveryMan) {
return $this->redirectToRoute('delivery_man_register', []);
}
$deliveryMan->removeAllAddress();
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
$userType = $userTypeRepository->findOneByName("Livreur auto-entrepreneur");
$deliveryMan->setUserType($userType);
if (!$deliveryMan->getId() && $deliveryMan->getPlainPassword()) {
$hashedPassword = $passwordHasher->hashPassword($deliveryMan, $deliveryMan->getPlainPassword());
$deliveryMan->setPassword($hashedPassword);
$entityManager->persist($deliveryMan);
}
$entityManager->flush();
$session->set('deliveryMan', $deliveryMan);
return $this->redirectToRoute('delivery_man_vehicle', ['id' => $deliveryMan->getId()]);
}
return $this->render('delivery_man_registration/address.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/register/man/vehicle/{id}', name: 'delivery_man_vehicle')]
public function vehicle(ManagerRegistry $doctrine, Request $request, DeliveryMan $deliveryMan): Response
{
$entityManager = $doctrine->getManager();
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
$entityManager->flush();
return $this->redirectToRoute('delivery_man_documents', ['id' => $deliveryMan->getId()]);
}
return $this->render('delivery_man_registration/vehicle.html.twig', [
'form' => $form->createView(),
'id' => $deliveryMan->getId()
]);
}
#[Route('/register/man/documents/{id}', name: 'delivery_man_documents')]
public function documents(Request $request, ManagerRegistry $doctrine, FileUploader $uploader, DeliveryMan $deliveryMan): Response
{
$entityManager = $doctrine->getManager();
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$documentsForm = $form->get('documents');
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
$directory = sprintf("%s/%d",$this->getParameter('confidential_document_directory'), $deliveryMan->getId());
foreach ($documentsForm as $key => $documentForm) {
/** @var ?UploadedFile $documentFile */
$documentFile = $documentForm->get('realName')->getData();
/** @var Document $document */
$document = $documentForm->getData();
if ($documentFile) {
$documentType = TypeDocumentEnum::fromName($key);
//TODO: uploadFile should maybe use File instead of Form.
$uploader->uploadFile($documentType, $documentsForm, $deliveryMan, $directory);
$document->setDisplayName($key);
} else {
$deliveryMan->removeDocument($document);
}
}
$entityManager->flush();
return $this->redirectToRoute('delivery_man_sectors', ['id' => $deliveryMan->getId()]);
}
return $this->render('delivery_man_registration/documents.html.twig', [
'form' => $form->createView(),
'id' => $deliveryMan->getId()
]);
}
#[Route('/register/man/sectors/{id}', name: 'delivery_man_sectors')]
public function sectors(Request $request, ManagerRegistry $doctrine, DeliveryMan $deliveryMan): Response
{
$entityManager = $doctrine->getManager();
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->remove('documents')->remove('addresses');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$error = false;
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
$sectorsIterator = $deliveryMan->getSectors()->getIterator();
$sectorsIterator->rewind();
$sector1Coordinate = null;
while ($sectorsIterator->valid()) {
$sector = $sectorsIterator->current();
$geolocation = explode(",", $sector->getGeolocation());
$sectorCoordinate = new Coordinate($geolocation[0], $geolocation[1]);
if ($sector1Coordinate === null) {
$sector1Coordinate = $sectorCoordinate;
} else {
// Calculer la distance par rapport au premier secteur
$vincenty = new Vincenty();
$distance = $vincenty->getDistance($sector1Coordinate, $sectorCoordinate);
// Vérifier si la distance dépasse 30 km
if ($distance / 1000 > 30) {
$error = true;
break;
}
}
$sectorsIterator->next();
}
if (!$error) {
$entityManager->flush();
return $this->redirectToRoute('delivery_man_know', ['id' => $deliveryMan->getId()]);
} else {
$this->addFlash('error', 'Un ou plusieurs secteurs ajoutés est trop loin de votre premier secteur (>30km)');
}
}
return $this->render('delivery_man_registration/sectors.html.twig', [
'form' => $form->createView(),
'id' => $deliveryMan->getId()
]);
}
#[Route('/register/man/know/{id}', name: 'delivery_man_know')]
public function know(Request $request, ManagerRegistry $doctrine, DeliveryMan $deliveryMan): Response
{
$entityManager = $doctrine->getManager();
$form = $this->createForm(DeliveryManType::class, $deliveryMan);
$form->remove('documents')->remove('sectors')->remove('addresses');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var DeliveryMan $deliveryMan */
$deliveryMan = $form->getData();
/** @var string $know */
$know = $form->get('know')->getData();
if ($know == 'Autre') {
/** @var string $other */
$other = $form->get('other')->getData();
$know = $other != '' ? $other : $know;
$deliveryMan->setKnow($know);
}
$entityManager->flush();
return $this->redirectToRoute('app_confirmation', ['id' => $deliveryMan->getId()]);
}
return $this->render('delivery_man_registration/know.html.twig', [
'form' => $form->createView(),
'id' => $deliveryMan->getId()
]);
}
}