package com.leanwo.activiti.service.base;

import java.util.List;

import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BoundaryEvent;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.IOParameter;
import org.activiti.bpmn.model.InclusiveGateway;
import org.activiti.bpmn.model.IntermediateCatchEvent;
import org.activiti.bpmn.model.Message;
import org.activiti.bpmn.model.MessageEventDefinition;
import org.activiti.bpmn.model.ParallelGateway;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.ScriptTask;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.ServiceTask;
import org.activiti.bpmn.model.Signal;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;

public interface BpmnElementService {
	
	/**
	 * 创建 bpmn模型
	 * @param id BPMN模型id
	 * @param name 流程名称
	 * @return bpmn模型
	 */
	BpmnModel createBpmnModel(String targetNamespace);

	/**
	 * 创建流程
	 * @param id 流程id
	 * @param name 流程名称
	 * @return 流程
	 */
	Process createProcess(String id, String name);
	
	/**
	 * 创建消息
	 * @param id 消息id
	 * @param name 消息名称
	 * @return 消息
	 */
	Message createMessage(String id, String name);

	

	/**
	 * 新建信号
	 * 
	 * @param id 信号id
	 * @param name 信号名称
	 * @param scope 信号范围
	 * @return
	 */
	Signal createSignal(String id, String name, String scope);
	
	/**
	 * 新建边界事件
	 * @param id 边界事件id
	 * @param name 边界事件名称
	 * @param cancelActivity 边界事件id
	 * @return 边界事件
	 */
	BoundaryEvent createBoundaryEvent(String id, String name, boolean cancelActivity);

	/**
	 * 创建参数
	 * @param source
	 * @param sourceExpression
	 * @param target
	 * @param targetExpression
	 * @return
	 */
	IOParameter createIoParameters(String source, String sourceExpression, String target, String targetExpression);

	/**
	 * 新建事件监听
	 * @param event 事件名称 {@link org.activiti.engine.delegate.BaseExecutionListener} EVENTNAME_START, EVENTNAME_END, EVENTNAME_TAKE
	 * @param implementation 类全名
	 * @param implementationType {@link org.activiti.bpmn.model.ImplementationType} IMPLEMENTATION_TYPE_CLASS, IMPLEMENTATION_TYPE_EXPRESSION, IMPLEMENTATION_TYPE_DELEGATEEXPRESSION
	 * @return
	 */
	ActivitiListener createActivitiListener(String event, String implementation, String implementationType);

	/**
	 * 新建事件监听器集合
	 * @param activitiListener
	 * @return
	 */
	List<ActivitiListener> createActivitiListeners(ActivitiListener ... activitiListeners);
	
	/**
	 * 新建扩展字段
	 * @param fieldName 字段名称
	 * @param fieldValue 字段值
	 * @return
	 */
	FieldExtension createFieldExtension(String fieldName, String fieldValue);
	
	/**
	 * 新建扩展字段集合
	 * @param fieldExtensions
	 * @return
	 */
	List<FieldExtension> createFieldExtensions(FieldExtension... fieldExtensions);
	
	/**
	 * 创建用户任务
	 * @param id 用户任务id
	 * @param name 用户任务名称
	 * @param assignee 用户任务责任人 
	 * @return 用户任务
	 */
	UserTask createUserTask(String id, String name, String assignee);

	/**
	 * 创建用户任务
	 * @param id 用户任务id
	 * @param name 用户任务名称
	 * @param assignee 用户任务责任人
	 * @param multiInstance true:多实例, flase:单实例
	 * @param isSequential true:顺序执行, flase:并行执行
	 * @param multiInstanceCollection 多实例用户任务-类型为集合的流程变量名(审批人集合)
	 * @param multiInstanceVariable 多实例用户任务-子元素名称
	 * @param multiInstanceCompleteCondition 多实例用户任务的完成条件
	 * @return 用户任务
	 */
	UserTask createUserTask(String id, String name, String assignee, boolean multiInstance, boolean isSequential, String multiInstanceCollection, String multiInstanceVariable, String multiInstanceCompleteCondition);

	
	
	ScriptTask createScriptTask(String id, String name, String script);

	/**
	 * 创建箭头
	 * @param from
	 * @param to
	 * @param conditionExpression
	 * @return
	 */
	SequenceFlow createSequenceFlow(String id, String name,FlowNode sourceRef, FlowNode targetRef, String conditionExpression);

	/**
	 * 创建排他网关
	 * @param id id
	 * @param name 名称
	 * @param asynchronous 是否是异步的
	 * @param exclusive 排他的
	 * @return 排他网关
	 */
	ExclusiveGateway createExclusiveGateway(String id, String name, boolean asynchronous, boolean exclusive);

	/**
	 * 创建包容网关
	 * @param id
	 * @param name
	 * @param asynchronous
	 * @param exclusive
	 * @return
	 */
	InclusiveGateway createInclusiveGateway (String id, String name, boolean asynchronous, boolean exclusive);
	
	/**
	 * 创建开始节点
	 * @param startId
	 * @param name
	 * @param userTaskDocumentations
	 * @return
	 */
	StartEvent createStartEvent(String id, String name);

	/**
	 * 创建结束事件
	 * @param id 节点id
	 * @param name 界面名称
	 * @param terminateAll 终结全部流程
	 * @return
	 */
	EndEvent createEndEvent(String id, String name, boolean terminateAll);

	/**
	 * 创建并行网关
	 * @param id
	 * @param name
	 * @return
	 */
	ParallelGateway createParallelGateway(String id, String name);
	
	/**
	 * 新建中间信号捕获事件
	 * @param id
	 * @param name
	 * @return
	 */
	IntermediateCatchEvent createIntermediateCatchEvent(String id, String name);
	
	
	/**
	 * 生成服务任务节点
	 * @param id
	 * @param name
	 * @param userIds
	 * @return
	 */
	ServiceTask createServiceTask(String id, String name, Class delegateClass);

	/**
	 * 新建消息事件的定义
	 * @param id
	 * @param messageRef
	 * @return
	 */
	MessageEventDefinition createMessageEventDefinition(String id, String messageRef);

}
