<?php
namespace App\Controller;
use App\Form\ContactType;
use App\Manager\ContactManager;
use App\Service\Internal\ContactService;
use App\Service\Internal\HomePageService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Contracts\Translation\TranslatorInterface;
class ContactController extends AbstractController
{
public function getContact(
Request $request,
ContactManager $contactManager,
ContactService $contactService,
HomePageService $homePageService,
TranslatorInterface $translator
) {
$subject = $request->query->get('type', false);
$categories = $contactManager->buildCategories(strtoupper($subject));
$formSubject = $contactManager->getFormSubject($subject);
$parameters = $homePageService->getRenderParameters();
$parameters['subject'] = (null !== $formSubject) ? $subject : false;
$formSubject = (null !== $formSubject) ? $formSubject : ContactManager::FORM_DEFAULT_SUBJECT;
$parameters['formTemplate'] = 'form_' . $formSubject;
$parameters['postResponse'] = false;
$parameters['nbAttachments'] = ContactManager::NB_ATTACHMENTS;
$parameters['rgpd_link'] = $this->getParameter('global.rgpd_link');
$message = '';
$journey = $request->query->get('journey');
if (!empty($journey)) {
$message = $contactManager->buildMessageForJourney($journey);
}
$schedule = $request->query->get('schedule');
if (!empty($schedule)) {
$message = $contactManager->buildMessageForSchedule($schedule);
}
$form = $this->createForm(
ContactType::class,
[],
[
'categories' => $categories,
'message' => $message,
'subject' => $formSubject,
'manager' => $contactManager,
'translator' => $translator
]
);
if ($request->getMethod() == 'POST') {
$form->handleRequest($request);
$flashbag = $request->getSession()->getFlashBag();
$captchaResponse = $request->request->get('g-recaptcha-response');
if (empty($captchaResponse)) {
$parameters['form'] = $form->createView();
$flashbag->add('error', $translator->trans('captcha.label'));
return $this->render('pages/sim/contact.html.twig', $parameters);
}
$isValidCaptcha = $contactService->postCaptchaToGoogle($captchaResponse);
if (!$isValidCaptcha) {
$parameters['form'] = $form->createView();
$flashbag->add('error', $translator->trans('captcha.error'));
return $this->render('pages/sim/contact.html.twig', $parameters);
}
if ($form->isSubmitted() && !$form->isValid()) {
$parameters['form'] = $form->createView();
$flashbag->add('error', $translator->trans('contact.invalid_fields'));
return $this->render('pages/sim/contact.html.twig', $parameters);
}
$contact = $form->getData();
if ($formSubject == ContactManager::FORM_ZOU_SUBJECT) {
for ($i = 0; $i < ContactManager::NB_ATTACHMENTS; $i++) {
$filename = "optionalFile_" . $i;
if (isset($_FILES['contact_form']['error'][$filename]) && $_FILES['contact_form']['error'][$filename] == 0) {
$contact['files'][] = $this->getUploadedFile($filename);
}
}
} elseif (isset($_FILES['contact_form']['error']["optionalFile"]) && $_FILES['contact_form']['error']["optionalFile"] == 0) {
$contact['file'] = $this->getUploadedFile();
}
$contact = $contactManager->normalizeContactData($subject, $contact);
$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$postResponse = $contactService->postContact($serializer->serialize($contact, 'json'));
if ($postResponse === true) {
$flashbag->add('success', $translator->trans('contact.post_success'));
} else {
$flashbag->add('error', $translator->trans('contact.post_error'));
}
$parameters['postResponse'] = $postResponse;
}
$parameters['form'] = $form->createView();
return $this->render('pages/sim/contact.html.twig', $parameters);
}
private function getUploadedFile(string $filename = 'optionalFile'): array
{
$name = '';
$content = '';
if (isset($_FILES['contact_form']["name"][$filename])) {
$name = $_FILES['contact_form']["name"][$filename];
}
if (isset($_FILES['contact_form']["tmp_name"][$filename])) {
$content = base64_encode(file_get_contents($_FILES['contact_form']["tmp_name"][$filename]));
}
return ['name' => $name, 'content' => $content];
}
public function getDirectionsAndStoppoints(?string $lineId, ContactManager $contactManager): JsonResponse
{
$directionsWithStoppoints = $contactManager->buildDirectionAndStoppoints($lineId);
return new JsonResponse($directionsWithStoppoints);
}
}