<?php
namespace App\Controller;
use App\Entity\User;
use App\Entity\Contact;
use App\Form\ContactType;
use App\Repository\ContactRepository;
use App\Service\BrevoSmsService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;
class ContactController extends AbstractController
{
/**
* @Route("/contact", name="contact")
*/
public function contact(
Request $request,
MailerInterface $mailer,
EntityManagerInterface $entityManager,
ContactRepository $contactRepository,
BrevoSmsService $brevoSmsService
): Response {
$contact = new Contact();
$loggedInUser = $this->getUser();
if ($loggedInUser instanceof User) {
$contact->setUser($loggedInUser);
// Si les champs ne sont pas dans le form, ils doivent être remplis ici
// pour la vérification de doublon et pour la persistance.
if (method_exists($loggedInUser, 'getFirstname')) {
$contact->setFirstname($loggedInUser->getFirstname());
}
if (method_exists($loggedInUser, 'getLastname')) {
$contact->setLastname($loggedInUser->getLastname());
}
if (method_exists($loggedInUser, 'getEmail')) {
$contact->setEmail($loggedInUser->getEmail());
}
}
$form = $this->createForm(ContactType::class, $contact);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Le $contact est maintenant hydraté avec les données du formulaire (ou pré-rempli)
// Vérification du message dupliqué AVANT de persister
$userToCheck = $contact->getUser();
$emailToCheck = ($userToCheck === null) ? $contact->getEmail() : null; // Email seulement si invité
if ($contact->getMessage() === null || ($userToCheck === null && $emailToCheck === null)) {
// Cas où le message est vide ou informations d'identification manquantes (ne devrait pas arriver avec la validation)
$this->addFlash('error', 'Une erreur est survenue. Veuillez vérifier votre saisie.');
} elseif ($contactRepository->hasExistingIdenticalRequest($contact->getMessage(), $userToCheck, $emailToCheck)) {
$this->addFlash('warning', 'Un message identique a déjà été soumis. Si vous avez une nouvelle demande, veuillez modifier votre message.');
// Renvoyer le formulaire avec les données saisies et le message d'erreur
// Ne pas rediriger pour que l'utilisateur voie son message et l'avertissement.
return $this->render('contact/form.html.twig', [
'contactForm' => $form->createView(),
]);
} else {
// Pas de doublon, on continue
$entityManager->persist($contact);
$entityManager->flush();
$user = $contact->getUser();
if ($user instanceof User) {
$emailForStan = trim((string) ($user->getEmailPro() ?? '')) !== ''
? trim((string) $user->getEmailPro())
: (string) $contact->getEmail();
$phoneLine = trim((string) ($user->getPhone() ?? '')) !== ''
? trim((string) $user->getPhone())
: 'non renseigné';
} else {
$emailForStan = (string) $contact->getEmail();
$phoneLine = 'non renseigné';
}
$supportEmailTo = (string) $this->getParameter('support_email');
$emailContent = "Nouvelle demande de contact reçue :\n\n";
if ($user instanceof User) {
$emailContent .= "Utilisateur connecté: ID " . $user->getId() . "\n";
}
$emailContent .= "Prénom: " . $contact->getFirstname() . "\n";
$emailContent .= "Nom: " . $contact->getLastname() . "\n";
$emailContent .= "Email: " . $emailForStan . "\n";
$emailContent .= "Téléphone: " . $phoneLine . "\n";
$emailContent .= "Message:\n" . $contact->getMessage() . "\n\n";
$emailContent .= "Envoyé le: " . $contact->getCreatedAt()->format('d/m/Y H:i:s');
$mail = (new Email())
->from($this->getParameter('mailer_from'))
->to($supportEmailTo)
->replyTo($emailForStan)
->subject('Nouvelle demande de contact - ID: ' . $contact->getId())
->text($emailContent);
try {
$mailer->send($mail);
$supportSmsNumber = (string) $this->getParameter('support_sms_number');
if ($supportSmsNumber !== '') {
$smsContent = 'Bambboo Support: Nouvelle demande #' . $contact->getId();
$extrait = mb_substr($contact->getMessage(), 0, 60);
if (mb_strlen($contact->getMessage()) > 60) {
$extrait .= '…';
}
$smsContent .= ' - ' . $extrait;
$brevoSmsService->send($supportSmsNumber, $smsContent, 'TICKET-BAM');
}
$this->addFlash('success', 'Votre message a bien été envoyé et enregistré. Nous vous répondrons bientôt !');
} catch (\Symfony\Component\Mailer\Exception\TransportExceptionInterface $e) {
$this->addFlash('warning', 'Votre message a été enregistré, mais une erreur est survenue lors de l\'envoi de l\'email de notification. Erreur: ' . $e->getMessage());
}
return $this->redirectToRoute('contact'); // Redirection après succès
}
}
return $this->render('contact/form.html.twig', [
'contactForm' => $form->createView(),
]);
}
}