<?php 

namespace Sigma\Flatlab\Composers;

use Sigma\Flatlab\FlatlabMenu;
use Illuminate\View\View;

use Spatie\Menu\Laravel\Menu;
use Spatie\Menu\Link;

class MenuComposer
{
    private $patron;
    private $menu;
    private $menus;

    public function __construct()
    {
        $this->menu_salida = Menu::new();
        $this->menus = FlatlabMenu::raiz()->menu('admin')->ordenar()->get();
        $this->patron = request()->url();
    }
    public function compose(View $view)
    {
        $this->buildMenu();
        $this->menu_salida->setActiveClass('')->setExactActiveClass('active')->setActiveClassOnLink()->setActive($this->patron);
        $view->with('menu', $this->menu_salida);
    }
    public function buildMenu()
    {
        $this->menu_salida->addClass('sidebar-menu')->setAttribute('id' , 'nav-accordion');
        foreach ($this->menus as $menu){
            if($menu->tieneHijos()){
                $activo = (strpos($this->patron, $menu->alias) !== false) ? 'active':'';
                $this->hijos = $menu->hijos->sortBy('orden');
                $this->menu_salida->submenuIfCan($menu->permiso,"<a href='javascript:void(0)' class='$activo' ><i class='$menu->icono'></i> <span>$menu->nombre<span></a>", function (Menu $menu_parcial) {
                    $this->generarHijos($this->hijos, $menu_parcial);
                });
            } else {
                $this->generarLink($menu);
            };
        }
    }
    public function generarHijos($hijos, $menu)
    {
        foreach($hijos as $hijo )
        {
            $this->hijos = $hijo->hijos();
            if($this->hijos->count()){       
                $menu->submenuIfCan($hijo->permiso, "<a href='' ><i class='$hijo->icono'></i> <span>$hijo->nombre</span></a>", function (Menu $menu) 
                {
                    $this->generarHijos($this->hijos, $menu);
                });
            } else {
                $this->generarLink($hijo, $menu);
            }
        }
        $menu->setActiveFromRequest();
        $menu->each(function (Link $link) {
            if($link->isActive()){
                 $link->addClass('active');
            };
        });
    }
    /**
     * Genera el link de menu
     */
    public function generarLink($menuItem, $menu = null)
    {
        if(!$menu){
            $menu = $this->menu_salida  ;
        } 
        $menu->addClass('sub')->addParentClass('sub-menu');
        switch ($menuItem->tipo) {
            case 'url':
                $menu->linkIfCan($menuItem->permiso, url("$menuItem->destino"), "<i class='$menuItem->icono'></i> <span>$menuItem->nombre</span>");
                break;
            case 'route':
                if(\Route::has($menuItem->destino)){
                    $menu->routeIfCan($menuItem->permiso, $menuItem->destino, "<i class='$menuItem->icono'></i> <span>$menuItem->nombre</span>");
                }
                break;
            case 'action':
                $menu->actionIfCan($menuItem->permiso, $menuItem->destino, "<i class='$menuItem->icono'></i> <span>$menuItem->nombre</span>");
                break;
        }
    }
}
