package thyyxxk.webserver.utils;

import thyyxxk.webserver.entity.targetmanagement.TargetDictTree;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 指标字典树工具类
 * @Author: hsh
 * @CreateTime: 2023-06-02  10:40
 * @Version: 1.0
 */
public class TargetDictTreeUtil {

    // 保存参与构建树形的所有数据（通常数据库查询结果）
    public List<TargetDictTree> nodeList;
    // 根节点的pid
    public static final String TREE_ROOT_PID = "B0";
    // 叶子节点示意（0: 不是叶子节点； 1：是叶子节点）
    public static final String IS_LEAF_ZERO = "0";
    public static final String IS_LEAF_ONE = "1";

    /**
     *  构造方法
     *  @param nodeList 将数据集合赋值给nodeList，即所有数据作为所有节点。
     */
    public TargetDictTreeUtil(List<TargetDictTree> nodeList, String dept){
        if(StringUtil.notBlank(dept)){
            List<TargetDictTree> treeList = new ArrayList<>();
            for(TargetDictTree tree : nodeList){
                // 叶子节点才进行判断
                if("1".equals(tree.getIsLeaf())){
                    if(dept.equals(tree.getDeptCode())){
                        treeList.add(tree);
                    }
                } else {
                    treeList.add(tree);
                }
            }
            this.nodeList = treeList;
        } else {
            this.nodeList = nodeList;
        }
    }

    /**
     *   获取需构建的所有根节点（顶级节点: TREE_ROOT_PID）
     *   @return 所有根节点List集合
     */
    public List<TargetDictTree> getRootNode(){
        // 保存所有根节点（所有根节点的数据）
        List<TargetDictTree> rootNodeList = new ArrayList<>();
        // treeNode：查询出的每一条数据（节点）
        for (TargetDictTree treeNode : nodeList){
            // 判断当前节点是否为根节点，此处注意：若pid类型是String，则要采用equals()方法判断。
            if (TREE_ROOT_PID.equals(treeNode.getPid())) {
                // 是，添加
                rootNodeList.add(treeNode);
            }
        }
        return rootNodeList;
    }

    /**
     *  根据每一个顶级节点（根节点）进行构建树形结构
     *  @return  构建整棵树
     */
    public List<TargetDictTree> buildTree(){
        // treeNodes：保存一个顶级节点所构建出来的完整树形
        List<TargetDictTree> treeNodes = new ArrayList<>();
        // getRootNode()：获取所有的根节点
        for (TargetDictTree treeRootNode : getRootNode()) {
            // 将顶级节点进行构建子树
            treeRootNode = buildChildTree(treeRootNode);
            // 完成一个顶级节点所构建的树形，增加进来
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }

    /**
     *  递归-----构建子树形结构
     *  @param  pNode 根节点（顶级节点）
     *  @return 整棵树
     */
    public TargetDictTree buildChildTree(TargetDictTree pNode) {
        List<TargetDictTree> childTree = new ArrayList<>();
        // nodeList：所有节点集合（所有数据）
        for (TargetDictTree treeNode : nodeList) {
            // 判断当前节点的父节点ID是否等于根节点的ID，即当前节点为其下的子节点
            if (treeNode.getPid().equals(pNode.getId())) {
                // 再递归进行判断当前节点的情况，调用自身方法
                TargetDictTree newTree = buildChildTree(treeNode);
                if(!newTree.getChildren().isEmpty() && IS_LEAF_ZERO.equals(newTree.getIsLeaf())){
                    childTree.add(newTree);
                } else if(newTree.getChildren().isEmpty() && IS_LEAF_ONE.equals(newTree.getIsLeaf())){
                    childTree.add(newTree);
                }
            }
        }
        // for循环结束，即节点下没有任何节点，树形构建结束，设置树结果
        pNode.setChildren(childTree);
        return pNode;
    }


}
