<?php
declare(strict_types=1);
namespace Slivki\Services\Order;
use Doctrine\ORM\EntityManagerInterface;
use Slivki\Entity\AbstractOrderBase;
use Slivki\Entity\FoodOrder;
use Slivki\Entity\Offer;
use Slivki\Repository\OfferRepository;
use function array_keys;
use function explode;
final class PricePromocodeForOnlineOrder
{
private OfferRepository $offerRepository;
public function __construct(EntityManagerInterface $entityManager)
{
$this->offerRepository = $entityManager->getRepository(Offer::class);
}
public function getPrice(AbstractOrderBase $order, Offer $offer, float $codesCount, float $orderAmount): float
{
$codeCost = (float) $this->offerRepository->getCodeCost($offer, $codesCount);
if (!$order instanceof FoodOrder) {
return $codeCost;
}
$settings = $offer->getOnlineOrderSettings();
if ($settings === null || empty($settings->getPriceCodeDependsOnOrder())) {
return $codeCost;
}
$prices = json_decode($settings->getPriceCodeDependsOnOrder(), true, 512, JSON_THROW_ON_ERROR);
foreach ($prices as $price) {
$range = array_keys($price)[0];
$range = explode('-', $range);
$min = (float) $range[0];
$max = (float) $range[1];
if ($orderAmount >= $min && $orderAmount <= $max) {
return $price[$range[0] . '-' . $range[1]];
}
}
return $codeCost;
}
}