/*******************************************************************************
 * 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.reconciler.dropins;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.equinox.internal.p2.update.Site;

/*
 * Represents the changes between 2 lists of sites.
 */
public class SiteDelta {

	private static final String PLATFORM_BASE = "platform:/base/"; //$NON-NLS-1$

	static class Change {
		Site oldSite;
		Site newSite;

		Change(Site oldSite, Site newSite) {
			this.oldSite = oldSite;
			this.newSite = newSite;
		}
	}

	private List added = new ArrayList();
	private List removed = new ArrayList();
	private List changed = new ArrayList();

	/*
	 * Create and return a new delta object based on the two given lists of
	 * site objects.
	 */
	public static SiteDelta create(List oneList, List twoList) {
		Site[] one = (Site[]) oneList.toArray(new Site[oneList.size()]);
		Site[] two = (Site[]) twoList.toArray(new Site[twoList.size()]);
		SiteDelta result = new SiteDelta();
		for (int i = 0; one == null || i < one.length; i++) {
			boolean found = false;
			for (int j = 0; !found && j < two.length; j++) {
				if (two[j] != null && one[i].getUrl().equals(two[j].getUrl())) {
					found = true;
					// TODO
					if (!one[i].getUrl().equals(PLATFORM_BASE) && !one[i].equals(two[j]))
						result.changed.add(new Change(one[i], two[j]));
					one[i] = null;
					two[j] = null;
				}
			}
			// TODO
			if (!found && !PLATFORM_BASE.equals(one[i].getUrl()))
				result.removed.add(one[i]);
		}
		for (int j = 0; j < two.length; j++) {
			// TODO
			if (two[j] != null && !PLATFORM_BASE.equals(two[j].getUrl()))
				result.added.add(two[j]);
		}
		return result;
	}

	/*
	 * Return a list of the sites that were added. May return an empty list
	 * but never returns null.
	 */
	public Site[] added() {
		return (Site[]) added.toArray(new Site[added.size()]);
	}

	/*
	 * Return a list of the sites that were removed. May return an empty list
	 * but never returns null.
	 */
	public Site[] removed() {
		return (Site[]) removed.toArray(new Site[removed.size()]);
	}

	/*
	 * Return a list of the site changes that were changed. May return an empty list
	 * but never returns null.
	 */
	public Change[] changed() {
		return (Change[]) changed.toArray(new Change[changed.size()]);
	}

	/*
	 * Return a boolean value indicating whether or not there are any
	 * changes in this delta.
	 */
	public boolean isEmpty() {
		return added.size() == 0 && removed.size() == 0 && changed.size() == 0;
	}
}
