package cn.axzo.workflow.core.service;

import cn.axzo.workflow.common.model.request.bpmn.task.*;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import cn.axzo.workflow.common.model.response.bpmn.task.*;
import org.flowable.form.api.FormInfo;

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

public interface BpmnProcessTaskService {

    /**
     * 待审核列表
     */
    BpmPageResult<BpmnTaskTodoPageItemVO> getTodoTaskPage(BpmnTaskPageSearchDTO dto);

    /**
     * 已完成的审批列表
     *
     * @return
     */
    BpmPageResult<BpmnTaskDonePageItemVO> getDoneTaskPage(BpmnTaskPageSearchDTO dto);

    /**
     * 同意
     */
    void approveTask(BpmnTaskAuditDTO taskAuditDTO);

    void approveTaskWithForm(BpmnTaskAuditWithFormDTO taskAuditDto);

    /**
     * 回退
     */
    void backTask(BpmnTaskBackAuditDTO taskAuditDTO);

    /**
     * 用于系统内部回退操作
     * @param taskAuditDTO 请求参数
     */
    void systemBackTask(BpmnNodeBackSystemOperateDTO taskAuditDTO);

    /**
     * 批量同意
     *
     * @param taskAuditDTOS 请求参数列表
     */
    BatchOperationResultVO batchApproveTask(List<BpmnTaskAuditDTO> taskAuditDTOS);

    /**
     * 回退到指定节点，可以回退节点选项
     * @param taskId 流程任务id
     */
    List<BpmnOptionalNodeDTO> getBackOptionalNodesByTaskId(String taskId);

    /**
     * 回退到指定节点，可以回退节点选项
     * @param processInstanceId 流程实例id
     * @param currentActivityId 当前节点定义id
     */
    List<BpmnOptionalNodeDTO> getBackOptionalNodes(String processInstanceId, String currentActivityId);

    /**
     * 驳回
     */
    void rejectTask(BpmnTaskAuditDTO taskAuditDTO);

    /**
     * 批量驳回
     *
     * @param taskAuditDTOS
     * @return
     */
    BatchOperationResultVO batchRejectTask(List<BpmnTaskAuditDTO> taskAuditDTOS);

    /**
     * 获取历史已审批的列表详情
     * <p>
     * 扁平的任务列表
     */
    List<BpmnHistoricTaskInstanceVO> getHistoricTaskListByProcessInstanceId(String processInstanceId, String tenantId);

    /**
     * 获取历史已审批的列表详情
     * <p>
     * 任务根据定义 ID 分组
     *
     * @param processInstanceId
     * @param tenantId
     * @return
     */
    List<BpmnHistoricTaskInstanceGroupVO> getHistoricTaskListGroupByProcessInstanceId(String processInstanceId,
                                                                                      String tenantId);

    /**
     * 获取实例正在审核的人列表
     * <p>
     */
    List<BpmnTaskInstanceVO> getActiveTasksByProcessInstanceId(String processInstanceId, String tenantId);


    FormInfo getTaskFormModel(String taskId, String tenantId);

    /**
     * 修改审批任务审批人[转交]
     * <p>
     * 注意:不是委派给其他人
     *
     * @param dto
     */
    void transferTask(BpmnTaskTransferDTO dto);

    /**
     * 批量转交
     *
     * @param dtos
     */
    BatchOperationResultVO batchTransferTask(List<BpmnTaskTransferDTO> dtos);

    /**
     * 评论
     *
     * @param dto
     */
    void commentTask(BpmnTaskCommentDTO dto);


    /**
     * 添加附件信息
     *
     * @param dto
     * @param assignee
     */
    void attachmentTask(BpmnTaskAttachmentDTO dto, String assignee);

    /**
     * 加签 目前加签只支持会签
     *
     * @param countersignDTO
     */
    void countersignTask(BpmnTaskCountersignDTO countersignDTO);

    void resetTaskApprovers(BpmnTaskResetApproversDTO dto);

    void remindTask(BpmnTaskRemindDTO dto);

    String createRobotTask(BpmnRobotTaskCreateDTO dto);

    void completeRobotTask(BpmnRobotTaskCompleteDTO dto);

    String findTaskIdByInstanceIdAndPersonId(String processInstanceId, String personId);

    Map<String, String> findTaskIdByInstanceIdsAndPersonId(List<String> processInstanceIds, String personId);

}
