package com.boco.nbd.wios.flow;

import cn.hutool.core.util.StrUtil;
import com.boco.nbd.framework.common.ResponseMessage2;
import com.boco.nbd.framework.workflow.entity.SubmitTypeEnum;
import com.boco.nbd.framework.workflow.entity.exception.FlowException;
import com.boco.nbd.framework.workflow.flow.AbstractFlow;
import com.boco.nbd.framework.workflow.service.WorkflowService;
import com.boco.nbd.wios.BaseTest;
import com.boco.nbd.wios.flow.entity.FlowConstant;
import com.boco.nbd.wios.flow.entity.bo.LocalSubmitFlowBO;
import com.boco.nbd.wios.flow.entity.po.OrderPO;
import com.boco.nbd.wios.flow.enums.FlowNodeEnum;
import com.boco.nbd.wios.flow.service.IOrderService;
import com.boco.nbd.wios.flow.util.ProcessUtil;
import com.boco.nbd.wios.manage.util.NumberUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

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

/**
 * @author:cao hai
 * @date:2022/6/29 17:34
 * @version:V1.0
 * @description:ProcessTest
 * @modify:
 */
@Slf4j
public class ProcessTest extends BaseTest {

    @Autowired
    private IOrderService orderService;

    @Autowired
    protected WorkflowService flowService;


    @Test
    public void testGetRegionQo() {
        System.out.println("结果:" + orderService.getRegionQo("159,170"));
    }


    /**
     * 测试流转
     */
    @Test
    public void testSubmitFlow() {
        ResponseMessage2<Boolean> responseMessage2 = orderService.submitFlow(getStartFlow());
        Assert.assertTrue(responseMessage2.getStatus() == 0);
    }

    /**
     * 流程启动
     *
     * @return
     */
    private LocalSubmitFlowBO getStartFlow() {
        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setCurrentNode(FlowNodeEnum.NODE_START.getKey());
        bo.setNextNode(FlowNodeEnum.NODE_101.getKey());
        bo.setWorkId("CA20201204161327");
        bo.setSubmitUserId("1");
        bo.setLimitTime(new Date());
        List<String> userNames = new ArrayList<>(1);
        userNames.add("13661371987");
        bo.setUserNames(userNames);
        return bo;
    }

    /**
     * 测试启动
     */
    @Test
    public void testStartFlow() {
        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setCurrentNodeEnum(FlowNodeEnum.NODE_START);
        bo.setCurrentNode(FlowNodeEnum.NODE_START.getKey());
        bo.setNextNode(FlowNodeEnum.NODE_101.getKey());
        bo.setNextNodeEnum(FlowNodeEnum.NODE_101);
        bo.setFlowCode(FlowConstant.FLOW_CODE);
        bo.setIsFinished(false);
        bo.setSubmitType(SubmitTypeEnum.StartFlow);
        bo.setWorkId("CA" + NumberUtil.getRandomOrderId(7));
        System.out.println(bo.getWorkId());
        OrderPO orderPO = new OrderPO();
        orderPO.setId(bo.getWorkId());
        orderPO.setOemId(91);
        bo.setBusiness(orderPO);
        bo.setSubmitUserId("1");
        List<String> userNames = new ArrayList<>(1);
        userNames.add("13661371987");
        bo.setTaskParam(new HashMap<>(1));
        bo.setUserNames(userNames);
        AbstractFlow processStart = ProcessUtil.getBaseProcess(bo.getCurrentNode());
        try {
            processStart.run(bo);
        } catch (FlowException ex) {
            System.out.println(" submitFlow FlowException:" + ex.getMessage());
        } catch (Exception ex) {
            System.out.println(" submitFlow Exception:" + ex.getMessage());
        }
        Assert.assertTrue(StrUtil.isNotEmpty(bo.getProcessInsId()));
    }

    /**
     * 测试101转移
     */
    @Test
    public void test101Transfer() {
        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setCurrentNode(FlowNodeEnum.NODE_101.getKey());
        bo.setNextNode(FlowNodeEnum.NODE_101.getKey());
        bo.setSubmitUserId("13661371987");
        bo.setTaskId("6f46cc1d-f985-11ec-b696-00ff07dc8107");
        bo.setCommentMsg("测试工单转移");
        List<String> userNames = new ArrayList<>(1);
        userNames.add("13809768415");
        bo.setUserNames(userNames);
        AbstractFlow process = ProcessUtil.getBaseProcess(bo.getCurrentNode());
        process.run(bo);
        Assert.assertTrue(bo.getNextNodeEnum() != null);
    }

    /**
     * 测试101流转102
     */
    @Test
    public void test101to102() {
        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setCurrentNode(FlowNodeEnum.NODE_101.getKey());
        bo.setNextNode(FlowNodeEnum.NODE_102.getKey());
        bo.setSubmitUserId("13809768415");
        bo.setTaskId("6f46cc1d-f985-11ec-b696-00ff07dc8107");
        List<String> userNames = new ArrayList<>(1);
        userNames.add("14700000001");
        bo.setUserNames(userNames);
        AbstractFlow process = ProcessUtil.getBaseProcess(bo.getCurrentNode());
        process.run(bo);
        Assert.assertTrue(bo.getNextNodeEnum() != null);
    }

    /**
     * 测试102归档
     */
    @Test
    public void test101toEnd() {
        LocalSubmitFlowBO bo = new LocalSubmitFlowBO();
        bo.setCurrentNode(FlowNodeEnum.NODE_102.getKey());
        bo.setNextNode(FlowNodeEnum.NODE_END.getKey());
        bo.setSubmitUserId("14700000001");
        bo.setTaskId("ff4eb7b6-f988-11ec-8946-00ff07dc8107");
        AbstractFlow process = ProcessUtil.getBaseProcess(bo.getCurrentNode());
        process.run(bo);
        Assert.assertTrue(bo.getNextNodeEnum() != null);
    }
}