package com.zkqy.system.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import com.zkqy.common.core.text.Convert;
import com.zkqy.common.utils.DateUtils;
import com.zkqy.common.utils.SecurityUtils;
import com.zkqy.common.utils.uuid.IdUtils;
import com.zkqy.system.entity.DragTableBtn;
import com.zkqy.system.entity.DragTableBtnRelevance;
import com.zkqy.system.entity.vo.DragTableBtnDefaultVo;
import com.zkqy.system.mapper.DragTableBtnRelevanceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zkqy.system.mapper.DragTableBtnMapper;
import com.zkqy.system.service.IDragTableBtnService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 格绑定的自定义按钮Service业务层处理
 * 
 * @author zkqy
 * @date 2023-11-07
 */
@Service
public class DragTableBtnServiceImpl implements IDragTableBtnService {
    @Autowired
    private DragTableBtnMapper dragTableBtnMapper;

    @Autowired
    private DragTableBtnRelevanceMapper dragTableBtnRelevanceMapper;

    /**
     * 查询格绑定的自定义按钮
     * 
     * @param id 格绑定的自定义按钮主键
     * @return 格绑定的自定义按钮
     */
    @Override
    public DragTableBtn selectDragTableBtnById(Long id) {
        return dragTableBtnMapper.selectDragTableBtnById(id);
    }

    /**
     * 查询格绑定的自定义按钮列表
     * 
     * @param dragTableBtn 格绑定的自定义按钮
     * @return 格绑定的自定义按钮
     */
    @Override
    public List<DragTableBtn> selectDragTableBtnList(DragTableBtn dragTableBtn) {
        // 根据分页得到根节点数据
        List<DragTableBtn> rootNodes = dragTableBtnMapper.selectDragTableBtnList(dragTableBtn);
        // 给已经绑定的按钮添加标识
        List<DragTableBtnRelevance> dragTableBtnRelevanceList =
            dragTableBtnRelevanceMapper.selectDragTableBtnRelevanceList(new DragTableBtnRelevance());
        List<String> btnKeys =
            dragTableBtnRelevanceList.stream().map(DragTableBtnRelevance::getBtnKey).collect(Collectors.toList());
        for (DragTableBtn r : rootNodes) {
            if (btnKeys.contains(r.getBtnKey())) {
                r.setWhetherBind(true);
            }
        }
        // 查询子节点
        List<Long> ids = rootNodes.stream().map(m -> m.getId()).collect(Collectors.toList());
        if (ids.isEmpty()) {
            return rootNodes;
        }
        List<DragTableBtn> childNodes = dragTableBtnMapper.selectChildNodeById(ids);
        // 递归处理树结构
        for (DragTableBtn root : rootNodes) {
            List<DragTableBtn> children = getChildrenList(root, childNodes);
            root.setChildren(children);
        }
        return rootNodes;
    }

    private List<DragTableBtn> getChildrenList(DragTableBtn root, List<DragTableBtn> childNodes) {
        List<DragTableBtn> list = childNodes.stream().filter(dragTableBtn ->
        // 筛选出下一节点元素
        Objects.equals(dragTableBtn.getBtnParentId(), root.getId())).map(dragTableBtn -> {
            // 递归set子节点
            dragTableBtn.setChildren(this.getChildrenList(dragTableBtn, childNodes));
            return dragTableBtn;
        }).collect(Collectors.toList());
        return list;
    }

    @Override
    @Transactional
    public int insertDragTableBtn(DragTableBtn dragTableBtn) {
        dragTableBtn.setCreateById(SecurityUtils.getUserId());
        dragTableBtn.setCreateBy(SecurityUtils.getUsername());
        dragTableBtn.setCreateTime(DateUtils.getNowDate());
        if (dragTableBtn.getBtnParentId() == 0L) {
            dragTableBtn.setAncestorsId("0");
        } else {
            dragTableBtn.setAncestorsId(
                dragTableBtnMapper.selectDragTableBtnById(dragTableBtn.getBtnParentId()).getAncestorsId() + ","
                    + dragTableBtn.getBtnParentId());
        }
        return dragTableBtnMapper.insertDragTableBtn(dragTableBtn);
    }

    // @Override
    // @Transactional
    // public void insertDragTableBtn(List<DragTableBtn> dragTableBtnList)
    // {
    // List<DragTableBtn> list = new ArrayList<>();
    // list = dragTableBtnList.stream().filter(dragTableBtn -> 0L ==
    // dragTableBtn.getBtnParentId()).collect(Collectors.toList());
    // //循环遍历数据新增
    // for (int i = 0; i < list.size(); i++){
    // printTree(list.get(i),0L);
    // }
    // }
    // //新增动态表格自定义按钮
    // public void printTree(DragTableBtn dragTableBtn, Long parentId) {
    // if (dragTableBtn == null) {
    // return;
    // }
    // //add按钮
    // dragTableBtn.setCreateBy(SecurityUtils.getUsername());
    // dragTableBtn.setCreateById(SecurityUtils.getUserId());
    // dragTableBtn.setCreateTime(DateUtils.getNowDate());
    // dragTableBtn.setBtnParentId(parentId);
    // dragTableBtnMapper.insertDragTableBtn(dragTableBtn);
    // for (DragTableBtn child : dragTableBtn.getChildren()) { // 遍历子节点
    // printTree(child,dragTableBtn.getId()); // 递归调用
    // }
    // }

    /**
     * 修改格绑定的自定义按钮
     * 
     * @param dragTableBtn 格绑定的自定义按钮
     * @return 结果
     */
    @Override
    public int updateDragTableBtn(DragTableBtn dragTableBtn) {
        dragTableBtn.setUpdateById(SecurityUtils.getUserId());
        dragTableBtn.setUpdateBy(SecurityUtils.getUsername());
        dragTableBtn.setUpdateTime(DateUtils.getNowDate());
        if (dragTableBtn.getBtnParentId() == 0L) {
            dragTableBtn.setAncestorsId("0");
        } else {
            dragTableBtn.setAncestorsId(
                dragTableBtnMapper.selectDragTableBtnById(dragTableBtn.getBtnParentId()).getAncestorsId() + ","
                    + dragTableBtn.getBtnParentId());
        }
        return dragTableBtnMapper.updateDragTableBtn(dragTableBtn);
    }

    /**
     * 批量删除格绑定的自定义按钮
     * 
     * @param btnKeys 需要删除的格绑定的自定义按钮主键
     * @return 结果
     */
    @Override
    public int batchDeleteDragTableBtnByBtnKeys(List<String> btnKeys) {
        return dragTableBtnMapper.batchDeleteDragTableBtnByBtnKeys(btnKeys);
    }

    /**
     * 删除格绑定的自定义按钮信息
     * 
     * @param id 格绑定的自定义按钮主键
     * @return 结果
     */
    @Override
    public int deleteDragTableBtnById(Long id) {
        return dragTableBtnMapper.deleteDragTableBtnById(id);
    }

    @Override
    public boolean hasChildByBtnId(Long btnId) {
        return dragTableBtnMapper.hasChildByBtnId(btnId) > 0;
    }

    @Override
    public DragTableBtn selectDragTableBtnByBtnKey(String btnKey) {
        return dragTableBtnMapper.selectDragTableBtnByBtnKey(btnKey);
    }

    @Override
    public List<Map<String, Object>> insertByDefaultBtn(DragTableBtnDefaultVo dragTableBtnDefaultVo) {
        // 主要权限字符
        String hasPermi = Convert.toInitials(dragTableBtnDefaultVo.getHasPermiName()) + ":";
        // 初始化按钮组名称
        String btnGroupName = dragTableBtnDefaultVo.getHasPermiName()
            .substring(dragTableBtnDefaultVo.getHasPermiName().indexOf(";") + 1).replace(":", "-");

        dragTableBtnDefaultVo.getDragTableBtnTop().setBtnGroupName(btnGroupName);
        dragTableBtnDefaultVo.getDragTableBtnTop().setBtnTableKey(dragTableBtnDefaultVo.getTableKey());
        dragTableBtnDefaultVo.getDragTableBtnTop().setBtnKey(IdUtils.fastUUID());

        // 初始化默认按钮
        dragTableBtnMapper.insertDragTableBtn(dragTableBtnDefaultVo.getDragTableBtnTop());
        Long topId = dragTableBtnDefaultVo.getDragTableBtnTop().getId();
        dragTableBtnDefaultVo.getDragTableBtnTop().getChildren().forEach(item -> {
            item.setBtnParentId(topId);
            item.setBtnHasPermi(hasPermi + item.getBtnType());
            item.setAncestorsId("0" + "," + topId);
            item.setBtnKey(IdUtils.fastUUID());
        });
        dragTableBtnMapper.insertDragTableBtnList(dragTableBtnDefaultVo.getDragTableBtnTop().getChildren());

//        dragTableBtnDefaultVo.getDragTableBtnRight().setBtnGroupName(btnGroupName);
//        dragTableBtnDefaultVo.getDragTableBtnRight().setBtnTableKey(dragTableBtnDefaultVo.getTableKey());
//        dragTableBtnDefaultVo.getDragTableBtnRight().setBtnKey(IdUtils.fastUUID());
//        dragTableBtnMapper.insertDragTableBtn(dragTableBtnDefaultVo.getDragTableBtnRight());
//        Long rightId = dragTableBtnDefaultVo.getDragTableBtnRight().getId();
//        dragTableBtnDefaultVo.getDragTableBtnRight().getChildren().forEach(item -> {
//            item.setBtnParentId(rightId);
//            item.setBtnHasPermi(hasPermi + item.getBtnType());
//            item.setAncestorsId("0" + "," + rightId);
//            item.setBtnKey(IdUtils.fastUUID());
//        });
//        dragTableBtnMapper.insertDragTableBtnList(dragTableBtnDefaultVo.getDragTableBtnRight().getChildren());

        // 新增绑定关系
        List<DragTableBtnRelevance> dragTableBtnRelevanceList = new ArrayList<>();
        dragTableBtnRelevanceList.add(new DragTableBtnRelevance(dragTableBtnDefaultVo.getTableKey(),
            dragTableBtnDefaultVo.getDragTableBtnTop().getBtnKey()));
//        dragTableBtnRelevanceList.add(new DragTableBtnRelevance(dragTableBtnDefaultVo.getTableKey(),
//            dragTableBtnDefaultVo.getDragTableBtnRight().getBtnKey()));
        dragTableBtnRelevanceMapper.batchInsertDragTableBtnRelevance(dragTableBtnRelevanceList);

        // 初始化菜单权限 初始化菜单 返回前端初始化菜单所需数据结构
        List<Map<String, Object>> menuPermsList = new ArrayList<>();
        dragTableBtnDefaultVo.getDragTableBtnTop().getChildren().forEach(item -> {
            Map<String, Object> menuPers = new HashMap<>();
            menuPers.put("perms", item.getBtnHasPermi()); // 权限字符
            menuPers.put("menuName", item.getBtnName()); // 名称
            menuPers.put("parentId", dragTableBtnDefaultVo.getMenuID()); // 父级ID
            menuPers.put("orderNum", item.getBtnSort()); // 顺序
            menuPers.put("menuType", "F"); // 类型（M目录 C菜单 F按钮）
            menuPers.put("isFrame", "1"); // 类型（M目录 C菜单 F按钮）
            menuPers.put("isCache", "0"); // 是否缓存（0缓存 1不缓存）
            menuPers.put("visible", "0"); // 显示状态（0显示 1隐藏）
            menuPers.put("status", "0"); // 菜单状态（0正常 1停用）
            menuPermsList.add(menuPers);
        });
        return menuPermsList;
    }
}
