<?php
namespace App\MDS\ApiBundle\Controller;
use App\Entity\MobileAppUsers;
use App\Entity\AppMobileGuest; // Entidad del invitado al evento
use App\Entity\MobileAppEvent;
use App\MDS\ApiBundle\Auth;
use App\Service\MobileAppUsersService;
use App\Service\EmailService; // Tu servicio de emails
use Doctrine\ORM\EntityManagerInterface;
use FOS\RestBundle\Controller\AbstractFOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
final class ApiMobileAppUserController extends AbstractFOSRestController
{
private $logger;
private $mobileAppUsersService;
private $normalizer;
private $em;
private $emailService;
public function __construct(
LoggerInterface $logger,
MobileAppUsersService $mobileAppUsersService,
NormalizerInterface $normalizer,
EntityManagerInterface $em,
EmailService $emailService
) {
$this->logger = $logger;
$this->mobileAppUsersService = $mobileAppUsersService;
$this->normalizer = $normalizer;
$this->em = $em;
$this->emailService = $emailService;
}
/**
* @Rest\Post("/api/mobileappuser/register")
*/
public function registerMobileAppUserAction(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
$eid = $data['eid'] ?? 23;
$status = $data['status'] ?? 'registered';
$email = str_replace(" ", "", $data['email']);
$event = $this->em->getRepository(MobileAppEvent::class)->find($eid);
// 1. Buscar o Crear Invitado
$guest = $this->em->getRepository(AppMobileGuest::class)->findOneBy(['eid' => $eid, 'email' => $email]);
if (!$guest) {
$guest = new AppMobileGuest();
$guest->setEid($eid);
$guest->setEmail($email);
$guest->setToken(md5($email . time()));
}
$guest->setFirstName($data['firstName']);
$guest->setLastName($data['lastName']);
$guest->setPrefix($data['middleName'] ?? null);
if ($status === 'declined') {
$guest->setRegistrationStatus('Declined');
$guest->setObservations("USER DECLINED. Reason: " . ($data['reason'] ?? 'None'));
$subject = "Attendance Update | " . $event->getName();
$body = "Dear " . $data['firstName'] . ",<br><br>"
. "We’re sorry to hear that you won’t be able to join us at our " . $event->getName() . ". "
. "This email confirms that you’ve declined the invitation.<br><br>"
. "If you’d like to share any feedback or have any questions, please feel free to reach out to your local Xiaomi contact.<br><br>"
. "Best regards,<br>"
. "Xiaomi Team";
} else {
$guest->setRegistrationStatus('Pending');
$guest->setCountry($data['country'] ?? null);
$guest->setTelephone($data['telephone'] ?? null);
$guest->setDni($data['dni'] ?? null);
if (!empty($data['birthDate'])) $guest->setBirthDate(new \DateTime($data['birthDate']));
if (!empty($data['expireDate'])) $guest->setExpireDate(new \DateTime($data['expireDate']));
// --- NUEVA LÓGICA DE MAPEO DE CAMPOS ---
// 1. Guardar el tipo de documento en ParticipantType
$guest->setParticipantType($data['docType'] ?? null);
// 2. Guardar alergias en Allergens
$guest->setAllergens($data['allergens'] ?? null);
// 3. Guardar las observaciones (remarks) en Observations
$guest->setObservations($data['observations'] ?? null);
$subject = "Confirmation of attendance | " . $event->getName();
$body = $event->getMailContent();
}
$this->em->persist($guest);
$this->em->flush();
// 2. Enviar Email (Mismo formato Xiaomi)
$emailData = [
'urlhost' => 'https://mantevents-mcp.develup.solutions/',
'body' => $body,
'image' => $event->getImage(),
'logo' => $event->getLogo(),
'event' => $eid,
'description' => $event->getDescription(),
'title' => $event->getName(),
'urlappandroid' => '',
'urlappios' => ''
];
$this->emailService->sendEmail([
'from' => ["events@develup.solutions" => $event->getName()],
'to' => [$email],
'subject' => $subject,
'template' => 'external/email/email-register.html.twig',
'context' => ['data' => $emailData, 'status' => $status]
]);
return new JsonResponse(['success' => true]);
}
private function _generateToken(MobileAppUsers $mobileAppUser)
{
return Auth::signIn([
'uid' => $mobileAppUser->getId(),
'username' => $mobileAppUser->getUsername(),
'pass' => $mobileAppUser->getPass(),
]);
}
}