/*******************************************************************************
 * Copyright (c) 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.actions;

import java.io.File;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.EclipseTouchpoint;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util;
import org.eclipse.equinox.internal.provisional.frameworkadmin.Manipulator;
import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningAction;
import org.eclipse.equinox.internal.provisional.p2.metadata.IArtifactKey;
import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
import org.eclipse.osgi.util.NLS;

public class AddProgramArgumentAction extends ProvisioningAction {
	public static final String ID = "addProgramArg"; //$NON-NLS-1$

	public IStatus execute(Map parameters) {
		Manipulator manipulator = (Manipulator) parameters.get(EclipseTouchpoint.PARM_MANIPULATOR);
		String programArg = (String) parameters.get(ActionConstants.PARM_PROGRAM_ARG);
		if (programArg == null)
			return Util.createError(NLS.bind(Messages.parameter_not_set, ActionConstants.PARM_PROGRAM_ARG, ID));

		if (programArg.equals(ActionConstants.PARM_ARTIFACT)) {
			IProfile profile = (IProfile) parameters.get(ActionConstants.PARM_PROFILE);
			IInstallableUnit iu = (IInstallableUnit) parameters.get(EclipseTouchpoint.PARM_IU);

			IArtifactKey[] artifacts = iu.getArtifacts();
			if (artifacts == null || artifacts.length == 0)
				return Util.createError(NLS.bind(Messages.iu_contains_no_arifacts, iu));

			IArtifactKey artifactKey = artifacts[0];

			File fileLocation = Util.getArtifactFile(artifactKey, profile);
			if (fileLocation == null || !fileLocation.exists())
				return Util.createError(NLS.bind(Messages.artifact_file_not_found, artifactKey));
			programArg = fileLocation.getAbsolutePath();
		}

		manipulator.getLauncherData().addProgramArg(programArg);
		return Status.OK_STATUS;
	}

	public IStatus undo(Map parameters) {
		Manipulator manipulator = (Manipulator) parameters.get(EclipseTouchpoint.PARM_MANIPULATOR);
		String programArg = (String) parameters.get(ActionConstants.PARM_PROGRAM_ARG);
		if (programArg == null)
			return Util.createError(NLS.bind(Messages.parameter_not_set, ActionConstants.PARM_PROGRAM_ARG, ID));

		if (programArg.equals(ActionConstants.PARM_ARTIFACT)) {
			IProfile profile = (IProfile) parameters.get(ActionConstants.PARM_PROFILE);
			IInstallableUnit iu = (IInstallableUnit) parameters.get(EclipseTouchpoint.PARM_IU);
			IArtifactKey[] artifacts = iu.getArtifacts();
			if (artifacts == null || artifacts.length == 0)
				return Util.createError(NLS.bind(Messages.iu_contains_no_arifacts, iu));

			IArtifactKey artifactKey = artifacts[0];

			File fileLocation = Util.getArtifactFile(artifactKey, profile);
			if (fileLocation == null || !fileLocation.exists())
				return Util.createError(NLS.bind(Messages.artifact_file_not_found, artifactKey));
			programArg = fileLocation.getAbsolutePath();
		}

		manipulator.getLauncherData().removeProgramArg(programArg);
		return Status.OK_STATUS;
	}
}