<?php
declare(strict_types=1);
namespace App\Controller\Website\API;
use App\Controller\Website\CruiseListSearchFormConfiguration;
use App\Helper\Partner\PartnerHelper;
use Croisiland\CommonBundle\Entity\Cruise\Cruise;
use Croisiland\CommonBundle\Form\CruiseSearchFullFormType;
use Croisiland\CommonBundle\Model\CruiseSearchModel;
use Croisiland\CommonBundle\Serializer\CruiseSearchModelSerializer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManagerInterface;
// À adapter selon ton bundle
use Twig\Environment;
#[Route('/api/cruise', name: 'api_cruise_')]
class CruiseApiController extends AbstractController
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly CruiseSearchModelSerializer $cruiseSearchModelSerializer,
private readonly PartnerHelper $partnerHelper,
private readonly Environment $twig
)
{
}
/**
* Récupère une cruiseCard pour une croisière donnée (via AJAX).
* Le type de carte est passé en paramètre (ex: mini, full, summary) pour être concatené avec '_snippets/components/cards/%s.html.twig'
*/
#[Route('/card/{type}/{id}', name: 'get_cruise_card', methods: ['GET'], requirements: ['id' => '\d+', 'type' => '[a-zA-Z0-9_]+'])]
public function getCruiseCard(Request $request, string $type, int $id): JsonResponse
{
// 1. Récupérer la croisière depuis la base de données
// TODO
// Récuperée les filtres a mettre pour le retourner que les cruise compatibles:
// cruise futur, cruise actives, cruise, compatible partenaire, etc...
$cruise = $this->entityManager->getRepository(Cruise::class)->find($id);
if (!$cruise) {
return new JsonResponse(
['error' => 'Cruise not found'],
Response::HTTP_NOT_FOUND
);
}
// 2. Déterminer le template Twig en fonction du type
$templatePath = sprintf('_snippets/components/cards/%s.html.twig', $type);
// 3. Vérifier si le template existe
if (!$this->twig->getLoader()->exists($templatePath)) {
return new JsonResponse(
['error' => sprintf('Template for card type "%s" not found.', $type)],
Response::HTTP_BAD_REQUEST
);
}
// 4. Rendre le template Twig pour la cruiseCard
$cruiseCardHtml = $this->twig->render($templatePath, [
'cruise' => $cruise,
]);
// 5. Retourner la réponse en JSON avec le HTML
return new JsonResponse([
'success' => true,
'cruiseCard' => $cruiseCardHtml,
]);
}
/**
* Récupère les options dynamiques pour les champs du formulaire de recherche de croisières. incluant les parametres d'URL
*/
#[Route('/cruise-search-form-dynamic-options', name: 'get_cruise_serach_dynamic_options', methods: ['GET'])]
public function getDynamicOptions(Request $request): Response
{
$partner = $this->partnerHelper->getCurrentPartner();
$cruiseSearch = $this->cruiseSearchModelSerializer->fromRequest($request);
$cruiseSearch->setPartner($partner);
$form = $this->createForm(CruiseSearchFullFormType::class, $cruiseSearch, [
'visible_fields' => CruiseListSearchFormConfiguration::visibleFields(),
]);
$form->handleRequest($request);
return $this->render('@CroisilandCommon/updated_form_fields.html.twig', [
'form' => $form->createView(),
]);
}
}