
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.dolphinscheduler.api.service;

import org.apache.dolphinscheduler.api.dto.DynamicSubWorkflowDto;
import org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceQueryRequest;
import org.apache.dolphinscheduler.api.utils.PageInfo;
import org.apache.dolphinscheduler.api.utils.Result;
import org.apache.dolphinscheduler.common.enums.WorkflowExecutionStatus;
import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.plugin.task.api.enums.DependResult;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * process instance service
 */

public interface ProcessInstanceService {

    /**
     * return top n SUCCESS process instance order by running time which started between startTime and endTime
     */
    Map<String, Object> queryTopNLongestRunningProcessInstance(User loginUser,
                                                               long projectCode,
                                                               int size,
                                                               String startTime,
                                                               String endTime);

    /**
     * query process instance by id
     *
     * @param loginUser   login user
     * @param projectCode project code
     * @param processId   process instance id
     * @return process instance detail
     */
    Map<String, Object> queryProcessInstanceById(User loginUser,
                                                 long projectCode,
                                                 Integer processId);

    ProcessInstance queryByWorkflowInstanceIdThrowExceptionIfNotFound(Integer processId);

    /**
     * query process instance by id
     *
     * @param loginUser login user
     * @param processId process instance id
     * @return process instance detail
     */
    Map<String, Object> queryProcessInstanceById(User loginUser,
                                                 Integer processId);

    /**
     * paging query process instance list, filtering according to project, process definition, time range, keyword, process status
     *
     * @param loginUser         login user
     * @param projectCode       project code
     * @param pageNo            page number
     * @param pageSize          page size
     * @param processDefineCode process definition code
     * @param searchVal         search value
     * @param stateType         state type
     * @param host              host
     * @param startDate         start time
     * @param endDate           end time
     * @param otherParamsJson   otherParamsJson handle other params
     * @return process instance list
     */
    Result<PageInfo<ProcessInstance>> queryProcessInstanceList(User loginUser,
                                                               long projectCode,
                                                               long processDefineCode,
                                                               String startDate,
                                                               String endDate,
                                                               String searchVal,
                                                               String executorName,
                                                               WorkflowExecutionStatus stateType,
                                                               String host,
                                                               String otherParamsJson,
                                                               Integer pageNo,
                                                               Integer pageSize);

    /**
     * paging query process instance list, filtering according to project, process definition, time range, keyword, process status
     *
     * @param loginUser                    login user
     * @param workflowInstanceQueryRequest workflowInstanceQueryRequest
     * @return process instance list
     */
    Result queryProcessInstanceList(User loginUser,
                                    WorkflowInstanceQueryRequest workflowInstanceQueryRequest);

    /**
     * query task list by process instance id
     *
     * @param loginUser   login user
     * @param projectCode project code
     * @param processId   process instance id
     * @return task list for the process instance
     * @throws IOException io exception
     */
    Map<String, Object> queryTaskListByProcessId(User loginUser,
                                                 long projectCode,
                                                 Integer processId) throws IOException;

    Map<String, DependResult> parseLogForDependentResult(String log) throws IOException;

    /**
     * query sub process instance detail info by task id
     *
     * @param loginUser   login user
     * @param projectCode project code
     * @param taskId      task id
     * @return sub process instance detail
     */
    Map<String, Object> querySubProcessInstanceByTaskId(User loginUser,
                                                        long projectCode,
                                                        Integer taskId);

    List<DynamicSubWorkflowDto> queryDynamicSubWorkflowInstances(User loginUser,
                                                                 Integer taskId);

    /**
     * update process instance
     *
     * @param loginUser          login user
     * @param projectCode        project code
     * @param taskRelationJson   process task relation json
     * @param taskDefinitionJson taskDefinitionJson
     * @param processInstanceId  process instance id
     * @param scheduleTime       schedule time
     * @param syncDefine         sync define
     * @param globalParams       global params
     * @param locations          locations for nodes
     * @param timeout            timeout
     * @return update result code
     */
    Map<String, Object> updateProcessInstance(User loginUser,
                                              long projectCode,
                                              Integer processInstanceId,
                                              String taskRelationJson,
                                              String taskDefinitionJson,
                                              String scheduleTime,
                                              Boolean syncDefine,
                                              String globalParams,
                                              String locations,
                                              int timeout);

    /**
     * query parent process instance detail info by sub process instance id
     *
     * @param loginUser   login user
     * @param projectCode project code
     * @param subId       sub process id
     * @return parent instance detail
     */
    Map<String, Object> queryParentInstanceBySubId(User loginUser,
                                                   long projectCode,
                                                   Integer subId);

    /**
     * delete process instance by id, at the same time，delete task instance and their mapping relation data
     *
     * @param loginUser         login user
     * @param processInstanceId process instance id
     * @return delete result code
     */
    void deleteProcessInstanceById(User loginUser,
                                   Integer processInstanceId);

    /**
     * view process instance variables
     *
     * @param projectCode       project code
     * @param processInstanceId process instance id
     * @return variables data
     */
    Map<String, Object> viewVariables(long projectCode, Integer processInstanceId);

    /**
     * encapsulation gantt structure
     *
     * @param projectCode       project code
     * @param processInstanceId process instance id
     * @return gantt tree data
     * @throws Exception exception when json parse
     */
    Map<String, Object> viewGantt(long projectCode, Integer processInstanceId) throws Exception;

    /**
     * query process instance by processDefinitionCode and stateArray
     *
     * @param processDefinitionCode processDefinitionCode
     * @param states                states array
     * @return process instance list
     */
    List<ProcessInstance> queryByProcessDefineCodeAndStatus(Long processDefinitionCode,
                                                            int[] states);

    /**
     * query process instance by processDefinitionCode and stateArray
     *
     * @param workflowDefinitionCode    workflowDefinitionCode
     * @param workflowDefinitionVersion workflowDefinitionVersion
     * @param states                    states array
     * @return process instance list
     */
    List<ProcessInstance> queryByWorkflowCodeVersionStatus(Long workflowDefinitionCode,
                                                           int workflowDefinitionVersion,
                                                           int[] states);

    /**
     * query process instance by processDefinitionCode
     *
     * @param processDefinitionCode processDefinitionCode
     * @param size                  size
     * @return process instance list
     */
    List<ProcessInstance> queryByProcessDefineCode(Long processDefinitionCode,
                                                   int size);

    /**
     * query process instance list bt trigger code
     *
     * @param loginUser
     * @param projectCode
     * @param triggerCode
     * @return
     */
    Map<String, Object> queryByTriggerCode(User loginUser, long projectCode, Long triggerCode);

    void deleteProcessInstanceByWorkflowDefinitionCode(long workflowDefinitionCode);

    void deleteProcessInstanceById(int workflowInstanceId);

}
