package cn.axzo.workflow.core.service;

import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
import org.flowable.common.engine.impl.db.SuspensionState;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ProcessDefinition;

import java.util.List;
import java.util.Set;

public interface BpmnProcessDefinitionService {


    /**
     * 创建流程定义
     * 模型发布时，会自动调用，通常情况无需手动创建
     */
    String createProcessDefinition(Model model, byte[] bpmnBytes);

    void updateProcessDefinition(String processModelId, byte[] bpmnBytes);

    void updateProcessDefinition(String processModelId, String bpmnXml);


    /**
     * 获取活跃的流程定义分页
     */
    BpmPageResult<BpmnProcessDefinitionVO> getProcessDefinitionPage(BpmnProcessDefinitionPageDTO request);

    /**
     * 获得编号对应的 ProcessDefinition
     *
     * @param id 编号
     * @return 流程定义
     */
    BpmnProcessDefinitionVO getProcessDefinition(String id);

    /**
     * 通过部署 ID 查询是否有激活/可用的定义版本
     *
     * @param deploymentId
     * @return
     */
    Boolean hasActiveProcessDefinition(String deploymentId);

    /**
     * 获得 deploymentId 对应的 ProcessDefinition
     *
     * @param deploymentId 部署编号
     * @return 流程定义
     */
    ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId);

    /**
     * 获得流程定义标识对应的激活的流程定义
     *
     * @param key      流程定义的标识
     * @param tenantId
     * @return 流程定义
     */
    BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(String key, String tenantId);

    /**
     * 挂起/激活流程，
     * 激活：SuspensionState.ACTIVE.getStateCode()
     * 挂起：SuspensionState.SUSPENDED.getStateCode()
     * {@link SuspensionState}
     * */
    void updateProcessDefinitionSuspendedState(String processDefinitionId, Integer state);

    /**
     * 获取指定模型激活的定义 ID
     * @return 流程定义ID
     */
    String getActiveProcessDefinitionId(String tenantId, String category);

    void updateProcessDefinition(BpmnProcessDefinitionUpdateDTO dto);

    List<ProcessDefinition> getProcessDefinitionListByDeploymentIds(Set<String> deploymentIds);

    void delete(String deploymentId, Boolean cascade);
}
