package com.zjsgfa.project.zjsgfa.service.impl;

import com.zjsgfa.common.utils.DateUtils;
import com.zjsgfa.common.utils.SecurityUtils;
import com.zjsgfa.common.utils.StringUtils;
import com.zjsgfa.project.zjsgfa.domain.BizTodoItem;
import com.zjsgfa.project.zjsgfa.service.IBizTodoItemService;
import com.zjsgfa.project.zjsgfa.service.ProcessService;
import org.activiti.engine.TaskService;
import org.apache.commons.lang3.BooleanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;

@Service
public class ProcessServiceImpl implements ProcessService {

    protected final Logger logger = LoggerFactory.getLogger(ProcessServiceImpl.class);

    @Autowired
    private TaskService taskService;

    @Autowired
    private IBizTodoItemService bizTodoItemService;

    @Override
    public void complete(String taskId, String instanceId, String itemName, String itemContent, String module, Map<String, Object> variables, HttpServletRequest request,String comment) {

        Enumeration<String> parameterNames = request.getParameterNames();
        boolean agree = true;


//            taskService.addComment(taskId, instanceId, comment);

            // 被委派人处理完成任务
            // p.s. 被委托的流程需要先 resolved 这个任务再提交。
            // 所以在 complete 之前需要先 resolved
            // resolveTask() 要在 claim() 之前，不然 act_hi_taskinst 表的 assignee 字段会为 null
            taskService.resolveTask(taskId, variables);
            // 只有签收任务，act_hi_taskinst 表的 assignee 字段才不为 null  （经过测试这里有点慢）
            taskService.claim(taskId, SecurityUtils.getUsername());
            taskService.complete(taskId, variables);//慢

            // 更新待办事项状态
            BizTodoItem query = new BizTodoItem();
            /* 2021/12/28 edit by wj 同一个节点多处理人时，task_id 是相同的，无法用来查询当前节点的其他待办，需要单独写查询条件。 start */
            // query.setTaskId(taskId);
            query.setSearchOtherTodoFlag(taskId);// 查询其他待办任务 flag 。有值时 表示：传入task_id查询当前节点的其他处理人的待办数据
            query.setOrderBy("todo_time");// 查询其他待办任务 flag 。有值时 表示：传入task_id查询当前节点的其他处理人的待办数据
            /* 2021/12/28 edit by wj 同一个节点多处理人时，task_id 是相同的，无法用来查询当前节点的其他待办，需要单独写查询条件。 end   */
            // 考虑到候选用户组，会有多个 todoitem 办理同个 task
            List<BizTodoItem> updateList = CollectionUtils.isEmpty(bizTodoItemService.selectBizTodoItemList(query)) ? null : bizTodoItemService.selectBizTodoItemList(query);
            for (BizTodoItem update: updateList) {
                if(update.getIsHandle().equals("1")){
                    continue;
                }
                // 找到当前登录用户的 todoitem，置为已办
                if (update.getTodoUserId().equals(SecurityUtils.getUsername())) {
                    update.setIsView("1");
                    update.setIsHandle("1");
                    update.setHandleUserId(SecurityUtils.getUsername());
                    update.setHandleUserName(SecurityUtils.getLoginUser().getUser().getNickName());
                    update.setHandleTime(DateUtils.getNowDate());
                    update.setComment(comment);
                    bizTodoItemService.updateBizTodoItem(update);
                } else {
                    /* 2021/12/28 edit by wj 其他处理人不删除而是置位已办。 start */
                    // bizTodoItemService.deleteBizTodoItemById(update.getId()); // 删除候选用户组其他 todoitem
                    update.setIsHandle("1");
//                    update.setHandleUserId(ShiroUtils.getLoginName());
//                    update.setHandleUserName(ShiroUtils.getSysUser().getUserName());
                    bizTodoItemService.updateBizTodoItem(update);
                    /* 2021/12/28 edit by wj 其他处理人不删除而是置位已办。 end   */
                }
            }

            // 下一节点处理人待办事项
            bizTodoItemService.insertTodoItem(instanceId, itemName, itemContent, module,null);

    }

    @Override
    public void ch(String taskId, String instanceId, String itemName, String itemContent, String completeModule, Map<String, Object> variables, HttpServletRequest request) {
        String comment = null;          // 批注
        boolean agree = true;
        try {
            // edit by wj
//            identityService.setAuthenticatedUserId(ShiroUtils.getUserId().toString());
            comment = "【撤回】";
            taskService.addComment(taskId, instanceId, comment);
            // 被委派人处理完成任务
            // p.s. 被委托的流程需要先 resolved 这个任务再提交。
            // 所以在 complete 之前需要先 resolved
            // resolveTask() 要在 claim() 之前，不然 act_hi_taskinst 表的 assignee 字段会为 null
            taskService.resolveTask(taskId, variables);
            // 只有签收任务，act_hi_taskinst 表的 assignee 字段才不为 null
            taskService.claim(taskId, SecurityUtils.getUsername());
            taskService.complete(taskId, variables);

            // 更新待办事项状态
            BizTodoItem query = new BizTodoItem();
            query.setTaskId(taskId);
            query.setInstanceId(instanceId);
            // 考虑到候选用户组，会有多个 todoitem 办理同个 task
            List<BizTodoItem> updateList = CollectionUtils.isEmpty(bizTodoItemService.selectBizTodoItemListbyinstanceId(query)) ? null : bizTodoItemService.selectBizTodoItemListbyinstanceId(query);
            for (BizTodoItem update: updateList) {
                // 找到当前登录用户的 todoitem，置为已办
                if (update.getTodoUserId().equals(SecurityUtils.getUsername())) {
                    update.setIsView("1");
                    update.setIsHandle("1");
                    update.setHandleUserId(SecurityUtils.getUsername());
                    update.setHandleUserName(SecurityUtils.getLoginUser().getUser().getNickName());
                    update.setHandleTime(DateUtils.getNowDate());
                    bizTodoItemService.updateBizTodoItem(update);
                } else {
                    if(update.getIsHandle().equals("1")){
                    }else{
                        bizTodoItemService.deleteBizTodoItemById(update.getId()); // 删除候选用户组其他 todoitem
                    }
                }
            }

            // 下一节点处理人待办事项
            bizTodoItemService.insertTodoItem(instanceId, itemName, itemContent, "system/sjdjlc",null);
        } catch (Exception e) {
            logger.error("error on complete task {}, variables={}", new Object[]{taskId, variables, e});
        }
    }
}
