package com.leanwo.activiti.service.base;

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

import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.runtime.Execution;

import com.leanwo.activiti.dto.BaseObjectResponse;
import com.leanwo.activiti.dto.BaseRangeResponse;
import com.leanwo.activiti.dto.BaseResponse;
import com.leanwo.activiti.dto.base.ChooseTask;
import com.leanwo.activiti.dto.base.DeploymentDto;
import com.leanwo.activiti.dto.base.Form;
import com.leanwo.activiti.dto.base.FormRequest;
import com.leanwo.activiti.dto.base.HistoricProcessInstanceInfos;
import com.leanwo.activiti.dto.base.HistoricTaskInfos;
import com.leanwo.activiti.dto.base.NeedReceiveCountQueryParam;
import com.leanwo.activiti.dto.base.PreviousUserSelectCalculateRequest;
import com.leanwo.activiti.dto.base.PreviousUserSelectCalculateResponse;
import com.leanwo.activiti.dto.base.ProcessInstanceDescription;
import com.leanwo.activiti.dto.base.TaskCountResponse;
import com.leanwo.activiti.dto.base.TaskDto;
import com.leanwo.activiti.dto.base.TaskInfo;
import com.leanwo.activiti.dto.base.TaskInfos;
import com.leanwo.activiti.dto.base.TaskQueryParam;
import com.leanwo.activiti.dto.base.TransferTaskDto;
import com.leanwo.activiti.dto.base.UserSelectCalculateRequest;
import com.leanwo.activiti.dto.base.UserSelectDefine;
import com.leanwo.activiti.dto.base.UserTaskDto;
import com.leanwo.activiti.dto.base.WorkflowInfo;
import com.leanwo.activiti.exception.ServerException;
import com.leanwo.activiti.exception.WorkflowException;

public interface WorkflowService {
	/**
	 * 启动工作流
	 * <br>
	 * 注意事项
	 * <ul>
	 * 		<li>SystemVariable.RECORD_ID</li>
	 * 		<li>SystemVariable.ACCOUNT_ID</li>
	 * </ul>
	 * @param hibernateSession Hibernate 中的 Session, session必须已经打开，且已经开启事务，在方法外需要关闭事务和session。
	 * @param windowId 窗口Id
	 * @param recordId   记录Id
	 * @param parameters  参数
	 * @throws WorkflowException
	 * @throws ServerException 
	 * @throws DocumentProcessedException 
	 * @throws DocumentProcessingException 
	 * @throws ProcessException 
	 */
	String startWorkflow(WorkflowInfo workflowInfo);
	
	
	/**
	 * 删除所有的资源
	 */
	void deleteAllDeployment();
	
	/**
	 * 删除工作流的部署
	 * @param deploymentId
	 */
	void deleteDeployment(String deploymentId);
	
	/**
	 * 同步工作流
	 * @return deploymentId 工作流部署Id
	 */
	String deploy(String fileName);

	/**
	 * 部署BPMN文件
	 * @param bpmnModel
	 * @param extraStringDatas 额外的字符串数据
	 * @return
	 */
	String deploy(BpmnModel bpmnModel, Map<String, String> extraStringDatas);
	
	
	/**
	 * 获取流程实例的数量
	 * @return
	 */
	Integer getProcessInstanceCount(String deploymentId);


	/**
	 * 查询待审批的任务
	 * @param taskQueryParam
	 * @return
	 */
	TaskInfos queryNeedApproveTaskInfo(TaskQueryParam taskQueryParam);
	
	/**
	 * 查询所有待审批的任务
	 * @param taskQueryParam
	 * @return
	 */
	TaskInfos queryAllNeedApproveTaskInfo(TaskQueryParam taskQueryParam);

	/**
	 * 查询已审批的任务信息
	 * @param taskQueryParam
	 * @return
	 */
	HistoricTaskInfos queryApprovedTask(TaskQueryParam taskQueryParam);

	/**
	 * 查询已拒绝的任务信息
	 * @param taskQueryParam
	 * @return
	 */
	HistoricTaskInfos queryNotApprovedTask(TaskQueryParam taskQueryParam);
	
	/**
	 * 查询我发起的审批
	 * @param taskQueryParam
	 * @return
	 */
	HistoricProcessInstanceInfos queryMyApplyProcessInfo(TaskQueryParam taskQueryParam);

	
	/**
	 * 查询工作流实例对应有效实例的数量
	 * @param processInstanceIds
	 * @return
	 */
	List<Long> countActiveByProcessInstanceId(List<String> processInstanceIds);
	

	/**
	 * 获取 待接收的用户任务的总数
	 * @param param
	 * @return
	 */
	Long getTaskInfoNeedReceiveCount(NeedReceiveCountQueryParam param);


	/**
	 * 获取待审批的用户任务的总数
	 * @param userId
	 * @return
	 */
	Long getTaskInfoNeedApproveCount(Long userId);

	/**
	 * 获取工作流备注
	 * @param processInstanceId
	 * @return
	 */
	ProcessInstanceDescription getProcessInstanceDescription(String processInstanceId);

	/**
	 * 挂起流程实例
	 * @param processInstanceId
	 */
	void suspendProcessInstance(String processInstanceId);

	/**
	 * 激活挂起的流程实例
	 * @param processInstanceId
	 */
	void activateProcessInstance(String processInstanceId);



	/**
	 * 获取工作流解析数据
	 * @param taskId
	 * @return
	 */
	List<UserTaskDto> listUserTask(String deploymentId);
	
	/**
	 * 添加评论
	 * @param chooseTask
	 */
	void addComment(ChooseTask chooseTask);

	/**
	 * 提交任务表单属性
	 * @param chooseTask
	 * @throws ServerException
	 */
	void setChoice(ChooseTask chooseTask);
	
	/**
	 * 查询用户已经审批的数量
	 * @param userId
	 * @return
	 */
	Long countTaskInfoApproved(Long userId);
	
	/**
	 * 查询用户发起的数量
	 * @param userId
	 * @return
	 */
	Long countTaskInfoMyApply(Long userId);
	
	/**
	 * 查询已拒绝的数量
	 * @param userId
	 * @return
	 * @author GuoZhiBo 20180917
	 */
	Long countTaskInfoRefuse(Long userId);
	
	TaskInfo getTaskInfoByProcessInstanceId(String processInstanceId,String userId);
	
	/**
	 * 根据流程实例Id查询任务的信息
	 * @param processInstanceId 流程实例Id
	 * @return
	 */
	TaskInfo getProcessInstanceIdTaskInfo(String processInstanceId);

	/**
	 * 根据TaskId查询TaskInfo
	 * @param taskId
	 * @return
	 */
	TaskInfo queryTaskInfo(String taskId);
	
	/**
	 * 获取工作流解析数据
	 * @param deploymentId
	 * @return
	 */
	UserTaskDto getUserTask(ChooseTask chooseTask) throws Exception;
	
	/**
	 * 设置流程变量名称
	 * @param processInstanceId
	 * @param variableName
	 * @param variableValue
	 */
	void setBooleanVariable(String processInstanceId, String variableName, Boolean variableValue);
	

	/**
	 * 根据流程实例Id删除流程实例
	 * 
	 * @param taskId
	 * @return
	 */
	public Boolean deleteProcessInstanceByProcessInstanceId(String processInstanceId);
	
	/**
	 * 查询所有已经部署的工作流
	 * @return
	 * @author GuoZhiBo 20200507
	 */
	List<DeploymentDto> queryDeploymentIds();
	
	/**
	 * 转批
	 * @param chooseTask
	 * @throws ServerException
	 */
	void transfer(TransferTaskDto transferTaskDto);
	
	/**
	 * 设置流程变量
	 * @param workflowInfo
	 * @author GuoZhiBo 20210324
	 */
	void setVariableModelData(WorkflowInfo workflowInfo);


	/**
	 * 计算哪些用户选择项可以执行
	 * @param userSelectCalculateRequest
	 */
	List<UserSelectDefine> calculateUserSelect(UserSelectCalculateRequest userSelectCalculateRequest);
	
	
	/**
	 * 在审批的过程中判断是否下一个节点是否需要选择用户。
	 * @param previousUserSelectCalculateRequest
	 * @return
	 */
	List<UserSelectDefine> calculatePreviousUserSelect(
			PreviousUserSelectCalculateRequest previousUserSelectCalculateRequest);

	/**
     * 
     * 在审批的过程中(用户任务)判断(选择下一个节点选择用户)是否显示。
     * @param userSelectCalculateRequest
     */
	List<PreviousUserSelectCalculateResponse> reCalculatePreviousUserSelect(
			PreviousUserSelectCalculateRequest previousUserSelectCalculateRequest);

	
	
	/**
	 * 根据任务Id获取执行流
	 * @param taskId 任务Id
	 * @return Execution  执行流
	 */
	Execution getExecution(String taskId);
	
	
	/**
	 * 根据任务Id和用户Id查询任务信息
	 * @param taskId 任务Id
	 * @param userId 用户Id
	 * @return 任务信息
	 */
	TaskInfo uniqueTaskInfoByTaskIdUserId(String taskId, String userId);


	/**
	 * 根据表单请求查询Form
	 * @param formRequest
	 * @return
	 */
	Form findForm(FormRequest formRequest);
	


	/**
	 * 根据流程实例Id获取部署Id
	 * @param processInstanceId 流程实例Id
	 * @return 部署Id
	 */
	String getDeploymentId(String processInstanceId);

    /**
     * 根据用户Id和数据记录id查询审批任务的数量 和 历史审批任务数量
     * @param userId 用户Id
     * @param recordId 数据记录id
     * @return 审批任务的数量 和 历史审批任务数量
     * @author YangZhiJie 2022-05-05
     */
	BaseObjectResponse<TaskCountResponse> countTaskByUserIdRecordId(Long userId, Long recordId);


}
