<?php
declare(strict_types=1);
namespace Croisiland\CommonBundle\Twig;
use Crea\MediaBundle\Entity\MediaTagOwnerInterface;
use Croisiland\CommonBundle\Constants\Cruise\CruiseConstants;
use Croisiland\CommonBundle\Entity\Cabin\CabinCategory;
use Croisiland\CommonBundle\Entity\Company\Atmosphere;
use Croisiland\CommonBundle\Entity\Cruise\Cruise;
use Croisiland\CommonBundle\Entity\Cruise\CruiseInterface;
use Croisiland\CommonBundle\Entity\Itinerary\ItineraryActivity;
use Croisiland\CommonBundle\Entity\Itinerary\ItineraryPartInterface;
use Croisiland\CommonBundle\Entity\Itinerary\ItinerarySegment;
use Croisiland\CommonBundle\Entity\Offer\Offer;
use Croisiland\CommonBundle\Helper\Cruise\CruiseHelper;
use Croisiland\CommonBundle\Helper\Itinerary\ItinerarySummaryHelper;
use Croisiland\CommonBundle\Helper\Price\PriceHelper;
use Croisiland\CommonBundle\Repository\Cabin\CabinCategoryRepository;
use Croisiland\CommonBundle\Repository\Cruise\CruiseRepository;
use Croisiland\CommonBundle\Repository\Itinerary\StopoverRepository;
use Croisiland\CommonBundle\Repository\Offer\OfferRepository;
use DateMalformedStringException;
use DateTime;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class CruiseExtension extends AbstractExtension
{
public function __construct(
public readonly PriceHelper $priceHelper,
public readonly StopoverRepository $stopoverRepository,
private readonly OfferRepository $offerRepository,
private readonly CabinCategoryRepository $cabinCategoryRepository,
private readonly ItinerarySummaryHelper $itinerarySummaryHelper,
private readonly CruiseHelper $cruiseHelper,
) {
}
public function getFunctions(): array
{
return [
new TwigFunction('getCruiseBestPrice', $this->getCruiseBestPrice(...)),
new TwigFunction('getCruiseOffers', $this->getCruiseOffers(...)),
new TwigFunction('getItineraryPartDateForCruise', $this->getItineraryPartDateForCruise(...)),
new TwigFunction('getCabinCategoriesForCruise', $this->getCabinCategoriesForCruise(...)),
new TwigFunction('getSegmentActivities', $this->getSegmentActivities(...)),
new TwigFunction('getCruiseAvatarOwner', $this->getCruiseAvatarOwner(...)),
new TwigFunction('getCruiseName', $this->getCruiseName(...)),
new TwigFunction('getCruiseIncludeForAtmosphereArray', $this->getCruiseIncludeForAtmosphereArray(...)),
new TwigFunction('getCruiseExcludeForAtmosphereArray', $this->getCruiseExcludeForAtmosphereArray(...)),
];
}
/**
* @throws NonUniqueResultException
* @throws NoResultException
*/
public function getCruiseBestPrice(Cruise $cruise): ?int
{
return $this->priceHelper->getBestPriceForCruise($cruise);
}
/**
* @return Offer[]
* @throws DateMalformedStringException
*/
public function getCruiseOffers(Cruise $cruise): array
{
return $this->offerRepository->findValidOffersForCruise($cruise, CruiseConstants::DATETIME_INTERVAL_NEXT_DEPARTURES);
}
public function getItineraryPartDateForCruise(ItineraryPartInterface $itineraryPart, Cruise $cruise): ?\DateTimeInterface
{
$dateDelta = $itineraryPart->getDateDelta();
if ($dateDelta < 1) {
return $cruise->getDepartureDate();
}
$interval = new \DateInterval("P{$dateDelta}D");
$date = clone $cruise->getDepartureDate();
/** @var Datetime $date */
$date->add($interval);
return $date;
}
/**
* @return CabinCategory[]
*/
public function getCabinCategoriesForCruise(Cruise $cruise): array
{
return $this->cabinCategoryRepository->getCabinCategoriesForCruise($cruise);
}
/**
* @return ItineraryActivity[]
*/
public function getSegmentActivities(ItinerarySegment $segment): array
{
return $this->itinerarySummaryHelper->getSegmentActivities($segment);
}
public function getCruiseAvatarOwner(CruiseInterface $cruise): ?MediaTagOwnerInterface
{
return $this->cruiseHelper->getCruiseAvatarOwner($cruise);
}
public function getCruiseName(Cruise $cruise): ?string
{
return $this->cruiseHelper->getCruiseDisplayName($cruise);
}
/**
* @return array<string>>
*/
public function getCruiseIncludeForAtmosphereArray(Cruise $cruise, ?Atmosphere $atmosphere=null): array
{
return $this->cruiseHelper->getCruiseIncludeForAtmosphereArray($cruise, $atmosphere);
}
/**
* @return array<string>>
*/
public function getCruiseExcludeForAtmosphereArray(Cruise $cruise, ?Atmosphere $atmosphere=null): array
{
return $this->cruiseHelper->getCruiseExcludeForAtmosphereArray($cruise, $atmosphere);
}
}