package cd.casic.ci.process.process.service.taskTemplate.impl;

import cd.casic.ci.process.dto.resp.taskTemplate.TaskTemplateResp;
import cd.casic.ci.process.process.dao.pipeline.PipTaskTemplateDao;
import cd.casic.ci.process.process.dataObject.node.PipTaskTemplate;
import cd.casic.ci.process.process.service.taskTemplate.TaskTemplateService;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

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

@Service
public class TaskTemplateServiceImpl extends ServiceImpl<PipTaskTemplateDao, PipTaskTemplate> implements TaskTemplateService {


    /**
     * 新建模板
     * @param pipelineNodeTemplateRequest 模板信息
     */
//    @Override
//    public void add(PipelineNodeTemplateParam pipelineNodeTemplateRequest) {
//        PipelineNodeTemplate pipelineNodeTemplateDTO = new PipelineNodeTemplate();
//        BeanUtil.copyProperties(pipelineNodeTemplateRequest, pipelineNodeTemplateDTO);
//        pipelineNodeTemplateDTO.init();
//        this.save(pipelineNodeTemplateDTO);
//    }
//
//    /**
//     * 编辑模板
//     * @param pipelineNodeTemplateRequest 模板信息
//     */
//    @Override
//    public void update(PipelineNodeTemplateParam pipelineNodeTemplateRequest) {
//        PipelineNodeTemplate pipelineNodeTemplateDTO = new PipelineNodeTemplate();
//        BeanUtil.copyProperties(pipelineNodeTemplateRequest, pipelineNodeTemplateDTO);
//        this.updateById(pipelineNodeTemplateDTO);
//    }

    /**
     * 删除模板
     * @param ids 模板ID集合
     */
    @Override
    public void delete(Long[] ids) {
        /*
         * 逻辑删除，0为已删，1为未删,由mybatis-plus配置处理，这里直接调用remove删除
         */
        for (Long id : ids) {
            PipTaskTemplate pipelineNodeTemplateDO = this.getById(id);
            if (pipelineNodeTemplateDO != null) {
                this.removeById(id);
            }
        }
    }

    /**
     * 获取模板列表
     * @return 列表
     */
    @Override
    public List<TaskTemplateResp> getList() {
        LambdaQueryWrapper<PipTaskTemplate> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(PipTaskTemplate::getDeleted,"0");
        List<PipTaskTemplate> pipelineNodeTemplateDOList = this.list(wrapper);
//        int size = pipelineNodeTemplateDOList.size();

        /**
         * 构建递归树
         */
        List<TaskTemplateResp> rootNode = getRootNode(pipelineNodeTemplateDOList);
        rootNode.forEach(v -> setChildren(v, pipelineNodeTemplateDOList));
        return rootNode;
    }

//    /**
//     * 模板分页查询
//     * @param request 请求数据
//     * @return 分页
//     */
//    @Override
//    public PageResult<PipelineNodeTemplate> page(PipelineNodeTemplateParam request) {
//        QueryWrapper<PipelineNodeTemplate> qw = new QueryWrapper<>();
//        qw.lambda().orderByDesc(PipelineNodeTemplate::getCreateTime);
//        /*
//         * 获取一个Page数据，并保存返回
//         */
//        return new PageResult<>(this.page(PageFactory.defaultPage(request.getPageNo(), request.getPageSize()), qw));
//    }

    /**
     * 获取根节点
     * @param pipelineNodeDTOList 节点集合
     * @return 根节点
     */
    private List<TaskTemplateResp> getRootNode(List<PipTaskTemplate> pipelineNodeDTOList) {
        List<TaskTemplateResp> ret = new ArrayList<>();
        for (PipTaskTemplate node : pipelineNodeDTOList) {
            if (node.getType() == 0) {
                TaskTemplateResp nodeParam = new TaskTemplateResp();
                BeanUtil.copyProperties(node, nodeParam);
                ret.add(nodeParam);
            }
        }
        return ret;
    }

    /**
     * 设置叶子节点
     * @param node 上级节点
     * @param pipelineNodeDTOList 节点列表
     */
    private void setChildren(TaskTemplateResp node, List<PipTaskTemplate> pipelineNodeDTOList) {
        List<TaskTemplateResp> childList = new ArrayList<>();
        pipelineNodeDTOList.forEach(v -> {
            if (node.getId().equals(v.getParentId())) {
                TaskTemplateResp nodeParam = new TaskTemplateResp();
                BeanUtil.copyProperties(v, nodeParam);
                childList.add(nodeParam);
            }
        });
        node.setChildren(childList);
    }
}
