/*
 * 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.sling.pipes;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.event.jobs.Job;
import org.osgi.annotation.versioning.ProviderType;

import java.util.Map;

/**
 * Plumber is an osgi service aiming to make pipes available to the sling system, in order to
 */
@ProviderType
public interface Plumber {

    String RESOURCE_TYPE = "slingPipes/plumber";

    /**
     * Instantiate a pipe from the given resource and returns it
     *
     * @param resource configuration resource
     *
     * @return pipe instantiated from the resource, null otherwise
     */
    Pipe getPipe(Resource resource);


    /**
     * Instantiate a pipe from the given resource and returns it
     *
     * @param resource      configuration resource
     * @param upperBindings already set binding we want to initiate our pipe with
     *
     * @return pipe instantiated from the resource, null otherwise
     */
    Pipe getPipe(Resource resource, PipeBindings upperBindings);


    /**
     * executes in a background thread
     *
     * @param resolver resolver used for registering the execution (id will be checked against the configuration)
     * @param path     path of the pipe to execute
     * @param bindings additional bindings to use when executing
     *
     * @return Job if registered, null otherwise
     */
    Job executeAsync(ResourceResolver resolver, String path, Map bindings);

    /**
     * executes in a background thread
     *
     * @param path     path of the pipe to execute
     * @param bindings additional bindings to use when executing
     *
     * @return Job if registered, null otherwise
     */
    Job executeAsync(String path, Map bindings);

    /**
     * Executes a pipe at a certain path
     *
     * @param resolver resource resolver with which pipe will be executed
     * @param path     path of a valid pipe configuration
     * @param bindings bindings to add to the execution of the pipe, can be null
     * @param writer   output of the pipe
     * @param save     in case that pipe writes anything, wether the plumber should save changes or not
     *
     * @return instance of <code>ExecutionResult</code>
     *
     * @throws Exception in case execution fails
     */
    ExecutionResult execute(ResourceResolver resolver, String path, Map bindings, OutputWriter writer, boolean save) throws Exception;

    /**
     * Executes a given pipe
     *
     * @param resolver resource resolver with which pipe will be executed
     * @param pipe     pipe to execute
     * @param bindings bindings to add to the execution of the pipe, can be null
     * @param writer   output of the pipe
     * @param save     in case that pipe writes anything, wether the plumber should save changes or not
     *
     * @return instance of <code>ExecutionResult</code>
     *
     * @throws Exception in case execution fails
     */
    ExecutionResult execute(ResourceResolver resolver, Pipe pipe, Map bindings, OutputWriter writer, boolean save) throws Exception;

    /**
     * Registers
     *
     * @param type      resource type of the pipe to register
     * @param pipeClass class of the pipe to register
     */
    void registerPipe(String type, Class<? extends BasePipe> pipeClass);


    /**
     * returns wether or not a pipe type is registered
     *
     * @param type resource type tested
     *
     * @return true if the type is registered, false if not
     */
    boolean isTypeRegistered(String type);

    /**
     * status of the pipe
     *
     * @param pipeResource resource corresponding to the pipe
     *
     * @return status of the pipe, can be blank, 'started' or 'finished'
     */
    String getStatus(Resource pipeResource);

    /**
     * Provides a builder helping quickly build and execute a pipe
     *
     * @param resolver resource resolver that will be used for building the pipe
     *
     * @return instance of PipeBuilder
     */
    PipeBuilder newPipe(ResourceResolver resolver);

    /**
     * returns true if the pipe is considered to be running
     *
     * @param pipeResource resource corresponding to the pipe
     *
     * @return true if still running
     */
    boolean isRunning(Resource pipeResource);

    /**
     * @return service user that has been configured for executing pipes;
     */
    Map getServiceUser();
}
