package com.horizon.wf.core.rule;

import cn.hutool.http.HttpUtil;
import com.horizon.common.constant.Constants;
import com.horizon.wf.bean.WorkParaBean;
import com.horizon.wf.core.runtime.RunningData;
import com.horizon.wf.definition.pub.IFlowNode;
import com.horizon.wf.entity.db.DBTrack;
import com.horizon.wf.entity.db.DBWork;
import com.horizon.wf.entity.user.IRunUser;
import com.horizon.wf.global.StaticVarExtend;

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

/**
 * 销售   业务相关的事件触发器
 *
 */
public class SalPlanRule extends BaseRuleImpl implements IBaseRule {

    /**
     * 具体的实现,参考下面方法中的说明,所有的实现都差不多结构,
     * 只有自定义的异常处理接口实现中是没有传入 runningdata的.
     * 不同的接口 仅仅是额外传入的参数有些差异,额外的参数多数都是可以从runningdata中获取的
     * 系统为了方便接口的实现,额外传入了一些认为会用到的参数
     * @return
     */
    @Override
    public boolean executeRule() {
        // 从引擎获取到核心数据对象(如果接口没有额外传入需要的数据时,可以从此对象中获取)
        RunningData runningdata = getRunningdata();
        Map<String, String> flowVar = runningdata.getFlowVar().getAllFlowVarMap();

        //事件处理类额外传入参数
        // 1.执行事件的节点对象
        IFlowNode eventNode = (IFlowNode) getParameter(StaticVarExtend.Parameter_IFlowNode);

        // 2.当前节点对象
        IFlowNode curNode = (IFlowNode)getParameter(StaticVarExtend.Parameter_Current_IFlowNode);
        // 3.引擎调用时,传入的参数对象
        WorkParaBean paraBean = (WorkParaBean)getParameter(StaticVarExtend.Parameter_WorkParaBean);
        // Map<String, String> varMap = paraBean.getFlowVarMap();
        String action = paraBean.getActionname();
        // 4.当前实例对象
        DBWork work = (DBWork)getParameter(StaticVarExtend.Parameter_DBWork);
        // 5.当前执行人对象
        IRunUser user = (IRunUser) getParameter(StaticVarExtend.Parameter_RunUser);
        // 6.当前路径对象
        DBTrack track = (DBTrack)getParameter(StaticVarExtend.Parameter_DBTrack);
        int status = track.getFlowstatus();
        String nodeId = track.getNodeid();
        String statusName = track.getFunname();
        String nodeName = track.getNodename();
        // 7.需要保存的SQL数据如果需要引擎来保存,请放入此 map中(key=SQL,value=List为SQL中对应的参数)
        Map<String, List<Object>> dataMap = (Map<String, List<Object>>) getParameter(StaticVarExtend.Parameter_SaveMap);
        // 8.事件类型
        String eventType = (String)getParameter("eventType");
        // 9.事件实际执行内容
        // 10.返回 true 表示执行成功,引擎从第7步中的dataMap里获取需要保存的数据,引擎继续往下执行,
        // 返回 false表示执行失败, 引擎会根据事件类型,确定是否继续往下执行

        System.err.println(
                ",status:" + status +
                ",nodeId:" + nodeId +
                ",nodeName:" + nodeName +
                ",statusName:" + statusName +
                ",action:" + action +
                ",eventNodeId:" + eventNode.getNodeid() +
                ",eventNodeName:" + eventNode.getNodename());

         if(eventNode.getNodeid().contains("End")){
             status = 170;
         }else if(eventNode.getNodeid().equals("Node1")){
             if(statusName.equals("JumpReject") || statusName.equals("Reject")){
                 status = 130;
             }else if(statusName.equals("Getback")){
                 status = 190;
             }else if(statusName.equals("autofirst")){
                 status = 110;
             }
        }else {
             status = 110;
         }

         // 业务使用
        // flowVar就是业务传递过来的参数集
        // 获取这里面的变量需要在流程中配置——流程建模时，右键——**属性设置——流程变量——添加变量——要不然获取不到变量
        final String url = Constants.WF_PRE_URL + "/sal/PlanHead/horizonAcceptSubmit";
        System.err.println(flowVar.toString());
        String id = flowVar.get("id");
        final Map<String, Object> params = new HashMap<>();
        System.err.println(url);
        params.put("id", id);
        params.put("processInstanceStatus", status);
        Constants.EXECUTOR_SERVICE.submit(new Runnable() {
            @Override
            public void run() {
                // final url params
                String result = HttpUtil.post(url, params);
                System.err.println("result:" + result);
            }
        });
//        String result = HttpUtil.post(url, params);
//        System.err.println("result:" + result);
        return true;
    }
}


