<?php
declare(strict_types=1);
/*
* Copyright (C) Office National de Publication et de Communication - All Rights Reserved
*
* Unauthorized copying of this file, via any medium is strictly prohibited by law
* This file is proprietary and confidential
*/
namespace App\Service;
use App\Common\LieuInterface;
use App\Common\QuoiInterface;
use App\Entity\Etablissement;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
final class Historique
{
private const FICHE_INDEX = __CLASS__.'_fiche';
private const RECHECHE_INDEX = __CLASS__.'_recherche';
private const MAX = 5;
/** @var RequestStack */
private $requestStack;
/** @var EntityManagerInterface */
private $entityManager;
/** @var Slugify */
private $slugify;
public function __construct(
RequestStack $requestStack,
EntityManagerInterface $entityManager,
Slugify $slugify
) {
$this->requestStack = $requestStack;
$this->entityManager = $entityManager;
$this->slugify = $slugify;
}
// ----- Fiche -------------------------------------------------------------
public function addFiche(Etablissement $etablissement): void
{
$list = $this->requestStack->getSession()->get(self::FICHE_INDEX, []);
$id = $etablissement->getId();
$list[$id] = new DateTimeImmutable();
arsort($list);
$list = \array_slice($list, 0, self::MAX);
$this->requestStack->getSession()->set(self::FICHE_INDEX, $list);
}
public function getFiches(string $sauf = null): array
{
$list = $this->requestStack->getSession()->get(self::FICHE_INDEX, []);
$ids = array_diff(array_keys($list), (array) $sauf);
if (!$ids) {
return [];
}
$unsorted = $this
->entityManager
->getRepository(Etablissement::class)
->findBy(['id' => $ids]);
$sorted = [];
foreach ($ids as $id) {
/** @var Etablissement $etablissement */
foreach ($unsorted as $key => $etablissement) {
if ($etablissement->getId() === $id) {
$sorted[] = $etablissement;
unset($unsorted[$key]);
break;
}
}
}
return $sorted;
}
// ----- Recherche ---------------------------------------------------------
public function addRecherche(QuoiInterface $quoi, LieuInterface $lieu, string $route, string $requestUri = null): void
{
$list = $this->requestStack->getSession()->get(self::RECHECHE_INDEX, []);
$key = $quoi->getSlug().'#'.$lieu->getSlug();
$list[$key] = [
'quoi' => $quoi->getSlug(),
'lieu' => $lieu->getSlug(),
'route' => $route,
'date' => new DateTimeImmutable(),
'requestUri' => $requestUri
];
uasort($list, static function ($a, $b): int {
return $a['date'] < $b['date'] ? 1 : -1;
});
$list = \array_slice($list, 0, self::MAX);
$this->requestStack->getSession()->set(self::RECHECHE_INDEX, $list);
}
public function getRecherches(): array
{
$list = $this->requestStack->getSession()->get(self::RECHECHE_INDEX, []);
foreach ($list as &$item) {
$item['quoi'] = $this->slugify->revealQuoi($item['quoi']);
$item['lieu'] = $this->slugify->revealLieu($item['lieu']);
}
return $list;
}
}