<?php
namespace App\Services;
use App\Entity\Category;
use App\Entity\CompareProduct;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class CompareManager
{
/** @var CompareProduct */
protected $compareProduct;
/** @var Session Session */
protected $session;
protected $em;
protected $request;
const MAX_PRODUCTS_IN_COMPARE = 5;
const MAX_PRODUCT_IN_COMPARE_ERROR = 'Możesz dodać do porównania maksymalnie 5 produktów. Przejdź do porównania i usuń wybrane produkty.';
/**
* CompareManager constructor.
* @param EntityManager $em
* @param RequestStack $requestStack
* @param Session $session
*/
public function __construct(EntityManagerInterface $em, RequestStack $requestStack, SessionInterface $session) {
$this->session = $session;
$this->em = $em;
$this->request = $requestStack->getCurrentRequest();
}
/**
* @return CompareProduct
*/
public function getCompareProduct() {
return $this->compareProduct;
}
/**
* @param CompareProduct $product
* @return $this
*/
public function setCompareProduct(CompareProduct $product) {
$this->compareProduct = $product;
return $this;
}
public function getRepository() {
return $this->em->getRepository(\App\Entity\CompareProduct::class);
}
/**
* @return int
*/
public function checkProductsNumber() {
$products = $this->getRepository()->findBy(array('session'=>$this->session->get('cart_session')));
$c = 0;
foreach ($products as $p) {
$c = $c + 1;
}
return $c;
}
/**
* @param CompareProduct $cartItem
* @return CompareProduct
*/
public function save(CompareProduct $cartItem) {
if ($this->checkProductsNumber() > self::MAX_PRODUCTS_IN_COMPARE) {
//throw new CompareException(self::MAX_PRODUCT_IN_COMPARE_ERROR);
}
$this->doSave($cartItem);
return $cartItem;
}
/**
* @return CompareProduct
*/
public function create() {
/** @var $compareProduct CompareProduct */
$compareProduct = new CompareProduct();
$compareProduct->setSession($this->session->getId());
return $compareProduct;
}
/**
* Remove from database and flush
* @param CompareProduct $cartItem
*/
public function remove(CompareProduct $cartItem) {
$this->em->remove($cartItem);
$this->em->flush();
}
/**
* @param CompareProduct $cartItem
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
protected function doSave(CompareProduct $cartItem) {
$this->em->persist($cartItem);
$this->em->flush();
}
/**
* @return object
*/
public function getCompareProducts() {
$products = $this->em->getRepository(CompareProduct::class)->findBy(array('session'=>$this->session->get('cart_session')));
return $products;
}
/**
* Gets ids of the products currently added to compare
* @return array
*/
public function getIdsCompareProducts() {
$arr = array();
/** @var $compareProduct CompareProduct */
foreach ($this->getCompareProducts() as $compareProduct) {
$arr[] = $compareProduct->getProduct()->getId();
}
return $arr;
}
/**
* If compare should be available
* @param Category $category
* @return bool
*/
public function ifCompareAvailable(Category $category) {
$categories[] = 118;
$categories[] = 119;
$categories[] = 133;
$categories[] = 138;
if (in_array($category->getId(), $categories) or in_array($category->getParent()->getId(), $categories)) {
return true;
}
return false;
}
}