package com.mossle.spi.process;

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

import com.mossle.api.form.FormDTO;

/**
 * HumanTask就靠这个接口与activiti交互了.
 */
public interface InternalProcessConnector {
    /**
     * 找到任务对应的表单信息.
     */
    FormDTO findTaskForm(String taskId);

    /**
     * 找到一个流程定义下所有的任务定义.
     */
    List<ProcessTaskDefinition> findTaskDefinitions(String processDefinitionId);

    /**
     * 完成任务.
     */
    void completeTask(String taskId, String userId,
            Map<String, Object> variables);

    /**
     * 转发任务.
     */
    void transfer(String taskId, String assignee, String owner);

    /**
     * 撤销任务.
     */
    void withdrawTask(String taskId);

    /**
     * 回退任务
     */
    void rollback(String taskId, String activityId, String userId);

    /**
     * 回退任务，并自动分配最后的负责人.
     */
    void rollbackAuto(String taskId, String activityId);

    /**
     * 协办.
     */
    void delegateTask(String taskId, String userId);

    /**
     * 完成协办.
     */
    void resolveTask(String taskId);

    /**
     * 根据activityId找到任务定义.
     */
    ProcessTaskDefinition findTaskDefinition(String processDefinitionId,
            String taskDefintionKey, String businessKey);

    /**
     * 获得流程发起人.
     */
    String findInitiator(String processInstanceId);

    /**
     * 获得某个节点的历史负责人.
     */
    String findAssigneeByActivityId(String processInstanceId, String activityId);

    /**
     * 解析表达式.
     */
    Object executeExpression(String taskId, String expressionText);

    /**
     * 获得开始事件id.
     */
    String findInitialActivityId(String processDefinitionId);

    /**
     * 获得第一个UserTask的节点id.
     */
    String findFirstUserTaskActivityId(String processDefinitionId,
            String initiator);

    /**
     * 触发execution继续执行.
     */
    void signalExecution(String executionId);

    /**
     * 根据key找到最新的id.
     */
    String findProcessDefinitionId(String processDefinitionKey);

    /**
     * 判断是否可以撤销.
     */
    boolean checkWithdraw(String historyTaskId);

    /**
     * 触发事件.
     */
    void fireEvent(String eventType, String businessKey, String userId,
            String activityId, String activityName);
}
