package com.ruoyi.system.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.entity.DragTableBtn;
import com.ruoyi.system.entity.DragTableBtnRelevance;
import com.ruoyi.system.mapper.DragTableBtnRelevanceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.DragTableBtnMapper;
import com.ruoyi.system.service.IDragTableBtnService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 格绑定的自定义按钮Service业务层处理
 * 
 * @author ruoyi
 * @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);
        //递归处理树结构
        return rootNodes.stream().peek(
                root -> root.setChildren(getChildrenList(root, childNodes))
        ).collect(Collectors.toList());
    }

    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);
    }
}
