<?php

namespace App\EventSubscriber;

use App\Entity\Menu;
use Doctrine\ORM\EntityManagerInterface;
use KevinPapst\AdminLTEBundle\Event\BreadcrumbMenuEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use KevinPapst\AdminLTEBundle\Model\MenuItemModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MenuBuilderSubscriber implements EventSubscriberInterface
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            SidebarMenuEvent::class => ['onSetupMenu', 100],
            BreadcrumbMenuEvent::class => ['onSetupMenu', 100],
        ];
    }
    
    public function onSetupMenu(SidebarMenuEvent $event)
    {
        $items = $this->em->getRepository(Menu::class)->findBy(
            ['parent' => null], 
            ['position' => 'ASC']
        );

        foreach ($items as $item) {
            $menu = new MenuItemModel(
                $item->getId(), 
                $item->getName(), 
                $item->getRoute(), 
                [], 
                'fas '.$item->getIcon()
            );

            $children = $this->em->getRepository(Menu::class)->findBy(
                ['parent' => $item->getId()], 
                ['position' => 'ASC']
            );
            foreach ($children as $child) {
                $menu->addChild(
                    new MenuItemModel(
                        $child->getId(), 
                        $child->getName(), 
                        $child->getRoute(), 
                        [], 
                        'fas '.$item->getIcon()
                    )
                );
            }

            $event->addItem($menu);
        }

        $this->activateByRoute(
            $event->getRequest()->get('_route'),
            $event->getItems()
        );
    }

    /**
     * @param string $route
     * @param MenuItemModel[] $items
     */
    protected function activateByRoute($route, $items)
    {
        foreach ($items as $item) {
            if ($item->hasChildren()) {
                $this->activateByRoute($route, $item->getChildren());
            } elseif ($item->getRoute() == $route) {
                $item->setIsActive(true);
            }
        }
    }
}