<?php 
 
declare(strict_types=1); 
 
namespace App\Controller\Shop; 
 
use App\Entity\Parameter\Parameter; 
use App\Entity\Product\Product; 
use Sylius\Bundle\ResourceBundle\Controller\ResourceController; 
use Sylius\Component\Resource\ResourceActions; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
 
class ProductController extends ResourceController 
{ 
    public function showAction(Request $request): Response 
    { 
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request); 
 
        $this->isGrantedOr403($configuration, ResourceActions::SHOW); 
        $resource = $this->findOr404($configuration); 
        $this->addProductToHistoryAction($request, $resource); 
 
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource); 
 
        if ($configuration->isHtmlRequest()) { 
            return $this->render($configuration->getTemplate(ResourceActions::SHOW . '.html'), [ 
                'configuration' => $configuration, 
                'metadata' => $this->metadata, 
                'resource' => $resource, 
                $this->metadata->getName() => $resource, 
            ]); 
        } 
 
        return $this->createRestView($configuration, $resource); 
    } 
 
    public function addProductToHistoryAction(Request $request, $product): void 
    { 
        $customer = $this->container->get('sylius.context.customer')->getCustomer(); 
 
        if (null === $product) { 
            return; 
        } 
        $productsVisited = $request->getSession()->get('productsVisited'); 
        if (null !== $customer) { 
            if ($customer->getProductsVisited() === null && count($productsVisited) > 0) { 
                $customer->setProductsVisited($productsVisited); 
            } 
            $productsVisited = $this->updateProductsVisited($customer->getProductsVisited(), $product->getId()); 
            $customer->setProductsVisited($productsVisited); 
            $this->manager->persist($customer); 
            $this->manager->flush(); 
        } else { 
            //mettre simplement le produit en session 
            if (!$productsVisited || count($productsVisited) < 1) { 
                $productsVisited = []; 
            } 
            $productsVisited = $this->updateProductsVisited($productsVisited, $product->getId()); 
        } 
        //mettre le tableau en session 
        $request->getSession()->set('productsVisited', $productsVisited); 
    } 
 
    public function getCustomerProductsVisitedAction(Request $request) 
    { 
        // récupérer les produits visités, et les trier dans l'ordre où ils ont été consultés 
        $productsIdVisited = $request->getSession()->get('productsVisited'); 
        $productsVisitedSorted = []; 
 
        // récupérer le nombre de produits à mettre dans le tableau 
        $nbProduct = $this->manager->getRepository(Parameter::class)->findByCodeAndChannelCode('nb_product_visited', $_SERVER['SYLIUS_CHANNEL']); 
        if (!$nbProduct) { 
            $nbProduct = 8; 
        } 
 
        if ($productsIdVisited && count($productsIdVisited) > 0) { 
            $productsVisited = $this->manager->getRepository(Product::class)->findProductsVisited($productsIdVisited, (int) $nbProduct); 
            foreach ($productsIdVisited as $productid) { 
                foreach ($productsVisited as $product) { 
                    if ($product->getId() === (int) $productid) { 
                        $productsVisitedSorted[] = $product; 
                    } 
                } 
            } 
        } 
 
        if (count($productsVisitedSorted) > 0) { 
            return $this->render('@SyliusShop/Product/_horizontalList.html.twig', ['products' => $productsVisitedSorted, 'header' => 'app.product.products_visited', 'trans' => true]); 
        } 
    } 
 
    private function updateProductsVisited(?array $productsVisited, int $productId) 
    { 
        if (null === $productsVisited) { 
            $productsVisited = []; 
        } 
        //supprimer d'abord l'id du tableau correspondant s'il existe, pour le mettre ensuite en dernière position 
        if (in_array($productId, $productsVisited)) { 
            $index = array_search($productId, $productsVisited); 
            unset($productsVisited[$index]); 
        } 
        // on garde que les 15 derniers produits consultés 
        if (count($productsVisited) > 15) { 
            array_shift($productsVisited); 
        } 
 
        $productsVisited[] = $productId; 
 
        return $productsVisited; 
    } 
}