package shkd.todotask;

import com.alibaba.fastjson.JSONObject;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.user.UserServiceHelper;
import kd.bos.util.StringUtils;
import kd.bos.workflow.engine.impl.persistence.entity.operationlog.OperationLogEntity;
import kd.bos.workflow.engine.msg.AbstractMessageServiceHandler;
import kd.bos.workflow.engine.msg.ctx.MessageContext;
import kd.bos.workflow.engine.msg.info.MessageInfo;
import kd.bos.workflow.engine.msg.info.ToDoInfo;
import kd.bos.workflow.service.WorkflowService;
import kd.bos.workflow.service.impl.ServiceFactory;
import shkd.utils.OAUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

import static shkd.utils.OAUtils.*;

public class todoZyTaskServiceHandler extends AbstractMessageServiceHandler {

    private static final Log logger = LogFactory.getLog(todoZyTaskServiceHandler.class);

    /**
     * 通过人员id获取人员信息
     *
     * @param userIds   人员id集合
     * @param approvers 人员信息集合
     */
    private List<DynamicObject> getApprovers(List<Long> userIds, List<DynamicObject> approvers) {

        List<Long> distinctUserIds = new ArrayList<>();
        for (Long userId : userIds) {
            if (!distinctUserIds.contains(userId)) {
                distinctUserIds.add(userId);
            }
        }

        for (Long userId : distinctUserIds) {
            DynamicObject user = BusinessDataServiceHelper.loadSingle(userId, "bos_user");
            approvers.add(user);
        }
        return approvers;
    }

    @Override
    public void createToDo(MessageContext messageContext, ToDoInfo toDoInfo) {
        System.out.println("createToDo");

        //获取流程实例ID
        Long processInstanceId = messageContext.getProcessInstanceId();
        //获取任务步骤
        Long executionId = messageContext.getExecutionId(); // 节点ID
        //获取当前任务ID
        Long taskId = messageContext.getTaskId();
        //获取单据编码
        String billNo = messageContext.getBillNo();
        //获取审批人集合
        List<DynamicObject> approvers = new ArrayList<>();
        List<Long> userIds = toDoInfo.getUserIds(); // 审批人ID集合
        List<DynamicObject> approversLists = getApprovers(userIds, approvers);
        //获取任务标题
        Map<String, Object> params = toDoInfo.getParams();
        String subjectJson = (String) params.get("subject");
        JSONObject subjectObj = JSONObject.parseObject(subjectJson);
        String title = subjectObj.getString("zh_CN");
        // 节点名称
        String executionName = "";
        DynamicObject execution = BusinessDataServiceHelper.loadSingle(executionId, "wf_execution");
        if (execution != null) {
            executionName = execution.getString("activityname");// 节点名称
        }
        //获取Url
        String url = toDoInfo.getUrl(); // 链接
        String url1 = toDoInfo.getUrl(); // pc链接
        String h5url = url + "&device=mob&ado=view";
        try {
            url = URLEncoder.encode(url, "UTF-8");
            h5url = URLEncoder.encode(h5url, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //https://newoa.dobechina.com
        String property = System.getProperty("domain.contextUrl");
        //测试环境
        if ("http://isctest.dobechina.com:8022/ierp".equals(property)) {
            url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url;
            h5url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + h5url;
        }else {
            url = "https://newoa.dobechina.com:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url;
            h5url = "https://newoa.dobechina.com:9090/seeyon/isc.do?method=ssoISC&toUrl=" + h5url;
        }


        //获取任务创建人
        Long startUserId = messageContext.getStartUserId(); // 审批实例发起人id
        DynamicObject startUser = BusinessDataServiceHelper.loadSingle(startUserId, "bos_user");
        String startNumber = "";
        String startName = "";
        if (null != startUser) {
            startNumber = startUser.getString("number");
            startName = startUser.getString("name");
//            if (!userIds.contains(startUserId)) {
//                approversLists.add(startUser);//添加发起人到审批人集合_便于后续接口调用(用户绑定接口)
//            }
        }
        //待办创建时间(格式:yyyy-MM-dd HH:mm:ss)
        Date createDate = messageContext.getCreateDate();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String createDateStr = sdf.format(createDate);


        //获取token
        String oaToken = OAUtils.getOaToken(billNo);
        if (StringUtils.isNotEmpty(oaToken)) {

//            //todo OA人员绑定接口-->迁移到主数据人员同步时
//            thirdpartyUser(approversLists, oaToken, billNo);

            HashMap<String, Object> thirdPartyMap = new HashMap<>();
            thirdPartyMap.put("oaToken", oaToken);
            thirdPartyMap.put("approversLists", approversLists);
            thirdPartyMap.put("taskId", taskId);
            thirdPartyMap.put("title", title);
            thirdPartyMap.put("startName", startName);
            thirdPartyMap.put("createDateStr", createDateStr);
            thirdPartyMap.put("url", url);
            thirdPartyMap.put("url1", url1);
            thirdPartyMap.put("billNo", billNo);
            thirdPartyMap.put("startNumber", startNumber);//发起人
//            thirdPartyMap.put("h5url", h5url);
            thirdPartyMap.put("h5url", url);

            //推送OA待办新增接口
            thirdParty(thirdPartyMap);

        }
        System.out.println("createToDo");
    }

    @Override
    public void dealToDo(MessageContext messageContext, ToDoInfo toDoInfo) {
        //select * from t_wf_operationlog where fbillno = '测试:待办推送致远(1106-1915)'
        //todo 待办推送第三方,节点审批通过或者驳回到某节点时都会进入(dealToDo)方法,代码如何判断该节点是驳回还是审批通过
        //获取当前任务ID
        Long taskId = messageContext.getTaskId();
        //获取任务步骤
//        Long executionId = messageContext.getExecutionId();
//        List<OperationLogEntity> operationLogByTaskId = ServiceFactory.getService(WorkflowService.class).getTaskService().getOperationLogByTaskId(taskId);
//        String decisionType = "";
//        if (operationLogByTaskId.size() > 0) {
//            decisionType = ServiceFactory.getService(WorkflowService.class).getTaskService().getOperationLogByTaskId(taskId).get(0).getDecisionType();
//        } else {
//            return;
//        }

        String subState = "0";
//        //驳回
//        if ("reject".equals(decisionType)) {
//            subState = "3";
//        }

        //获取流程实例ID
        Long processInstanceId = messageContext.getProcessInstanceId();

        //获取审批人集合
        List<DynamicObject> approvers = new ArrayList<>();
        List<Long> userIds = toDoInfo.getUserIds(); // 审批人ID集合
        List<DynamicObject> approversLists = getApprovers(userIds, approvers);
        for (DynamicObject approversList : approversLists) {
            String number = approversList.getString("number");
            //获取单据编码
            String billNo = messageContext.getBillNo();

            //获取token
            String oaToken = OAUtils.getOaToken(billNo);
            if (StringUtils.isNotEmpty(oaToken)) {

                HashMap<String, Object> updateStateMap = new HashMap<>();
                updateStateMap.put("oaToken", oaToken);
                updateStateMap.put("taskId", taskId + number);
                updateStateMap.put("state", "1");
                updateStateMap.put("subState", subState);
                updateStateMap.put("billNo", billNo);

                //推送OA待办变更接口
                updatePendingState(updateStateMap);

            }
        }


        System.out.println("createToDo");
        System.out.println("createToDo");
    }

    @Override
    public void deleteToDo(MessageContext messageContext, ToDoInfo toDoInfo) {

        //获取流程实例ID
        Long processInstanceId = messageContext.getProcessInstanceId();
        //获取任务步骤
        Long executionId = messageContext.getExecutionId(); // 节点ID
        //获取当前任务ID
        Long taskId = messageContext.getTaskId();

//        String decisionType = ServiceFactory.getService(WorkflowService.class).getTaskService().getOperationLogByTaskId(taskId).get(0).getDecisionType();
        String subState = "3";
//        //单据撤销
//        if("reject".equals(decisionType)){
//            subState = "2";
//        }
//        //终止流程
//        else if ("approve".equals(decisionType)) {
//            subState = "3";
//        }

        //获取审批人集合
        List<DynamicObject> approvers = new ArrayList<>();
        List<Long> userIds = toDoInfo.getUserIds(); // 审批人ID集合
        List<DynamicObject> approversLists = getApprovers(userIds, approvers);
        for (DynamicObject approversList : approversLists) {
            String number = approversList.getString("number");
            //获取单据编码
            String billNo = messageContext.getBillNo();

            //获取token
            String oaToken = OAUtils.getOaToken(billNo);
            if (StringUtils.isNotEmpty(oaToken)) {

                HashMap<String, Object> updateStateMap = new HashMap<>();
                updateStateMap.put("oaToken", oaToken);
                updateStateMap.put("taskId", taskId + number);
                updateStateMap.put("state", "1");
                updateStateMap.put("subState", subState);
                updateStateMap.put("billNo", billNo);

                //推送OA待办变更接口
                updatePendingState(updateStateMap);

            }
        }


    }

    @Override
    public void sendMessage(MessageContext messageContext, MessageInfo message) {
        logger.info("进入sendMessage方法");
        super.sendMessage(messageContext, message);
        //https://developer.kingdee.com/article/195641480978054400?productLineId=29&lang=zh-CN
        //JSONObject.parseObject(String.valueOf(message.getParams().get("messageContext")));

        Map<String, Object> params = message.getParams();

        Long userId  = UserServiceHelper.getCurrentUserId();
        DynamicObject bos_user = BusinessDataServiceHelper.loadSingle(userId, "bos_user");
//        String username = bos_user.getString("username");
        String billNo = "";
        Long taskId = 0L;
        if (params != null) {
            String messagContext = String.valueOf(params.get("messageContext"));
            JSONObject jsonObject = JSONObject.parseObject(messagContext);
            if (null != jsonObject) {
                billNo = jsonObject.getString("billNo");//获取单据编码
                taskId = jsonObject.getLong("taskId");//获取当前任务ID
            }
        }
        //消息内容
        String content = message.getContent();
        //消息时间
//        Date createDate = messageContext.getCreateDate();
//        Date createDate = new Date();
        Date createDate = message.getSendTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String createDateStr;
        if (createDate != null) {
            createDateStr = sdf.format(createDate);
        } else {
            // 获取当前日期
            Date currentDate = new Date();
            createDateStr = sdf.format(currentDate);
        }


        //获取审批人集合
        List<DynamicObject> approvers = new ArrayList<>();
        List<Long> userIds = message.getUserIds(); // 审批人ID集合
        List<DynamicObject> approversLists = getApprovers(userIds, approvers);
        //获取任务创建人 // 信息发送人  消息推送不需要创建人
//        ServiceFactory.getService(WorkflowService.class).getTaskService().getOperationLogByTaskId(taskId).get(0).getDecisionType();
//        Long startUserId = ServiceFactory.getService(WorkflowService.class).getTaskService().getOperationLogByTaskId(taskId).get(0).getOwnerId();
//        Long startUserId = message.getSenderId();
//        Long startUserId = messageContext.getStartUserId(); // 审批实例发起人id
        String startNumber = "";
        String startName = "";
//        if (null != startUserId) {
//            DynamicObject startUser = BusinessDataServiceHelper.loadSingle(startUserId, "bos_user");
//            if (null != startUser) {
//                startNumber = startUser.getString("number");
//                startName = startUser.getString("name");
//                if (!userIds.contains(startUserId)) {
//                    approversLists.add(startUser);//添加发起人到审批人集合_便于后续接口调用(用户绑定接口)
//                }
//            }
//        }
//        //获取Url
//        String url = message.getContentUrl(); // 链接
//        String url1 = message.getContentUrl(); // 链接
//        try {
//            url = URLEncoder.encode(url, "UTF-8");
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//        url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url;

        //获取Url
        String url =  message.getContentUrl(); // 链接
        String url1 =  message.getContentUrl(); // pc链接
        String h5url = url + "&device=mob&ado=view";
        try {
            url = URLEncoder.encode(url, "UTF-8");
            h5url = URLEncoder.encode(h5url, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //https://newoa.dobechina.com
        String property = System.getProperty("domain.contextUrl");
        //测试环境
        if ("http://isctest.dobechina.com:8022/ierp".equals(property)) {
            url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url;
            h5url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + h5url;
        }else {
            url = "https://newoa.dobechina.com:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url;
            h5url = "https://newoa.dobechina.com:9090/seeyon/isc.do?method=ssoISC&toUrl=" + h5url;
        }
        //获取token
        String oaToken = OAUtils.getOaToken(billNo);
        if (StringUtils.isNotEmpty(oaToken)) {

            HashMap<String, Object> thirdPartyMap = new HashMap<>();
            thirdPartyMap.put("oaToken", oaToken);
            thirdPartyMap.put("approversLists", approversLists);
            thirdPartyMap.put("taskId", taskId);
            thirdPartyMap.put("content", content);
            thirdPartyMap.put("createDateStr", createDateStr);
            thirdPartyMap.put("url", url);
            thirdPartyMap.put("url1", url1);
            thirdPartyMap.put("billNo", billNo);
            thirdPartyMap.put("startNumber", startNumber);//发起人
//            thirdPartyMap.put("h5url", h5url);
            thirdPartyMap.put("h5url", url);

            //推送OA消息新增接口
            thirdpartyMessage(thirdPartyMap);

        }


    }
}