/*
 * Copyright 2015 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 *
 *      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.kie.server.client;

import org.kie.dmn.api.core.DMNContext;
import org.kie.dmn.api.core.DMNResult;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.api.model.dmn.DMNModelInfoList;

public interface DMNServicesClient {
    
    /**
     * Returns a list of all models available in the given container
     *
     * @param containerId the container id deploying the DMN models
     * @return the list of available models in container identified by containerId. An empty list in case no model is available.
     */
    ServiceResponse<DMNModelInfoList> getModels(String containerId);

    /**
     * Evaluate all decisions for the model identified by namespace and modelName, given the context dmnContext
     *
     * @param containerId the container id deploying the DMN model
     * @param namespace namespace to identify the model to evaluate
     * @param modelName model name to identify the model to evaluate
     * @param dmnContext the context with all the input variables
     *
     * @return the result of the evaluation
     */
    ServiceResponse<DMNResult> evaluateAll(String containerId, String namespace, String modelName, DMNContext dmnContext);
    
    /**
     * Evaluate the decision identified by the given name and all dependent decisions for the model identified by namespace and modelName, given the context dmnContext
     *
     * @param containerId the container id deploying the DMN model
     * @param namespace namespace to identify the model to evaluate
     * @param modelName model name to identify the model to evaluate
     * @param decisionName the root decision to evaluate, identified
     *                     by name
     * @param dmnContext the context with all the input variables
     *
     * @return the result of the evaluation
     */
    ServiceResponse<DMNResult> evaluateDecisionByName(String containerId, String namespace, String modelName, String decisionName, DMNContext dmnContext);
    
    /**
     * Evaluate the decision identified by the given ID and all dependent decisions for the model identified by namespace and modelName, given the context dmnContext
     *
     * @param containerId the container id deploying the DMN model
     * @param namespace namespace to identify the model to evaluate
     * @param modelName model name to identify the model to evaluate
     * @param decisionId the root decision to evaluate, identified
     *                   by ID
     * @param dmnContext the context with all the input variables
     *
     * @return the result of the evaluation
     */
    ServiceResponse<DMNResult> evaluateDecisionById(String containerId, String namespace, String modelName, String decisionId, DMNContext dmnContext);
    
    /**
     * Creates a new empty DMNContext
     *
     * @return a new empty DMNContext
     */
    DMNContext newContext();

    /**
     * Convenience method to be used if the container contains only a single DMN model, to evaluate all decisions.
     * The method {@link DMNServicesClient#evaluateAllDecisions(String, String, String, DMNContext)} shall be used for containers deploying multiple DMN model.
     *
     * @param containerId the container id deploying the DMN model
     * @param dmnContext the context with all the input variables
     *
     * @return the result of the evaluation, or an error if the container contains more than a single DMN model
     */
    ServiceResponse<DMNResult> evaluateAll(String containerId, DMNContext dmnContext);

    /**
     * Evaluate the Decision Service identified by the given name, given the context
     *
     * @param containerId the container id deploying the DMN model
     * @param namespace namespace to identify the model to evaluate
     * @param modelName model name to identify the model to evaluate
     * @param decisionServiceName the Decision Service name
     * @param context the context with all the required inputs (inputData and inputDecision) required by the Decision Service
     *
     * @return the result of the evaluation
     */
    ServiceResponse<DMNResult> evaluateDecisionService(String containerId, String namespace, String modelName, String decisionServiceName, DMNContext context);

}
