/*******************************************************************************
 * Copyright (c) 2015 Rapicorp, 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:
 *    Rapicorp, 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.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.util.DefaultFileSet;
import org.codehaus.plexus.archiver.zip.ZipArchiver;
import org.eclipse.tycho.artifacts.TargetPlatform;
import org.eclipse.tycho.core.osgitools.DefaultReactorProject;
import org.eclipse.tycho.core.utils.TychoProjectUtils;
import org.eclipse.tycho.model.IU;

/**
 * Creates the zip for the IU and attaches it as an artifact
 */
@Mojo(name = "package-iu", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME)
public class PackageIUMojo extends AbstractTychoPackagingMojo {

    @Parameter(property = "project.build.directory", required = true, readonly = true)
    protected File outputDirectory;

    /**
     * Folder containing the files to include in the final zip.
     */
    @Parameter(property = "project.build.outputDirectory")
    private String artifactContentFolder;

    @Parameter(property = "project.basedir", required = true, readonly = true)
    private File basedir;

    @Component
    private IUXmlTransformer iuTransformer;

    @Component(role = Archiver.class, hint = "zip")
    private ZipArchiver zipArchiver;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        outputDirectory.mkdirs();

        IU iu = IU.loadIU(basedir);
        File iuXML = new File(outputDirectory, IU.SOURCE_FILE_NAME);
        try {
            addSelfCapability(iu);
            addArtifactReference(iu);
            addMavenProperties(iu);
            expandVersions(iu);
            IU.write(iu, iuXML);
        } catch (IOException e) {
            throw new MojoExecutionException("Error updating " + IU.SOURCE_FILE_NAME, e);
        }

        //Create the artifact
        File artifactForIU = createArtifact();
        project.getArtifact().setFile(artifactForIU);

    }

    private void addMavenProperties(IU iu) {
        iuTransformer.injectMavenProperties(iu, project);
    }

    private void addSelfCapability(IU iu) {
        iuTransformer.addSelfCapability(iu);
    }

    private void addArtifactReference(IU iu) {
        if (!hasPayload())
            return;
        if (hasArtifactReference(iu))
            return;
        iu.addArtifact("binary", iu.getId(), iu.getVersion());
    }

    private void expandVersions(IU iu) throws MojoFailureException {
        iuTransformer.replaceSelfQualifiers(iu, DefaultReactorProject.adapt(project).getExpandedVersion(),
                DefaultReactorProject.adapt(project).getBuildQualifier());
        iuTransformer.replaceQualifierInCapabilities(iu.getProvidedCapabilites(),
                DefaultReactorProject.adapt(project).getBuildQualifier());

        TargetPlatform targetPlatform = TychoProjectUtils.getTargetPlatformIfAvailable(project);
        if (targetPlatform == null) {
            getLog().warn(
                    "Skipping version reference expansion in p2iu project using the deprecated -Dtycho.targetPlatform configuration");
            return;
        }
        iuTransformer.replaceZerosInRequirements(iu, targetPlatform);
        iuTransformer.replaceQualifierInRequirements(iu, targetPlatform);
    }

    private boolean hasPayload() {
        return getPayloadDir().isDirectory();
    }

    private File createArtifact() throws MojoExecutionException {
        try {
            File payload = getPayloadDir();
            File newArtifact = new File(outputDirectory, project.getArtifactId() + "-" + project.getVersion() + ".zip");
            if (newArtifact.exists()) {
                newArtifact.delete();
            }

            if (hasPayload()) {
                DefaultFileSet fs = new DefaultFileSet();
                fs.setDirectory(payload);
                zipArchiver.addFileSet(fs);
                zipArchiver.setDestFile(newArtifact);
                zipArchiver.setCompress(true);
                zipArchiver.createArchive();
            } else {
                //Force create the file
                newArtifact.createNewFile();
            }
            return newArtifact;
        } catch (IOException | ArchiverException e) {
            throw new MojoExecutionException("Error assembling ZIP", e);
        }
    }

    private File getPayloadDir() {
        return new File(artifactContentFolder);
    }

    private boolean hasArtifactReference(IU iu) {
        return iu.getSelfArtifact() != null;
    }
}
