package com.github.qinyou.system.controller;

import com.github.qinyou.common.annotation.RequirePermission;
import com.github.qinyou.common.constant.Constant;
import com.github.qinyou.common.interceptor.PermissionInterceptor;
import com.github.qinyou.common.interceptor.SearchSql;
import com.github.qinyou.common.utils.Id.IdUtils;
import com.github.qinyou.common.utils.StringUtils;
import com.github.qinyou.common.utils.TreeTableUtils;
import com.github.qinyou.common.utils.WebUtils;
import com.github.qinyou.common.validator.IdRequired;
import com.github.qinyou.common.validator.IdsRequired;
import com.github.qinyou.common.web.BaseController;
import com.github.qinyou.system.model.SysButton;
import com.github.qinyou.system.model.SysMenu;
import com.github.qinyou.system.model.SysRoleButton;
import com.github.qinyou.system.model.SysRoleMenu;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.tx.Tx;

import java.util.*;

/**
 * 菜单管理
 */
@RequirePermission("sysMenu")
public class SysMenuController extends BaseController {

    public void index() {
        render("system/sysMenu.ftl");
    }

    /**
     * treegrid 查询数据
     */
    public void query() {
        List<SysMenu> sysMenus = SysMenu.dao.findAllCSort();
        // easyui 字体图标
        for (SysMenu sysMenu : sysMenus) {
            sysMenu.put("iconCls", sysMenu.getIcon());
        }
        renderJson(sysMenus);
    }

    /**
     * 新增 或 修改 弹窗
     */
    public void newModel() {
        String id = get("id");
        if (StringUtils.notEmpty(id)) {
            SysMenu sysMenu = SysMenu.dao.findById(id);
            setAttr("sysMenu", sysMenu);
            if (sysMenu != null) {
                setAttr("pid", sysMenu.getPid());
            }
        } else {
            setAttr("pid", getPara("pid", "0"));
        }
        render("system/sysMenu_form.ftl");
    }

    /**
     * 添加 action
     */
    @SuppressWarnings("Duplicates")
    public void addAction() {
        SysMenu sysMenu = getBean(SysMenu.class, "");
        sysMenu.setId(IdUtils.id())
                .setCreater(WebUtils.getSessionUsername(this))
                .setCreateTime(new Date());
        if (sysMenu.save()) {
            renderSuccess(ADD_SUCCESS);
        } else {
            renderFail(ADD_FAIL);
        }
    }

    /**
     * 修改 action
     */
    public void updateAction() {
        SysMenu sysMenu = getBean(SysMenu.class, "");
        sysMenu.setUpdater(WebUtils.getSessionUsername(this))
                .setUpdateTime(new Date());
        if (sysMenu.update()) {
            renderSuccess(UPDATE_SUCCESS);
        } else {
            renderFail(UPDATE_FAIL);
        }
    }


    /**
     * 删除 action
     */
    @Before(IdRequired.class)
    public void deleteAction() {
        String id = get("id");
        Db.tx(() -> {
            String allIds = TreeTableUtils.getSonTreeIds(id, "sys_menu", "id", "pid");
            if (StringUtils.isEmpty(allIds)) {
                return true;
            }
            allIds = allIds.replaceAll(",", "','");
            String sql = "delete from sys_menu where id in ('" + allIds + "')";
            Db.update(sql);
            sql = "delete from sys_role_menu where sysMenuId in ('" + allIds + "')";
            Db.update(sql);

            // 删相关按钮
            sql = "delete from sys_role_button where sysButtonId in (select id from sys_button where sysMenuId in ('" + allIds + "'))";
            Db.update(sql);
            sql = "delete from sys_button where sysMenuId in ('" + allIds + "')";
            Db.update(sql);

            return true;
        });
        renderSuccess(DELETE_SUCCESS);
    }


    /**
     * org comobTree 数据, 完整的数据
     */
    @Clear(PermissionInterceptor.class)
    public void menuComboTree() {
        List<SysMenu> sysMenus = SysMenu.dao.findAllSort();
        Set<String> pids = new HashSet<>();
        sysMenus.forEach(item -> pids.add(item.getPid()));

        List<Map<String, Object>> maps = new ArrayList<>();
        Map<String, Object> root = new HashMap<>();
        root.put("id", "0");
        root.put("pid", "-1");
        root.put("text", "根菜单");
        root.put("iconCls", "iconfont icon-root");
        root.put("state", sysMenus.size() > 0 ? "closed" : "open");
        maps.add(root);
        for (SysMenu sysMenu : sysMenus) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", sysMenu.getId());
            map.put("text", sysMenu.getMenuName());
            map.put("pid", sysMenu.getPid());
            map.put("iconCls", sysMenu.getIcon());
            if (pids.contains(sysMenu.getId())) {
                map.put("state", "closed");
            }
            maps.add(map);
        }
        renderJson(maps);
    }


    /**
     * 查看 菜单相关 角色
     */
    public void openMenuRole() {
        setAttr("menuId", get("id"));
        render("system/sysMenu_role.ftl");
    }

    /**
     * 菜单相关角色数据
     */
    @Before(SearchSql.class)
    public void queryMenuRole() {
        int pageNumber = getAttr("pageNumber");
        int pageSize = getAttr("pageSize");
        String where = getAttr(Constant.SEARCH_SQL);
        Page<SysRoleMenu> sysRoleMenuPage = SysRoleMenu.dao.pageWithRoleInfo(pageNumber, pageSize, where);
        renderDatagrid(sysRoleMenuPage);
    }

    /**
     * 菜单相关角色删除
     */
    public void deleteMenuRole() {
        String menuId = get("menuId");
        String roleId = get("roleId");
        if (StringUtils.isEmpty(roleId) || StringUtils.isEmpty(menuId)) {
            renderFail("menuId roleId 参数不可为空");
            return;
        }
        SysRoleMenu.dao.deleteByIds(roleId, menuId);
        renderSuccess("菜单角色删除成功");
    }


    /**
     * 打开菜单配置按钮页面
     */
    public void openButton() {
        setAttr("menuId", get("id"));
        render("system/sysButton.ftl");
    }

    public void newButtonModel() {
        String id = get("id");
        String sysMenuId;
        if (StringUtils.notEmpty(id)) {
            SysButton sysButton = SysButton.dao.findById(id);
            setAttr("sysButton", sysButton);
            sysMenuId = sysButton.getSysMenuId();
        } else {
            sysMenuId = get("menuId");
        }
        setAttr("sysMenuId", sysMenuId);
        render("system/sysButton_form.ftl");
    }

    /**
     * 查询菜单按钮
     */
    public void queryButton() {
        String menuId = get("menuId");
        String sql = "select * from sys_button where sysMenuId = ? ";
        List<SysButton> sysButtons = SysButton.dao.find(sql, menuId);
        renderDatagrid(sysButtons, sysButtons.size());
    }

    /**
     * 新增按钮
     */
    @Before(Tx.class)
    public void addButtonAction() {
        SysButton sysButton = getBean(SysButton.class, "")
                .setId(IdUtils.id())
                .setCreater(WebUtils.getSessionUsername(this))
                .setCreateTime(new Date());

        if (SysButton.dao.findUniqueByProperty("buttonCode", sysButton.getButtonCode()) != null) {
            renderFail(ADD_FAIL + " 编码已经存在");
            return;
        }

        SysMenu sysMenu = SysMenu.dao.findById(sysButton.getSysMenuId());
        if (sysMenu == null) {
            renderFail(ADD_FAIL);
            return;
        }

        sysButton.save();
        renderSuccess(ADD_SUCCESS);
    }

    /**
     * 编辑按钮
     */
    public void updateButtonAction() {
        SysButton sysButton = getBean(SysButton.class, "");
        sysButton.setUpdater(WebUtils.getSessionUsername(this))
                .setUpdateTime(new Date());

        SysButton oldSysButton = SysButton.dao.findUniqueByProperty("buttonCode", sysButton.getButtonCode());
        if (oldSysButton != null && !sysButton.getId().equals(oldSysButton.getId())) {
            renderFail(ADD_FAIL + " 编码已经存在");
            return;
        }

        if (sysButton.update()) {
            renderSuccess(UPDATE_SUCCESS);
        } else {
            renderFail(UPDATE_FAIL);
        }
    }

    /**
     * 删除按钮
     */
    @Before({Tx.class, IdsRequired.class})
    public void deleteButtonAction() {
        String sysMenuId = get("menuId");
        if (StringUtils.isEmpty(sysMenuId)) {
            renderFail("参数menuId 缺失");
            return;
        }
        String ids = get("ids");
        ids = ids.replaceAll(",", "','");
        String sql = "delete from sys_role_button where sysButtonId in ('" + ids + "')";
        Db.update(sql);
        sql = "delete from sys_button where id in ('" + ids + "')";
        Db.update(sql);

        renderSuccess(DELETE_SUCCESS);
    }

    /**
     * 查看按钮角色
     */
    public void openButtonRole() {
        setAttr("buttonId", get("id"));
        render("system/sysButton_role.ftl");
    }

    /**
     * 查看按钮角色数据
     */
    @Before(SearchSql.class)
    public void queryButtonRole() {
        int pageNumber = getAttr("pageNumber");
        int pageSize = getAttr("pageSize");
        String where = getAttr(Constant.SEARCH_SQL);
        Page<SysRoleButton> sysRoleMenuPage = SysRoleButton.dao.pageWithRoleInfo(pageNumber, pageSize, where);
        renderDatagrid(sysRoleMenuPage);
    }

    /**
     * 删除按钮角色
     */
    public void deleteButtonRole() {
        String buttonId = get("buttonId");
        String roleId = get("roleId");
        if (StringUtils.isEmpty(roleId) || StringUtils.isEmpty(buttonId)) {
            renderFail("buttonId roleId 参数不可为空");
            return;
        }
        SysRoleButton.dao.deleteByIds(roleId, buttonId);
        renderSuccess("按钮角色删除成功");
    }
}