/*******************************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation 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: IBM Corporation - initial API and implementation
 ******************************************************************************/
package org.eclipse.equinox.internal.p2.touchpoint.eclipse;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.ActionFactory;
import org.eclipse.equinox.internal.provisional.frameworkadmin.FrameworkAdminRuntimeException;
import org.eclipse.equinox.internal.provisional.frameworkadmin.Manipulator;
import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException;
import org.eclipse.equinox.internal.provisional.p2.engine.*;
import org.eclipse.equinox.internal.provisional.p2.metadata.*;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.Version;

public class EclipseTouchpoint extends Touchpoint {

	private static final TouchpointType TOUCHPOINT_TYPE = MetadataFactory.createTouchpointType("org.eclipse.equinox.p2.osgi", new Version("1.0")); //$NON-NLS-1$ //$NON-NLS-2$

	// TODO: phase id constants should be defined elsewhere.
	public static final String INSTALL_PHASE_ID = "install"; //$NON-NLS-1$
	public static final String UNINSTALL_PHASE_ID = "uninstall"; //$NON-NLS-1$

	public static final String PROFILE_PROP_LAUNCHER_NAME = "eclipse.touchpoint.launcherName"; //$NON-NLS-1$
	public static final String PARM_MANIPULATOR = "manipulator"; //$NON-NLS-1$
	public static final String PARM_PLATFORM_CONFIGURATION = "platformConfiguration"; //$NON-NLS-1$
	public static final String PARM_SOURCE_BUNDLES = "sourceBundles"; //$NON-NLS-1$
	public static final String PARM_IU = "iu"; //$NON-NLS-1$
	public static final String PARM_INSTALL_FOLDER = "installFolder"; //$NON-NLS-1$

	public IStatus completePhase(IProgressMonitor monitor, IProfile profile, String phaseId, Map touchpointParameters) {
		Manipulator manipulator = (Manipulator) touchpointParameters.get(EclipseTouchpoint.PARM_MANIPULATOR);
		try {
			manipulator.save(false);
		} catch (RuntimeException e) {
			return Util.createError(Messages.error_saving_manipulator, e);
		} catch (IOException e) {
			return Util.createError(Messages.error_saving_manipulator, e);
		}

		if (INSTALL_PHASE_ID.equals(phaseId) || UNINSTALL_PHASE_ID.equals(phaseId)) {
			PlatformConfigurationWrapper configuration = (PlatformConfigurationWrapper) touchpointParameters.get(EclipseTouchpoint.PARM_PLATFORM_CONFIGURATION);
			try {
				configuration.save();
			} catch (ProvisionException pe) {
				return Util.createError(Messages.error_saving_platform_configuration, pe);
			}
		}

		SourceManipulator m = (SourceManipulator) touchpointParameters.get(EclipseTouchpoint.PARM_SOURCE_BUNDLES);
		try {
			m.save();
		} catch (IOException e) {
			return Util.createError(Messages.error_saving_source_bundles_list, e);
		}

		return Status.OK_STATUS;
	}

	private URL getConfigurationURL(IProfile profile) throws CoreException {
		File configDir = Util.getConfigurationFolder(profile);
		URL configURL = null;
		try {
			configURL = configDir.toURI().toURL();
		} catch (IllegalArgumentException e) {
			throw new CoreException(Util.createError("Configuration directory is not absolute.", e)); //$NON-NLS-1$
		} catch (MalformedURLException e) {
			throw new CoreException(Util.createError("No URL protocol handler.", e)); //$NON-NLS-1$
		}
		return configURL;
	}

	public ProvisioningAction getAction(String actionId) {
		return ActionFactory.create(actionId);
	}

	public TouchpointType getTouchpointType() {
		//TODO this data probably needs to come from the XML
		return TOUCHPOINT_TYPE;
	}

	public IStatus initializePhase(IProgressMonitor monitor, IProfile profile, String phaseId, Map touchpointParameters) {
		touchpointParameters.put(PARM_INSTALL_FOLDER, Util.getInstallFolder(profile));
		LazyManipulator manipulator = new LazyManipulator(profile);
		touchpointParameters.put(PARM_MANIPULATOR, manipulator);
		touchpointParameters.put(PARM_SOURCE_BUNDLES, new SourceManipulator(profile));
		try {
			URL configURL = getConfigurationURL(profile);
			URL poolURL = Util.getBundlePoolLocation(profile);
			touchpointParameters.put(PARM_PLATFORM_CONFIGURATION, new PlatformConfigurationWrapper(configURL, poolURL, manipulator));
		} catch (CoreException ce) {
			touchpointParameters.put(PARM_PLATFORM_CONFIGURATION, new PlatformConfigurationWrapper(null, null, null));
			return Util.createError(Messages.error_constructing_platform_configuration_url, ce);
		}
		return null;
	}

	public IStatus initializeOperand(IProfile profile, String phaseId, InstallableUnitOperand operand, Map parameters) {
		IInstallableUnit iu = (IInstallableUnit) parameters.get(PARM_IU);
		if (iu != null && Boolean.valueOf(iu.getProperty(IInstallableUnit.PROP_PARTIAL_IU)).booleanValue()) {
			IInstallableUnit preparedIU = prepareIU(iu, profile);
			if (preparedIU == null)
				return Util.createError(NLS.bind(Messages.failed_prepareIU, iu));

			parameters.put(PARM_IU, preparedIU);
		}
		return Status.OK_STATUS;
	}

	private IInstallableUnit prepareIU(IInstallableUnit iu, IProfile profile) {

		Class c = null;
		try {
			c = Class.forName("org.eclipse.equinox.internal.provisional.p2.metadata.generator.MetadataGeneratorHelper"); //$NON-NLS-1$
			if (c != null)
				c = Class.forName("org.eclipse.osgi.service.resolver.PlatformAdmin"); //$NON-NLS-1$
		} catch (ClassNotFoundException e) {
			throw new IllegalStateException(NLS.bind(Messages.generator_not_available, e.getMessage()));
		}

		if (c != null) {
			IArtifactKey[] artifacts = iu.getArtifacts();
			if (artifacts == null || artifacts.length == 0)
				return iu;

			IArtifactKey artifactKey = artifacts[0];
			if (artifactKey == null)
				return iu;

			File bundleFile = Util.getArtifactFile(artifactKey, profile);
			if (bundleFile == null) {
				LogHelper.log(Util.createError(NLS.bind(Messages.artifact_file_not_found, artifactKey.toString())));
				return null;
			}
			return MetadataGeneratorUtils.createBundleIU(artifactKey, bundleFile);
		}

		// should not occur
		throw new IllegalStateException("Unexpected state: prepareIU"); //$NON-NLS-1$
	}

	public static IStatus loadManipulator(Manipulator manipulator) {
		try {
			manipulator.load();
		} catch (IllegalStateException e) {
			return Util.createError(Messages.error_loading_manipulator);
		} catch (FrameworkAdminRuntimeException e) {
			return Util.createError(Messages.error_loading_manipulator);
		} catch (IOException e) {
			return Util.createError(Messages.error_loading_manipulator);
		}
		return Status.OK_STATUS;
	}
}
