<?php 

namespace Sargilla\Flatlab4\Composers;

use Sargilla\Flatlab4\Flatlab4Menu;
use Illuminate\View\View;

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

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

    public function __construct()
    {
        $this->menu_salida = Menu::new();
        $this->menus = Flatlab4Menu::raiz()->menu('admin')->ordenar()->get();
        $this->patron = request()->url();
    }
    public function compose(View $view)
    {
        $this->buildMenu();         
        $this->menu_salida->setActive($this->patron);         
        $this->menu_salida->each(function (Link $link) {
            if($link->isActive()){
                 $link->addClass('active');
            };
        });
        $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');
                $header = Html::raw("<a href='javascript:void(0)' class='$activo' ><i class='fa $menu->icono'></i> <span>$menu->nombre<span></a>");
                $callback = function (Menu $menu_parcial) {
                    $this->generarHijos($this->hijos, $menu_parcial);
                };
                if ($menu->permiso) {
                    $this->menu_salida->submenuIfCan($menu->permiso, $header, $callback);
                } else {
                    $this->menu_salida->submenu($header, $callback);
                }
            } else {
                $this->generarLink($menu);
            };
        }
    }
    public function generarHijos($hijos, $menu)
    {
        foreach($hijos as $hijo )
        {
            $this->hijos = $hijo->hijos();
            if($this->hijos->count()){
                $header = Html::raw("<a href='' ><i class='fa $hijo->icono'></i> <span>$hijo->nombre</span></a>");
                $callback = function (Menu $menu) {
                    $this->generarHijos($this->hijos, $menu);
                };
                if ($hijo->permiso) {
                    $menu->submenuIfCan($hijo->permiso, $header, $callback);
                } else {
                    $menu->submenu($header, $callback);
                }
            } 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');
        $label = "<i class='fa $menuItem->icono'></i> <span>$menuItem->nombre</span>";
        switch ($menuItem->tipo) {
            case 'url':
                if ($menuItem->permiso) {
                    $menu->linkIfCan($menuItem->permiso, url("$menuItem->destino"), $label);
                } else {
                    $menu->link(url("$menuItem->destino"), $label);
                }
                break;
            case 'route':
                if ($menuItem->permiso) {
                    $menu->routeIfCan($menuItem->permiso, $menuItem->destino, $label);
                } else {
                    $menu->route($menuItem->destino, $label);
                }
                break;
            case 'action':
                if ($menuItem->permiso) {
                    $menu->actionIfCan($menuItem->permiso, $menuItem->destino, $label);
                } else {
                    $menu->action($menuItem->destino, $label);
                }
                break;
        }
    }
}
