package com.ningdatech.pmapi.meta.helper.impl;

import cn.hutool.core.bean.BeanUtil;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.pmapi.meta.helper.basic.AbstractTagsCache;
import com.ningdatech.pmapi.meta.model.dto.TagDTO;
import com.ningdatech.pmapi.meta.model.dto.TagTreeDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author liuxinxin
 * @date 2022/7/22 上午9:51
 * 标签树
 */
@Slf4j
@Component
public class TagsCacheImpl extends AbstractTagsCache {

    @Override
    public TagTreeDTO getTagTreeDTO(int level, String rootTagCode) {
        List<TagTreeDTO> tagTreeDtos = tagsCache.get(level + "");
        for (TagTreeDTO tagTreeDTO : tagTreeDtos) {
            if (tagTreeDTO.getTagCode().equals(rootTagCode)) {
                return tagTreeDTO;
            }
        }
        throw new BizException("rootTagCode not exist");
    }

    @Override
    public TagDTO getByTagCode(String tagCode) {
        return tagDtoMap.get(tagCode);
    }

    /**
     * 导入原专家库数据使用
     *
     * @return
     */
    @Override
    public Map<String, TagDTO> getNameTagDtoMap() {
        Map<String, TagDTO> nameTagDtoMap = new HashMap<>(1024);
        for (String key : tagDtoMap.keySet()) {
            nameTagDtoMap.put(tagDtoMap.get(key).getTagName(), tagDtoMap.get(key));
        }
        return nameTagDtoMap;
    }


    /**
     * 获取所有子节点包含当前节点
     *
     * @param code 标签编码
     * @return java.util.List<com.ningdatech.emapi.meta.entity.dto.TagTreeDTO>
     * @author WendyYang
     **/
    @Override
    public List<TagTreeDTO> listChildren(String code) {
        List<TagTreeDTO> allTree = tagsCache.get(String.valueOf(MAX_LEVEL));
        assert allTree != null;
        List<TagTreeDTO> children = getChildren(code, allTree);
        TagDTO tagDTO = tagDtoMap.get(code);
        TagTreeDTO rootNode = BeanUtil.copyProperties(tagDTO, TagTreeDTO.class);
        rootNode.setChildren(children);
        return treeToList(rootNode);
    }

    /**
     * 获取所有子节点包含当前节点的编码
     *
     * @param code 标签编码
     * @return java.util.List<com.ningdatech.emapi.meta.entity.dto.TagTreeDTO>
     * @author WendyYang
     **/
    @Override
    public List<String> listChildrenCodes(String code) {
        return CollUtils.fieldList(listChildren(code), TagTreeDTO::getTagCode);
    }

    /**
     * tree -> list
     *
     * @param tagTreeDTO 树节点
     * @return java.util.List<com.ningdatech.emapi.meta.entity.dto.TagTreeDTO>
     * @author WendyYang
     **/
    private List<TagTreeDTO> treeToList(TagTreeDTO tagTreeDTO) {
        List<TagTreeDTO> result = new ArrayList<>();
        result.add(tagTreeDTO);
        if (tagTreeDTO.getChildren() != null && tagTreeDTO.getChildren().size() > 0) {
            tagTreeDTO.getChildren().forEach(node -> {
                result.addAll(treeToList(node));
            });
        }
        return result;
    }

}
