/*******************************************************************************
 * Copyright (c) 2008-2009 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.provisional.p2.director;

import java.util.*;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.director.*;
import org.eclipse.equinox.internal.p2.director.Explanation.IUInstalled;
import org.eclipse.equinox.internal.p2.director.Explanation.IUToInstall;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.osgi.util.NLS;

public class RequestStatus extends Status {
	public static final byte ADDED = 0;
	public static final byte REMOVED = 1;

	private byte initialRequestType;
	private IInstallableUnit iu;
	private Set<Explanation> explanation;
	private Explanation detailedExplanation;
	private Set<IInstallableUnit> conflictingRootIUs;
	private Set<IInstallableUnit> conflictingInstalledIUs;

	public RequestStatus(IInstallableUnit iu, byte initialRequesType, int severity, Set<Explanation> explanation) {
		super(severity, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.RequestStatus_message, iu));
		this.iu = iu;
		this.initialRequestType = initialRequesType;
		this.explanation = explanation;
		conflictingRootIUs = new HashSet<IInstallableUnit>();
		conflictingInstalledIUs = new HashSet<IInstallableUnit>();
		if (explanation != null) {
			Iterator<Explanation> iterator = explanation.iterator();
			Explanation o = null;
			while (iterator.hasNext() && ((o = iterator.next()) instanceof Explanation.IUToInstall)) {
				conflictingRootIUs.add(((IUToInstall) o).iu);
			}
			if (o instanceof Explanation.IUInstalled) {
				conflictingInstalledIUs.add(((IUInstalled) o).iu);
				while (iterator.hasNext() && ((o = iterator.next()) instanceof Explanation.IUInstalled)) {
					conflictingInstalledIUs.add(((IUInstalled) o).iu);
				}
			}
			detailedExplanation = o;
		}
	}

	public byte getInitialRequestType() {
		return initialRequestType;
	}

	public IInstallableUnit getIu() {
		return iu;
	}

	//Return the already installed roots with which this IU is in conflict
	//Return an empty set if there is no conflict
	public Set<IInstallableUnit> getConflictsWithInstalledRoots() {
		return conflictingRootIUs;
	}

	//Return the already installed roots with which this IU is in conflict
	//Return an empty set if there is no conflict
	public Set<IInstallableUnit> getConflictsWithAnyRoots() {
		return conflictingInstalledIUs;
	}

	//Return an explanation as to why this IU can not be resolved.
	public Set<Explanation> getExplanations() {
		//To start with, this does not have to return the most specific explanation. If it simply returns an global explanation it is good enough.
		return explanation;
	}

	public int getShortExplanation() {
		return detailedExplanation.shortAnswer();
	}

	public Explanation getExplanationDetails() {
		return detailedExplanation;
	}
}
