/*
 *
 *  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 flex2.tools.oem;

import flex2.compiler.util.Benchmark;
import flex2.compiler.util.PerformanceData;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

/**
 * The <code>Builder</code> interface lists the common configuration and build-cycle methods.
 * The <code>Application</code> and <code>Library</code> classes both implement this interface.
 *  
 * @see flex2.tools.oem.Application
 * @see flex2.tools.oem.Library
 * @version 2.0.1
 */
public interface Builder
{
    /**
     * Sets the compiler options for this object. You use the 
     * <code>getDefaultConfiguration()</code> method to get a <code>Configuration</code> object.
     * 
     * @see flex2.tools.oem.Configuration
     * 
     * @param configuration An instance of an object that implements the <code>Configuration</code> interface.
     */
    void setConfiguration(Configuration configuration);
    
    /**
     * Gets the default compiler options. The default values are specified in the <code>flex-config.xml</code>
     * file. You can override the default values by using methods of the <code>Configuration</code> interface.
     * 
     * <p>
     * This method returns the default compiler options in new <code>Configuration</code> objects.
     * 
     * @see flex2.tools.oem.Configuration
     * 
     * @return An instance of an object that implements the <code>Configuration</code> interface.
     */
    Configuration getDefaultConfiguration();
    
    /**
     * Gets the compiler options for this object. Unlike the <code>getDefaultConfiguration()</code> method,
     * this method returns <code>null</code> if the <code>setConfiguration()</code> method was not called.
     * 
     * @see flex2.tools.oem.Configuration
     * 
     * @return An instance of an object that implements the <code>Configuration</code> interface.
     */
    Configuration getConfiguration();


    /**
     * Gets the performance data for each compiler phase for the last build.
     *
     * @return A map of compiler phase to PerformanceData.
     */
    Map<String, PerformanceData[]> getCompilerBenchmarks();

    /**
     * Gets the overall performance data for the last build.
     *
     * @return a Benchmark object.
     */
    Benchmark getBenchmark();
    
    /**
     * Sets the logger for this object. The compiler uses the logger 
     * to notify clients of events that occurred during the compilation.
     * 
     * @see flex2.tools.oem.Logger
     * 
     * @param logger An object that implements the <code>Logger</code> interface.
     */
    void setLogger(Logger logger);
    
    /**
     * Gets the logger for this object. This method returns <code>null</code> if the <code>setLogger()</code>
     * method was not called.
     *  
     * @see flex2.tools.oem.Logger
     * 
     * @return An object that implements the <code>Logger</code> interface.
     */
    Logger getLogger();
    
    /**
     * Sets the custom file extensions for this object. For example:
     * 
     * <pre>
     * setSupportedFileExtensions(flex2.compiler.util.MimeMappings.MXML, new String[] {".foo"});
     * </pre>
     * 
     * This example instructs the compiler to treat files with the <code>*.foo</code> extension as MXML documents. 
     * The supported MIME types are specified in the <code>flex2.compiler.util.MimeMappings</code> class as constants.
     * 
     * @param mimeType MIME type.
     * @param extensions An array of file extensions.
     */
    void setSupportedFileExtensions(String mimeType, String[] extensions);

    /**
     * Sets the progress meter for this object. This method is optional.
     * You can set a progress meter so that it receives periodic updates
     * during the compilation. 
     * 
     * @see flex2.tools.oem.ProgressMeter
     * 
     * @param meter An object that implements the <code>ProgressMeter</code> interface.
     */
    void setProgressMeter(ProgressMeter meter);
    
    /**
     * Sets the path resolver for this object. This method is optional.
     *
     * @see flex2.tools.oem.PathResolver
     * 
     * @param resolver A path resolver
     */
    void setPathResolver(PathResolver resolver);

    /**
     * Sets the application cache to be shared by all the applications
     * and libraries in the current workspace.
     *
     * @param applicationCache The cache.
     */
    void setApplicationCache(ApplicationCache applicationCache);

    /**
     * Sets the library cache to be shared by all the applications and
     * libraries in the current project.
     *
     * @param libraryCache The cache.
     */
    void setSwcCache(LibraryCache libraryCache);
    
    /**
     * Builds the object. If the <code>incremental</code> input argument is <code>false</code>, 
     * this method recompiles all parts of the object. If the <code>incremental</code> 
     * input argument is <code>true</code>, 
     * this method compiles only the parts of the object that have changed since the last compilation.
     * 
     * <p>
     * You must call the <code>setOutput()</code> method before calling this method. The result is saved to the location
     * specified by the <code>getOutput()</code> method. If there is no output destination specified, this method 
     * does nothing and returns <code>0</code>.
     * 
     * @see flex2.tools.oem.Application
     * @see flex2.tools.oem.Library
     * 
     * @param incremental If <code>true</code>, build incrementally; if <code>false</code>, rebuild.
     * @return The number of bytes written out.
     * @throws IOException Thrown when an I/O error occurs during compilation.
     */
    long build(boolean incremental) throws IOException;

    /**
     * Builds the object. If the <code>incremental</code> input argument is <code>false</code>, 
     * this method recompiles all parts of the object. 
     * If the <code>incremental</code> input argument is <code>true</code>, 
     * this method compiles only the parts of the object that have changed since the last compilation.
     * 
     * <p>
     * This method only outputs to the specified <code>OutputStream</code>. For better performance, the OutputStream
     * should be buffered. This method does not output
     * to the destination specified by the <code>setOutput()</code> method.
     * 
     * @param out The <code>OutputStream</code>.
     * @param incremental If <code>true</code>, build incrementally; if <code>false</code>, rebuild.
     * @return The number of bytes written out. This method returns <code>0</code> if the object fails to compile.
     * @throws IOException Thrown when an I/O error occurs during compilation.
     */
    long build(OutputStream out, boolean incremental) throws IOException;

    /**
     * Stops the compilation. If the client runs the compiler in a background thread,
     * it can use this method to stop the compilation. The compiler does not
     * stop immediately, but stops the compilation when it reaches a
     * stable state.
     */
    void stop();

    /**
     * If you called the <code>setOutput()</code> method, this method
     * deletes the <code>Application</code> or <code>Library</code>
     * file. Calls to the <code>build()</code> method trigger a full
     * recompilation.
     * 
     * <p>
     * The <code>clean()</code> method does not remove compiler options or reset the output location.
     */
    void clean();

    /**
     * Loads compilation data from a previous compilation. This method is usually called before the <code>build()</code> method.
     * 
     * @param in The <code>InputStream</code>.
     * @throws IOException Thrown when an I/O error occurs while loading the compilation data.
     */
    void load(InputStream in) throws IOException;
    
    /**
     * Saves the current compilation data. This method is usually called after the <code>build()</code> method.
     * 
     * <p>
     * Do not use this to create a SWF or SWC file. Use the <code>build()</code> method instead.
     * 
     * @param out The <code>OutputStream</code>.
     * @return The number of bytes written out.
     * @throws IOException Thrown when an I/O error occurs while saving the compilation data.
     */
    long save(OutputStream out) throws IOException;
    
    /**
     * Reports information about the current compilation. This method returns <code>null</code>
     * if you have not yet called the <code>build(boolean)</code>, <code>build(OutputStream, boolean)</code>, or 
     * <code>compile(boolean)</code> methods.
     * 
     * <p>
     * The <code>Report</code> object includes the following information:
     * <ol>
     * <li>Number of source files used in the compilation.</li>
     * <li>The location of the source files.</li>
     * <li>Number of asset files that are embedded in the <code>Application</code> or <code>Library</code>.</li>
     * <li>The location of the asset files.</li>
     * <li>The dependencies of the source files.</li>
     * </ol>
     * <p>
     * You must call the <code>getReport()</code> method to get a new report after each 
     * call to the <code>build()</code> method.
     * 
     * @return An object that implements the <code>Report</code> interface.
     */
    Report getReport();

    File getOutput();
    
    /**
     * <code>Application.compile()</code> or <code>Library.compile()</code> did not compile anything.
     */
    int SKIP	= 0;
    
    /**
     * <code>Application.compile()</code> or <code>Library.compile()</code> did not compile but advise
     * the caller to link again.
     */
    int LINK	= Integer.MAX_VALUE;
    
    /**
     * <code>Application.compile()</code> or <code>Library.compile()</code> compiled successfully.
     */
    int OK		= 1;
    
    /**
     * <code>Application.compile()</code> or <code>Library.compile()</code> failed to compile.
     */
    int FAIL	= -1;
}
