package com.mossle.api.humantask;

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

import com.mossle.api.form.FormDTO;

import com.mossle.core.page.Page;

public interface HumanTaskConnector {
    /**
     * 创建任务.
     */
    HumanTaskDTO createHumanTask();

    /**
     * 删除任务.
     */
    void removeHumanTask(String humanTaskId);

    void removeHumanTaskByTaskId(String taskId);

    void removeHumanTaskByProcessInstanceId(String processInstanceId);

    /**
     * 更新任务.
     */
    HumanTaskDTO saveHumanTask(HumanTaskDTO humanTaskDto);

    HumanTaskDTO saveHumanTask(HumanTaskDTO humanTaskDto,
            boolean triggerListener);

    /**
     * 保存任务，同时处理参与者.
     */
    HumanTaskDTO saveHumanTaskAndProcess(HumanTaskDTO humanTaskDto);

    /**
     * 完成任务.
     */
    void completeTask(String humanTaskId, String userId, String action,
            String comment, Map<String, Object> taskParameters);

    /**
     * 领取任务.
     */
    void claimTask(String humanTaskId, String userId);

    /**
     * 释放任务。
     */
    void releaseTask(String humanTaskId, String comment);

    /**
     * 转发任务.
     */
    void transfer(String humanTaskId, String userId, String comment);

    /**
     * 取消转办.
     */
    void cancel(String humanTaskId, String userId, String comment);

    /**
     * 回退，指定节点，重新分配.
     */
    void rollbackActivity(String humanTaskId, String activityId, String comment);

    /**
     * 回退，指定节点，上个执行人.
     */
    void rollbackActivityLast(String humanTaskId, String activityId,
            String comment);

    /**
     * 回退，指定节点，指定执行人.
     */
    void rollbackActivityAssignee(String humanTaskId, String activityId,
            String userId, String comment);

    /**
     * 回退，上个节点，重新分配.
     */
    void rollbackPrevious(String humanTaskId, String comment);

    /**
     * 回退，上个节点，上个执行人.
     */
    void rollbackPreviousLast(String humanTaskId, String comment);

    /**
     * 回退，上个节点，指定执行人.
     */
    void rollbackPreviousAssignee(String humanTaskId, String userId,
            String comment);

    /**
     * 回退，开始事件，流程发起人.
     */
    void rollbackStart(String humanTaskId, String comment);

    /**
     * 回退，流程发起人.
     */
    void rollbackInitiator(String humanTaskId, String comment);

    /**
     * 撤销.
     */
    void withdraw(String humanTaskId, String comment);

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

    /**
     * 协办，链状.
     */
    void delegateTaskCreate(String humanTaskId, String userId, String comment);

    /**
     * 沟通.
     */
    void communicate(String humanTaskId, String userId, String comment);

    /**
     * 反馈.
     */
    void callback(String humanTaskId, String userId, String comment);

    /**
     * 跳过.
     */
    void skip(String humanTaskId, String userId, String comment);

    void saveParticipant(ParticipantDTO participantDto);

    HumanTaskDTO findHumanTaskByTaskId(String taskId);

    List<HumanTaskDTO> findHumanTasksByProcessInstanceId(
            String processInstanceId);

    HumanTaskDTO findHumanTask(String humanTaskId);

    List<HumanTaskDTO> findSubTasks(String parentTaskId);

    FormDTO findTaskForm(String humanTaskId);

    List<HumanTaskDefinition> findHumanTaskDefinitions(
            String processDefinitionId);

    void configTaskDefinitions(String businessKey,
            List<String> taskDefinitionKeys, List<String> taskAssigness);

    /** 待办任务. */
    Page findPersonalTasks(String userId, String tenantId, int pageNo,
            int pageSize);

    /** 已办任务. */
    Page findFinishedTasks(String userId, String tenantId, int pageNo,
            int pageSize);

    /** 待领任务. */
    Page findGroupTasks(String userId, String tenantId, int pageNo, int pageSize);

    /** 经手任务. */
    Page findDelegateTasks(String userId, String tenantId, int pageNo,
            int pageSize);

    long findPersonalTaskCount(String userId, String tenantId);

    long findGroupTaskCount(String userId, String tenantId);
}
