<?php
namespace App\Application\Service\Taxonomy;
use Psr\Cache\InvalidArgumentException;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
class TaxonomyHomeService
{
public const NUM_MAX_CHILDS = 4;
public const KEY_TEXT_PLURAL = 'taxonomy.num.categories.more';
public const KEY_TEXT_SINGULAR = 'taxonomy.num.category.more';
public const ONLY_ONE_CHILDREN = 1;
/** @var TaxonomyService */
private $taxonomyService;
/** @var TranslatorInterface */
private $translator;
/** @var RequestStack */
private $requestStack;
public function __construct(
TaxonomyService $taxonomyService,
TranslatorInterface $translator,
RequestStack $requestStack
) {
$this->taxonomyService = $taxonomyService;
$this->translator = $translator;
$this->requestStack = $requestStack;
}
/**
* @return array
*
* @throws InvalidArgumentException
*/
public function getTaxonomyComponentLanding(string $isoCode = null): array
{
if (empty($isoCode)) {
$isoCode = $this->requestStack->getSession()->get('lang');
}
$taxonomies = $this->taxonomyService->getTaxonomyChilds();
return $this->getTaxonomies($taxonomies, $isoCode);
}
/**
* @param array $taxonomies
* @param string $isoCode
*
* @return array
*/
private function getTaxonomies(array $taxonomies, string $isoCode): array
{
$result = [];
$count = 0;
$numChildren = 0;
$numCategoriesMore = [];
foreach ($taxonomies as $taxonomy) {
$childs = [];
[$numChildren, $childs] = $this->getChildren($taxonomy['childs'], $numChildren, $count, $childs);
$numCategoriesMore = $this->getNumCategoriesMore($numChildren, $taxonomy, $isoCode);
$result = $this->setResult($taxonomy, $childs, $numCategoriesMore, $result);
$count = 0;
}
return $result;
}
/**
* @param int $numChildren
* @param array $taxonomy
* @param string $isoCode
*
* @return array
*/
private function getNumCategoriesMore(int $numChildren, array $taxonomy, string $isoCode): array
{
$numElementsNotVisible = ($numChildren > self::NUM_MAX_CHILDS) ? ($numChildren - self::NUM_MAX_CHILDS) : 0;
if ($numElementsNotVisible === self::ONLY_ONE_CHILDREN) {
$numCategoriesMore['taxonomyMore'] = $this->getData($this->translator->trans(self::KEY_TEXT_SINGULAR, ['%num_categories%' => $numElementsNotVisible], null, $isoCode), $taxonomy['link']);
return $numCategoriesMore;
}
if ($numElementsNotVisible > self::ONLY_ONE_CHILDREN) {
$numCategoriesMore['taxonomyMore'] = $this->getData($this->translator->trans(self::KEY_TEXT_PLURAL, ['%num_categories%' => $numElementsNotVisible], null, $isoCode), $taxonomy['link']);
return $numCategoriesMore;
}
$numCategoriesMore['taxonomyMore'] = $this->getData(null, null);
return $numCategoriesMore;
}
/**
* @param string|null $text
* @param string|null $link
*
* @return null[]|string[]
*/
private function getData(?string $text, ?string $link): array
{
return [
'text' => $text,
'link' => $link,
];
}
/**
* @param $taxonomyChilds
* @param int $numChildren
* @param int $count
* @param array $childs
*
* @return array
*/
private function getChildren(
$taxonomyChilds,
int $numChildren,
int $count,
array $childs
): array {
if (is_array($taxonomyChilds)) {
$numChildren = count($taxonomyChilds);
foreach ($taxonomyChilds as $child) {
if ($count < self::NUM_MAX_CHILDS) {
$childs[] = $child;
$count++;
}
}
}
return [$numChildren, $childs];
}
/**
* @param $taxonomy
* @param $childs
* @param array $numCategoriesMore
* @param array $result
*
* @return array
*/
private function setResult(
$taxonomy,
$childs,
array $numCategoriesMore,
array $result
): array {
$result[] = [
'taxonomy' => $taxonomy['name'],
'taxonomyId' => $taxonomy['id'],
'link' => $taxonomy['link'],
'childs' => $childs,
'numCategoriesMore' => $numCategoriesMore,
];
return $result;
}
}