/*******************************************************************************
 * Copyright (c) 2000, 2017 IBM 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.team.internal.core.subscribers;

import java.util.Date;

import org.eclipse.core.resources.IResource;
import org.eclipse.team.core.synchronize.SyncInfo;
import org.eclipse.team.core.synchronize.SyncInfoTree;

/**
 * A checked-in change set represents a group of resource
 * changes that were previously checked into a repository
 * as a single logical change.
 * <p>
 * A previously checked-in set of changes may not apply directly
 * to the local versions of the resources involved. However,
 * a <code>SyncInfo</code> is still used to represent each change.
 * The base and remote slots of the <code>SyncInfo</code> identify
 * the state before and after the resources were checked-in.
 * @since 3.1
 */
public abstract class CheckedInChangeSet extends ChangeSet {

	private final SyncInfoTree set = new SyncInfoTree();

	public abstract String getAuthor();

	public abstract Date getDate();

	/**
	 * Return the SyncInfoSet that contains the resources that belong to this change set.
	 * @return  the SyncInfoSet that contains the resources that belong to this change set
	 */
	public SyncInfoTree getSyncInfoSet() {
		return set;
	}

	/**
	 * Return the resources that are contained in this set.
	 * @return the resources that are contained in this set
	 */
	@Override
	public IResource[] getResources() {
		return set.getResources();
	}

	/**
	 * Return whether the set contains any files.
	 * @return whether the set contains any files
	 */
	@Override
	public boolean isEmpty() {
		return set.isEmpty();
	}

	/**
	 * Return true if the given file is included in this set.
	 * @param local a local file
	 * @return true if the given file is included in this set
	 */
	@Override
	public boolean contains(IResource local) {
		return set.getSyncInfo(local) != null;
	}

	/**
	 * Add the resource to this set if it is modified
	 * w.r.t. the subscriber.
	 * @param info
	 */
	public void add(SyncInfo info) {
		if (isValidChange(info)) {
			set.add(info);
		}
	}

	/**
	 * Return whether the given sync info is a valid change
	 * and can be included in this set. This method is used
	 * by the <code>add</code> method to filter set additions.
	 * @param info a sync info
	 * @return whether the sync info is a valid member of this set
	 */
	protected boolean isValidChange(SyncInfo info) {
		return (info != null);
	}

	/**
	 * Add the resources to this set if they are modified
	 * w.r.t. the subscriber.
	 * @param infos the resources to be added.
	 */
	public void add(SyncInfo[] infos) {
		try {
			set.beginInput();
			for (int i = 0; i < infos.length; i++) {
				SyncInfo info = infos[i];
				add(info);
			}
		} finally {
			set.endInput(null);
		}
	}

	/**
	 * Remove the resource from the set.
	 * @param resource the resource to be removed
	 */
	@Override
	public void remove(IResource resource) {
		if (contains(resource)) {
			set.remove(resource);
		}
	}

	/**
	 * Remove the resources from the set.
	 * @param resources the resources to be removed
	 */
	@Override
	public void remove(IResource[] resources) {
		for (int i = 0; i < resources.length; i++) {
			IResource resource = resources[i];
			remove(resource);
		}
	}

	/**
	 * Remove the resource and it's descendants to the given depth.
	 * @param resource the resource to be removed
	 * @param depth the depth of the removal (one of
	 * <code>IResource.DEPTH_ZERO, IResource.DEPTH_ONE, IResource.DEPTH_INFINITE)</code>
	 */
	@Override
	public void rootRemoved(IResource resource, int depth) {
		SyncInfo[] infos = set.getSyncInfos(resource, depth);
		if (infos.length > 0) {
			IResource[] resources = new IResource[infos.length];
			for (int i = 0; i < resources.length; i++) {
				resources[i] = infos[i].getLocal();
			}
			set.removeAll(resources);
		}
	}

	@Override
	public boolean containsChildren(IResource resource, int depth) {
		return set.getSyncInfos(resource, depth).length > 0;
	}
}
