package com.fp.frontend.controller.security;

import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;

import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;
import org.primefaces.model.menu.Submenu;

import com.fp.frontend.helper.MessageHelper;

public class MaiaMenu {

    private MenuModel menuModel;

    private String maiaMenuJson;

    private String contextPath = "";

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    public MaiaMenu() {
        try {
            maiaMenuJson = "";
            contextPath = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecked")
    public void buildMenu(List<Map<String, Object>> lmenu) throws Exception {
        menuModel = new DefaultMenuModel();
        for (Map<String, Object> menu : lmenu) {
            String label = (String) menu.get("t");
            DefaultSubMenu submenu = new DefaultSubMenu();
            submenu.setLabel(label);
            menuModel.addElement(submenu);

            if (menu.get("items") instanceof Map) {
                this.addMenuItem(submenu, (Map<String, Object>) menu.get("items"));
            } else {
                this.addSubmenu(submenu, (List<Map<String, Object>>) menu.get("items"));
            }
        }
    }

    @SuppressWarnings("unchecked")
    private void addSubmenu(Submenu submenupadre, List<Map<String, Object>> lsubmenu) throws Exception {
        for (Map<String, Object> menu : lsubmenu) {
            Object obj = menu.get("items");
            if (obj == null) {
                this.addMenuItem(submenupadre, menu);
            } else {
                String label = (String) menu.get("t");
                DefaultSubMenu submenu = new DefaultSubMenu();
                submenu.setLabel(label);
                submenupadre.getElements().add(submenu);
                this.addSubmenu(submenu, (List<Map<String, Object>>) menu.get("items"));
            }
        }

    }

    @SuppressWarnings("unchecked")
    private void addMenuItem(Submenu submenu, Map<String, Object> mdata) throws Exception {
        String tname = (String) mdata.get("t");
        String modulo = (String) mdata.get("m");
        Integer transaccion = (Integer) mdata.get("tr");
        Integer version = (Integer) mdata.get("v");
        String pagina = (String) mdata.get("jsfp");
        String autoconsulta = (String) mdata.get("a");
        String url = pagina + "?" + "m=" + modulo + "&t=" + transaccion + "&v=" + version + "&autoquery=" + autoconsulta;
        String key = modulo + "-" + transaccion + "-" + version;
        String nameMenu = tname + " (" + modulo + "-" + transaccion + ")";
        DefaultMenuItem menuItem = new DefaultMenuItem();
        menuItem.setValue(nameMenu);
        menuItem.setUrl("javascript:Maiaworkspace.loadPage('" + url + "','" + nameMenu + "')");
        menuItem.setIcon("ui-icon-document");
        menuItem.setStyleClass("m-menuitem");
        submenu.getElements().add(menuItem);
        maiaMenuJson = maiaMenuJson + "'" + key + "': {'url':'" + url + "','name':'" + nameMenu + "'},";
    }

    /**
     * Entrega el valor de: menuModel
     *
     * @return MenuModel
     */
    public MenuModel getMenuModel() {
        return menuModel;
    }

    /**
     * Fija el valor de: menuModel
     *
     * @param Valor a fijar en el atributo.
     */
    public void setMenuModel(MenuModel menuModel) {
        this.menuModel = menuModel;
    }

    /**
     * Entrega el valor de: maiaMenuJson
     *
     * @return String
     */
    public String getMaiaMenuJson() {
        return maiaMenuJson;
    }

    /**
     * Fija el valor de: maiaMenuJson
     *
     * @param maiaMenuJson Valor a fijar en el atributo
     */
    public void setMaiaMenuJson(String maiaMenuJson) {
        this.maiaMenuJson = maiaMenuJson;
    }

}
