/*******************************************************************************
 * Copyright (c) 2008, 2011 Sonatype Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Sonatype Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.tycho.packaging;

import java.io.File;
import java.io.IOException;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.codehaus.plexus.util.FileUtils;
import org.eclipse.tycho.ReactorProject;
import org.eclipse.tycho.core.ArtifactDependencyVisitor;
import org.eclipse.tycho.core.FeatureDescription;
import org.eclipse.tycho.model.FeatureRef;
import org.eclipse.tycho.model.UpdateSite;
import org.eclipse.tycho.model.UpdateSite.SiteFeatureRef;

@Mojo(name = "update-site")
public class UpdateSiteMojo extends AbstractTychoPackagingMojo {

    @Parameter(defaultValue = "${project.build.directory}/site")
    private File target;

    @Parameter(property = "project.basedir")
    private File basedir;

    @Parameter
    private boolean inlineArchives;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        target.mkdirs();
        try {
            // remove content collected in former builds.
            // Even without clean goal the build result must not assembly out dated content
            FileUtils.cleanDirectory(target);
        } catch (IOException e) {
            throw new MojoFailureException("Unable to delete old update site content: " + target.getAbsolutePath(), e);
        }
        // expandVersion();

        try {
            UpdateSite site = UpdateSite.read(new File(basedir, UpdateSite.SITE_XML));

            UpdateSiteAssembler assembler = new UpdateSiteAssembler(session, target);
            if (inlineArchives) {
                assembler.setArchives(site.getArchives());
            }

            getDependencyWalker().walk(assembler);
            getDependencyWalker().traverseUpdateSite(site, new ArtifactDependencyVisitor() {
                @Override
                public boolean visitFeature(FeatureDescription feature) {
                    FeatureRef featureRef = feature.getFeatureRef();
                    String id = featureRef.getId();
                    ReactorProject otherProject = feature.getMavenProject();
                    String version;
                    if (otherProject != null) {
                        version = otherProject.getExpandedVersion();
                    } else {
                        version = feature.getKey().getVersion();
                    }
                    String url = UpdateSiteAssembler.FEATURES_DIR + id + "_" + version + ".jar";
                    ((SiteFeatureRef) featureRef).setUrl(url);
                    featureRef.setVersion(version);
                    return false; // don't traverse included features
                }
            });

            if (inlineArchives) {
                site.removeArchives();
            }

            File file = new File(target, "site.xml");
            UpdateSite.write(site, file);

            // Copy the associate sites file, if necessary
            if (site.getAssociateSitesUrl() != null) {
                File srcAssociateSitesFile = new File(basedir, site.getAssociateSitesUrl());
                if (srcAssociateSitesFile.exists()) {
                    FileUtils.copyFile(srcAssociateSitesFile,
                            new File(target + File.separator + site.getAssociateSitesUrl()));
                }
            }
        } catch (Exception e) {
            throw new MojoExecutionException(e.getMessage(), e);
        }
    }
}
