/*******************************************************************************
 * Copyright (c) 2010, 2015 Broadcom Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Broadcom Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.internal.events;

import java.util.Arrays;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IBuildContext;
import org.eclipse.core.runtime.Assert;

/**
 * Concrete implementation of a build context
 */
public class BuildContext implements IBuildContext {

	/** The Build Configuration currently being built */
	private final IBuildConfiguration buildConfiguration;
	/** Configurations user requested to be built */
	private final IBuildConfiguration[] requestedBuilt;
	/** The configurations built as part of this build invocations*/
	private final IBuildConfiguration[] buildOrder;

	/**
	 * Create an empty build context for the given project configuration.
	 * @param buildConfiguration the project configuration being built, that we need the context for
	 */
	public BuildContext(IBuildConfiguration buildConfiguration) {
		this.buildConfiguration = buildConfiguration;
		requestedBuilt = buildOrder = new IBuildConfiguration[] {buildConfiguration};
	}

	/**
	 * Create a build context for the given project configuration.
	 * @param buildConfiguration the project configuration being built, that we need the context for
	 * @param requestedBuilt an array of configurations the user actually requested to be built
	 * @param buildOrder the build order for the entire build, indicating how cycles etc. have been resolved
	 */
	public BuildContext(IBuildConfiguration buildConfiguration, IBuildConfiguration[] requestedBuilt, IBuildConfiguration[] buildOrder) {
		this.buildConfiguration = buildConfiguration;
		this.requestedBuilt = requestedBuilt;
		this.buildOrder = buildOrder;
	}

	private int findBuildConfigurationIndex() {
		int position = -1;
		for (int i = 0; i < buildOrder.length; i++) {
			if (buildOrder[i].equals(buildConfiguration)) {
				position = i;
				break;
			}
		}
		Assert.isTrue(0 <= position && position < buildOrder.length);
		return position;
	}

	@Override
	public IBuildConfiguration[] getRequestedConfigs() {
		return requestedBuilt.clone();
	}

	@Override
	public IBuildConfiguration[] getAllReferencedBuildConfigs() {
		int position = findBuildConfigurationIndex();
		IBuildConfiguration[] builtBefore = new IBuildConfiguration[position];
		System.arraycopy(buildOrder, 0, builtBefore, 0, builtBefore.length);
		return builtBefore;
	}

	@Override
	public IBuildConfiguration[] getAllReferencingBuildConfigs() {
		int position = findBuildConfigurationIndex();
		IBuildConfiguration[] builtAfter = new IBuildConfiguration[buildOrder.length - position - 1];
		System.arraycopy(buildOrder, position + 1, builtAfter, 0, builtAfter.length);
		return builtAfter;
	}

	private static final int hashCode(IBuildConfiguration[] array) {
		final int prime = 31;
		int result = 1;
		for (int i = 0; i < array.length; i++)
			result = prime * result + array[i].hashCode();
		return result;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + buildConfiguration.hashCode();
		result = prime * result + hashCode(requestedBuilt);
		result = prime * result + hashCode(buildOrder);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BuildContext other = (BuildContext) obj;
		if (!buildConfiguration.equals(other.buildConfiguration))
			return false;
		if (!Arrays.equals(requestedBuilt, other.requestedBuilt))
			return false;
		if (!Arrays.equals(buildOrder, other.buildOrder))
			return false;
		return true;
	}

}
