package com.ankaibei.workFlow.common.flow.online.service;

import com.alibaba.fastjson.JSONObject;
import com.ankaibei.workFlow.common.online.model.OnlineDatasourceRelation;
import com.ankaibei.workFlow.common.online.model.OnlineTable;
import com.ankaibei.workFlow.common.online.object.ColumnData;
import com.ankaibei.workFlow.common.flow.model.FlowWorkOrder;
import com.ankaibei.workFlow.common.flow.model.FlowTaskComment;
import org.flowable.task.api.Task;

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

/**
 * 流程操作服务接口。
 *
 * @author Buzhanyi
 * @date 2022-09-25
 */
public interface FlowOnlineOperationService {

    /**
     * 保存在线表单的数据，同时启动流程。如果当前用户是第一个用户任务的Assignee，
     * 或者第一个用户任务的Assignee是流程发起人变量，该方法还会自动Take第一个任务。
     *
     * @param processDefinitionId 流程定义Id。
     * @param flowTaskComment     流程审批批注对象。
     * @param taskVariableData    流程任务的变量数据。
     * @param table               表对象。
     * @param columnDataList      表数据。
     */
    String saveNewAndStartProcess(
            String processDefinitionId,
            FlowTaskComment flowTaskComment,
            JSONObject taskVariableData,
            OnlineTable table,
            List<ColumnData> columnDataList);

    /**
     * 保存在线表单的数据，同时启动流程。如果当前用户是第一个用户任务的Assignee，
     * 或者第一个用户任务的Assignee是流程发起人变量，该方法还会自动Take第一个任务。
     *
     * @param processDefinitionId    流程定义Id。
     * @param flowTaskComment        流程审批批注对象。
     * @param taskVariableData       流程任务的变量数据。
     * @param masterTable            主表对象。
     * @param masterColumnDataList   主表数据。
     * @param slaveColumnDataListMap 关联从表数据Map。
     */
    String saveNewAndStartProcess(
            String processDefinitionId,
            FlowTaskComment flowTaskComment,
            JSONObject taskVariableData,
            OnlineTable masterTable,
            List<ColumnData> masterColumnDataList,
            Map<OnlineDatasourceRelation, List<List<ColumnData>>> slaveColumnDataListMap);

    /**
     * 保存在线表单的草稿数据，同时启动一个流程实例。
     *
     * @param processDefinitionId 流程定义Id。
     * @param tableId             在线表单主表Id。
     * @param masterData          主表数据。
     * @param slaveData           所有关联从表数据。
     * @return 流程工单对象。
     */
    FlowWorkOrder saveNewDraftAndStartProcess(
            String processDefinitionId, Long tableId, JSONObject masterData, JSONObject slaveData);

    /**
     * 保存在线表单的数据，同时Take用户任务。
     *
     * @param processInstanceId 流程实例Id。
     * @param taskId            流程任务Id。
     * @param flowTaskComment   流程审批批注对象。
     * @param taskVariableData  流程任务的变量数据。
     * @param table             表对象。
     * @param columnDataList    表数据。
     */
    void saveNewAndTakeTask(
            String processInstanceId,
            String taskId,
            FlowTaskComment flowTaskComment,
            JSONObject taskVariableData,
            OnlineTable table,
            List<ColumnData> columnDataList);

    /**
     * 保存在线表单的数据，同时Take用户任务。
     *
     * @param processInstanceId      流程实例Id。
     * @param taskId                 流程任务Id。
     * @param flowTaskComment        流程审批批注对象。
     * @param taskVariableData       流程任务的变量数据。
     * @param masterTable            主表对象。
     * @param masterColumnDataList   主表数据。
     * @param slaveColumnDataListMap 关联从表数据Map。
     */
    void saveNewAndTakeTask(
            String processInstanceId,
            String taskId,
            FlowTaskComment flowTaskComment,
            JSONObject taskVariableData,
            OnlineTable masterTable,
            List<ColumnData> masterColumnDataList,
            Map<OnlineDatasourceRelation, List<List<ColumnData>>> slaveColumnDataListMap);

    /**
     * 保存业务表数据，同时接收流程任务。
     *
     * @param task             流程任务。
     * @param flowTaskComment  流程审批批注对象。
     * @param taskVariableData 流程任务的变量数据。
     * @param masterTable      主表对象。
     * @param masterData       主表数据。
     * @param masterDataId     主表数据主键。
     * @param slaveData        从表数据。
     * @param datasourceId     在线表所属数据源Id。
     */
    void updateAndTakeTask(
            Task task,
            FlowTaskComment flowTaskComment,
            JSONObject taskVariableData,
            OnlineTable masterTable,
            JSONObject masterData,
            String masterDataId,
            JSONObject slaveData,
            Long datasourceId);
}
