/*
 *  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.myfaces.buildtools.maven2.plugin.javascript.jmt;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.Assembler;
import org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.AssemblerReader;
import org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.AssemblerReaderManager;
import org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.Script;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;

/**
 * Goal which assemble javascript sources into the packaging directory. An
 * optional assembler descriptor can be set to configure scripts to be merged.
 * Other scripts are simply copied to the output directory.
 * 
 * @goal compile
 * @phase compile
 * @author <a href="mailto:nicolas@apache.org">Nicolas De Loof</a>
 */
public class CompileMojo
    extends AbstractMojo
{
    /** default includes pattern */
    private static final String[] DEFAULT_INCLUDES = { "**/*.js" };

    /**
     * The maven project.
     * 
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;

    /**
     * Location of the source files.
     * 
     * @parameter default-value="${basedir}/src/main/javascript"
     */
    protected File sourceDirectory;

    /**
     * The output directory of the assembled js file.
     * 
     * @parameter default-value="${project.build.outputDirectory}"
     */
    protected File outputDirectory;

    /**
     * Exclusion pattern.
     * 
     * @parameter
     */
    private String[] excludes;

    /**
     * Inclusion pattern.
     * 
     * @parameter
     */
    private String[] includes;

    /**
     * @component
     */
    private AssemblerReaderManager assemblerReaderManager;

    /**
     * Descriptor for the strategy to assemble individual scripts sources into
     * destination.
     * 
     * @parameter default-value="src/assembler/${project.artifactId}.xml"
     */
    private File descriptor;

    /**
     * Descriptor file format (default or jsbuilder)
     * 
     * @parameter
     */
    private String descriptorFormat;

    public void execute()
        throws MojoExecutionException, MojoFailureException
    {
        outputDirectory.mkdirs();

        Set merged = assemble();

        if ( includes == null )
        {
            includes = DEFAULT_INCLUDES;
        }
        DirectoryScanner scanner = new DirectoryScanner();
        scanner.setBasedir( sourceDirectory );
        scanner.setExcludes( excludes );
        scanner.addDefaultExcludes();

        scanner.setIncludes( includes );
        scanner.scan();

        try
        {
            String[] files = scanner.getIncludedFiles();
            for ( int i = 0; i < files.length; i++ )
            {
                String file = files[i];
                if ( merged.contains( file ) )
                {
                    continue;
                }
                File source = new File( sourceDirectory, file );
                File dest = new File( outputDirectory, file );
                dest.getParentFile().mkdir();
                FileUtils.copyFile( source, dest );
            }
        }
        catch ( IOException e )
        {
            throw new MojoExecutionException( "Failed to copy source files to " + outputDirectory,
                e );
        }
    }

    /**
     * Honor the assembly rules to build merged scripts from individual ones.
     * 
     * @return a set of all script merged, to be skiped from the target
     * directory.
     * @throws MojoExecutionException
     */
    protected Set assemble()
        throws MojoExecutionException
    {
        if ( descriptor == null )
        {
            return Collections.EMPTY_SET;
        }

        if ( !descriptor.exists() )
        {
            if ( descriptor.getName().equals( project.getArtifactId() + ".xml" ) )
            {
                getLog().info( "No default assembler descriptor - just copy scripts" );
                return Collections.EMPTY_SET;
            }
            throw new MojoExecutionException( "The assembler descriptor does not exists : "
                + descriptor );
        }

        if ( descriptorFormat == null )
        {
            descriptorFormat = "default";
            if ( descriptor.getName().toLowerCase().endsWith( ".jsb" ) )
            {
                descriptorFormat = "jsbuilder";
            }
        }

        Assembler assembler;
        try
        {
            AssemblerReader reader = assemblerReaderManager.getAssemblerReader( descriptorFormat );
            assembler = reader.getAssembler( descriptor );
        }
        catch ( Exception e )
        {
            throw new MojoExecutionException( "Failed to read the assembler descriptor "
                + descriptor.getAbsolutePath(), e );
        }
        return assemble( assembler );
    }

    private Set assemble( Assembler assembler )
        throws MojoExecutionException
    {
        Set merged = new HashSet();

        DirectoryScanner scanner = new DirectoryScanner();
        scanner.setBasedir( sourceDirectory );
        scanner.setExcludes( excludes );
        scanner.addDefaultExcludes();

        for ( Iterator iterator = assembler.getScripts().iterator(); iterator.hasNext(); )
        {
            Script script = (Script) iterator.next();
            String fileName = script.getFileName();
            PrintWriter writer = null;
            try
            {
                File target = new File( outputDirectory, fileName );
                target.getParentFile().mkdirs();
                writer = new PrintWriter( target );

                List scriptOrderedIncludes = script.getIncludes();
                for ( Iterator iter = scriptOrderedIncludes.iterator(); iter.hasNext(); )
                {
                    String scriptInclude = (String) iter.next();
                    scanner.setIncludes( new String[] { scriptInclude } );
                    scanner.scan();

                    String[] files = scanner.getIncludedFiles();
                    for ( int i = 0; i < files.length; i++ )
                    {
                        String file = files[i];
                        File source = new File( sourceDirectory.getAbsolutePath() + "/" + file );
                        IOUtil.copy( new FileReader( source ), writer );
                        writer.println();
                        merged.add( file );
                    }
                }
            }
            catch ( IOException e )
            {
                throw new MojoExecutionException( "Failed to write merged file " + fileName, e );
            }
            finally
            {
                IOUtil.close( writer );
            }
        }
        return merged;
    }

    /**
     * @return the project
     */
    protected MavenProject getProject()
    {
        return project;
    }
}
