<?php

namespace App\Menu;

use App\Entity\Menu;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Menu\FactoryInterface;

class MenuBuilder
{
    private $factory;
    private $em;

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

    public function createMesoddMenu(array $options)
    {
        $menu = $this->factory->createItem('root');
        $menu->setChildrenAttribute('class', 'nav nav-pills nav-sidebar flex-column');
        $menu->setChildrenAttribute('data-widget', 'treeview');
        $menu->setChildrenAttribute('role', 'menu');
        $menu->setChildrenAttribute('data-accordion', 'false');

        $items = $this->em->getRepository(Menu::class)->findBy(
            ['parent' => null, 'appid' => 'mesodd'], 
            ['position' => 'ASC']
        );

        foreach ($items as $item) {
            $menu->addChild($item->getId(), [
                'label' => $item->getName(),
                'route' => $item->getRoute()
                ])
                ->setAttribute('icon', $item->getIcon())
                ->setAttribute('class', 'nav-item has-treeview')
                ->setChildrenAttribute('class', 'nav nav-treeview');

            $children = $this->em->getRepository(Menu::class)->findBy(
                ['parent' => $item->getId()], 
                ['position' => 'ASC']
            );
            foreach ($children as $child) {
                $parameter['id'] = 0;
                $menu[$item->getId()]->addChild($child->getName(), [
                    'route' => $child->getRoute(),
                    //'routeParameters' => $child->getParameter() ? $parameter : null
                ])
                ->setAttribute('class', 'nav-item has-treeview')
                ;
            }
        }
        return $menu;
    }

    public function createSuioddMenu(array $options)
    {
        $menu = $this->factory->createItem('root');
        $menu->setChildrenAttribute('class', 'nav nav-pills nav-sidebar flex-column');
        $menu->setChildrenAttribute('data-widget', 'treeview');
        $menu->setChildrenAttribute('role', 'menu');
        $menu->setChildrenAttribute('data-accordion', 'false');

        $items = $this->em->getRepository(Menu::class)->findBy(
            ['parent' => null, 'appid' => 'suiodd'], 
            ['position' => 'ASC']
        );

        foreach ($items as $item) {
            $menu->addChild($item->getId(), [
                'label' => $item->getName(),
                'route' => $item->getRoute()
                ])
                ->setAttribute('icon', $item->getIcon())
                ->setAttribute('class', 'nav-item has-treeview')
                ->setChildrenAttribute('class', 'nav nav-treeview');

            $children = $this->em->getRepository(Menu::class)->findBy(
                ['parent' => $item->getId(), 'appid' => 'suiodd'], 
                ['position' => 'ASC']
            );
            foreach ($children as $child) {
                $parameter['id'] = 0;
                $menu[$item->getId()]->addChild($child->getName(), [
                    'route' => $child->getRoute(),
                    //'routeParameters' => $child->getParameter() ? $parameter : null
                ])
                ->setAttribute('class', 'nav-item has-treeview')
                ;
            }
        }
        return $menu;
    }

    public function createCommuneoddMenu(array $options)
    {
        $menu = $this->factory->createItem('root');
        $menu->setChildrenAttribute('class', 'nav nav-pills nav-sidebar flex-column');
        $menu->setChildrenAttribute('data-widget', 'treeview');
        $menu->setChildrenAttribute('role', 'menu');
        $menu->setChildrenAttribute('data-accordion', 'false');

        $items = $this->em->getRepository(Menu::class)->findBy(
            ['parent' => null, 'appid' => 'comodd'], 
            ['position' => 'ASC']
        );

        foreach ($items as $item) {
            $menu->addChild($item->getId(), [
                'label' => $item->getName(),
                'route' => $item->getRoute()
                ])
                ->setAttribute('icon', $item->getIcon())
                ->setAttribute('class', 'nav-item has-treeview')
                ->setChildrenAttribute('class', 'nav nav-treeview');

            $children = $this->em->getRepository(Menu::class)->findBy(
                ['parent' => $item->getId(), 'appid' => 'comodd'], 
                ['position' => 'ASC']
            );
            foreach ($children as $child) {
                $parameter['id'] = 0;
                $menu[$item->getId()]->addChild($child->getName(), [
                    'route' => $child->getRoute(),
                    //'routeParameters' => $child->getParameter() ? $parameter : null
                ])
                ->setAttribute('class', 'nav-item has-treeview')
                ;
            }
        }
        return $menu;
    }

    public function createCfgoddMenu(array $options)
    {
        $menu = $this->factory->createItem('root');
        $menu->setChildrenAttribute('class', 'nav nav-pills nav-sidebar flex-column');
        $menu->setChildrenAttribute('data-widget', 'treeview');
        $menu->setChildrenAttribute('role', 'menu');
        $menu->setChildrenAttribute('data-accordion', 'false');

        $items = $this->em->getRepository(Menu::class)->findBy(
            ['parent' => null, 'appid' => 'cfgodd'], 
            ['position' => 'ASC']
        );

        foreach ($items as $item) {
            $menu->addChild($item->getId(), [
                'label' => $item->getName(),
                'route' => $item->getRoute()
                ])
                ->setAttribute('icon', $item->getIcon())
                ->setAttribute('class', 'nav-item has-treeview')
                ->setChildrenAttribute('class', 'nav nav-treeview');

            $children = $this->em->getRepository(Menu::class)->findBy(
                ['parent' => $item->getId(), 'appid' => 'cfgodd'], 
                ['position' => 'ASC']
            );
            foreach ($children as $child) {
                $parameter['id'] = 0;
                $menu[$item->getId()]->addChild($child->getName(), [
                    'route' => $child->getRoute(),
                    //'routeParameters' => $child->getParameter() ? $parameter : null
                ])
                ->setAttribute('class', 'nav-item has-treeview')
                ;
            }
        }
        return $menu;
    }

    public function createDDDMenu(array $options)
    {
        $menu = $this->factory->createItem('root');
        $menu->setChildrenAttribute('class', 'nav nav-pills nav-sidebar flex-column');
        $menu->setChildrenAttribute('data-widget', 'treeview');
        $menu->setChildrenAttribute('role', 'menu');
        $menu->setChildrenAttribute('data-accordion', 'false');

        $items = $this->em->getRepository(Menu::class)->findBy(
            ['parent' => null, 'appid' => 'ddd'], 
            ['position' => 'ASC']
        );

        foreach ($items as $item) {
            $menu->addChild($item->getId(), [
                'label' => $item->getName(),
                'route' => $item->getRoute()
                ])
                ->setAttribute('icon', $item->getIcon())
                ->setAttribute('class', 'nav-item has-treeview')
                ->setChildrenAttribute('class', 'nav nav-treeview');

            $children = $this->em->getRepository(Menu::class)->findBy(
                ['parent' => $item->getId(), 'appid' => 'ddd'], 
                ['position' => 'ASC']
            );
            foreach ($children as $child) {
                $parameter['id'] = 0;
                $menu[$item->getId()]->addChild($child->getName(), [
                    'route' => $child->getRoute(),
                    //'routeParameters' => $child->getParameter() ? $parameter : null
                ])
                ->setAttribute('class', 'nav-item has-treeview')
                ;
            }
        }
        return $menu;
    }
}
