package com.example.his.api.mis.service;

import com.example.his.api.db.dao.PermissionDao;
import com.example.his.api.resp.PermissionAllResp;
import com.example.his.api.resp.PermissionMenuResp;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.security.Permission;
import java.util.*;
import java.util.List;

@Service
public class PermissionService {
    @Resource
    private PermissionDao permissionDao;

    // 查询所有权限
    public ArrayList<PermissionAllResp> searchAllPermissions() {
        return permissionDao.searchAllPermissions();
    }

    public ArrayList<PermissionMenuResp> searchPermissions() {
        return deepTree(permissionDao.searchPermissions());
    }

    // 权限管理-编辑
    public int insertPermission(Map param) {
        return permissionDao.insertPermission(param);
    }

    public int updatePermission(Map param) {
        return permissionDao.updatePermission(param);
    }

    // 权限管理-批量删除
    public int deleteBatchPermission(Map param) {
        return permissionDao.deleteBatchPermission(param);
    }



    /**
     * 转换树形结构
     * @param menuList
     * @return
     */
    public ArrayList<PermissionMenuResp> deepTree(ArrayList<PermissionMenuResp> menuList) {
        //创建list集合，用于数据最终封装
        ArrayList<PermissionMenuResp> finalNode = new ArrayList<>();

        for (PermissionMenuResp menus : menuList) {
            Integer topId = 0;
            //判断Pid是否等于0  0是最高的节点 将查询出的数据放进list集合
            if (topId.equals(menus.getParentId())) {
                finalNode.add(selectTree(menus, menuList));
            }


        }
        // 递归设置节点层级
        for (PermissionMenuResp menu : finalNode) {
            setNodeLevel(menu,1);
        }

        return finalNode;
    }
    public PermissionMenuResp selectTree(PermissionMenuResp m1, ArrayList<PermissionMenuResp> menuList) {
        //因为向一层菜单里面放二层菜单，二层里面还要放三层，把对象初始化
        m1.setChildren(new ArrayList<PermissionMenuResp>());
        //遍历所有菜单list集合，进行判断比较，比较id和pid值是否相同
        for (PermissionMenuResp m2 : menuList) {
            //判断 id和pid值是否相同
            if (m1.getId().equals(m2.getParentId())) {
                //如果children为空，进行初始化操作
                if (m1.getChildren() == null) {
                    m1.setChildren(new ArrayList<PermissionMenuResp>());
                }
                //把查询出来的子菜单放到父菜单里面
                m1.getChildren().add(selectTree(m2, menuList));
            }
        }
        return m1;
    }

    // 递归设置节点层级
    public void setNodeLevel(PermissionMenuResp node, int level) {
        node.setLevel(level);
        node.setKey(node.getId());
        for (PermissionMenuResp child : node.getChildren()) {
            setNodeLevel(child, level + 1);
        }
    }






}
