package com.ningdatech.pmapi.scheduler.task;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.StopWatch;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.pmapi.scheduler.contants.TaskContant;
import com.ningdatech.pmapi.sys.contant.RegionConst;
import com.ningdatech.pmapi.sys.model.entity.Region;
import com.ningdatech.pmapi.sys.service.IRegionService;
import com.wflow.bean.dto.WflowModelHistorysDto;
import com.wflow.bean.entity.WflowModels;
import com.wflow.workflow.bean.process.ProcessNode;
import com.wflow.workflow.service.ProcessModelService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;

/**
 * @author ZPF
 * @description
 * @since 2023/1/18 08:54
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class InitProcessTask {

    private final IRegionService regionService;

    private final ProcessModelService processModelService;

    @Scheduled(cron = "0 22 17 30 1 ?")
    public void doTask() throws UnknownHostException {
        if (TaskContant.Host.HOST_ZPF.equals(InetAddress.getLocalHost().getHostName())) {
            log.info("=========== 初始化丽水二期 系统表单和流程配置 ======== 任务开始");
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            //1.查出丽水市下的 区县 分别去初始化 表单和流程配置数据
            List<Region> regions = regionService.list(Wrappers.lambdaQuery(Region.class)
                    .eq(Region::getDeleted,Boolean.FALSE)
                    .eq(Region::getParentCode, RegionConst.LS_REGION_CODE));

            if(CollUtil.isEmpty(regions)){
                throw new BizException("丽水地区数据为空 任务结束!");
            }

//            Map<String,WflowForms> formsMap = Maps.newConcurrentMap();
//            //2.首先插入表单默认配置
//            for(Region region : regions){
//                log.info("当前初始化的是 【{}】 表单信息",region.getName());
//
//                WflowForms existsForm = formsService.getOne(Wrappers.lambdaQuery(WflowForms.class)
//                        .eq(WflowForms::getRegionCode, region.getRegionCode())
//                        .last("limit 1"));
//                if(Objects.nonNull(existsForm)){
//                    log.info("当前区域 【{}】 已经有表单数据 不需要初始化",region.getName());
//                    formsMap.put(existsForm.getRegionCode(),existsForm);
//                    continue;
//                }
//
//                WflowForms wflowForms = new WflowForms();
//                wflowForms.setFormId("fm" + IdUtil.objectId());
//                wflowForms.setCreateOn(LocalDateTime.now());
//                wflowForms.setUpdateOn(LocalDateTime.now());
//                wflowForms.setFormName(TaskContant.Wflow.DEFAULT_FORM_NAME);
//                wflowForms.setRegionCode(region.getRegionCode());
//                wflowForms.setRegionName(region.getName());
//                if(formsService.save(wflowForms)){
//                    log.info("当前区域 【{}】 表单数据已经保存成功",region.getName());
//                    formsMap.put(wflowForms.getRegionCode(),wflowForms);
//                }else{
//                    log.info("当前区域 【{}】 表单数据已经保存失败",region.getName());
//                }
//            }

            //3.接着插入流程默认配置
            for(Region region : regions){
                log.info("当前初始化的是 【{}】 流程配置",region.getName());

                if(processModelService.count(Wrappers.lambdaQuery(WflowModels.class)
                        .eq(WflowModels::getRegionCode,region.getRegionCode())) > 0){
                    log.info("当前区域 【{}】 已经有流程数据 不需要初始化",region.getName());
                    continue;
                }

//                WflowForms form = formsMap.get(region.getRegionCode());
//                if(Objects.isNull(form)){
//                    log.info("此区域 【{}】 没有对应form 不进行 流程配置初始化",region.getName());
//                    continue;
//                }

                String[] processList = TaskContant.Wflow.DEFAULT_PROCESS_LIST;
                for(String processName : processList){
                    WflowModelHistorysDto models = new WflowModelHistorysDto();
                    models.setCreated(GregorianCalendar.getInstance().getTime());
//                    models.setFormId("wf" + IdUtil.objectId());
                    models.setVersion(1);
                    models.setGroupId(1);
//                    models.setProcessDefId("pd" + IdUtil.objectId());
                    models.setFormName(processName);
                    models.setRegionCode(region.getRegionCode());
                    ProcessNode processNode = new ProcessNode();
                    models.setProcess(processNode);
                    models.setSettings("{\"sign\":false,\"admin\":[],\"notify\":{},\"commiter\":[]}");
                    models.setFormItems("[]");

                    if(StringUtils.isNotBlank(processModelService.saveProcess(models))){
                        //初始的流程在部署表也存一份，用来查询
                        if(StringUtils.isNotBlank(processModelService.deployProcess(models.getFormId()))){
                            log.info("当前区域 【{}】 流程名[{}] 流程数据已经保存成功",region.getName(),processName);
                        }else{
                            log.info("当前区域 【{}】 流程名[{}] 流程数据保存失败",region.getName(),processName);
                        }
                    }else{
                        log.info("当前区域 【{}】流程名[{}]  流程数据保存失败",region.getName(),processName);
                    }
                }
            }

            stopWatch.stop();
            log.info("=========== 初始化丽水二期 系统表单和流程配置 ======== 任务结束 {}s",stopWatch.getTotalTimeSeconds());
        }
    }
}
