package cn.axzo.workflow.core.service;

import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
import org.flowable.form.api.FormInfo;

import java.util.List;

public interface BpmnProcessTaskService {

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

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

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

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

    /**
     * 获取历史已审批的列表详情
     * <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 dto
     */
    void commentTask(BpmnTaskCommentDTO dto);


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

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

    void remindTask(BpmnTaskRemindDTO dto);

    String createRobotTask(BpmnRobotTaskCreateDTO dto);

    void completeRobotTask(BpmnRobotTaskCompleteDTO dto);

    String findTaskIdByInstanceIdAndPersonId(String processInstanceId, String personId);
}
