/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.internal.core.search;

import java.util.ArrayList;

import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;

/**
 * Selects the indexes that correspond to projects in a given search scope
 * and that are dependent on a given focus element.
 */
public class IndexSelector {
	ICSearchScope searchScope;
	ICElement focus;
	IndexManager indexManager;
	IPath[] indexKeys; // cache of the keys for looking index up
	boolean isPolymorphicSearch;
	public IndexSelector(
		ICSearchScope searchScope,
		ICElement focus,
		boolean isPolymorphicSearch,
		IndexManager indexManager) {
		this.searchScope = searchScope;
		this.focus = focus;
		this.indexManager = indexManager;
		this.isPolymorphicSearch = isPolymorphicSearch;
	}
	/**
	 * Returns whether elements of the given project can see the given focus (an ICProject) 
	 */
	public static boolean canSeeFocus(ICElement focus, boolean isPolymorphicSearch, IPath projectPath) {
		//TODO: BOG Temp - Provide Proper Impl
		ICModel model = focus.getCModel();
		ICProject project = getCProject(projectPath, model);
		return true;
	}
	/*
	 *  Compute the list of paths which are keying index files.
	 */
	private void initializeIndexKeys() {
		
		ArrayList requiredIndexKeys = new ArrayList();
		IPath[] projects = this.searchScope.enclosingProjects();
		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		ICElement projectFocus = this.focus == null ? null : getProject(this.focus);
		for (int i = 0; i < projects.length; i++) {
			IPath location;
			IPath path = projects[i];
			if ((!root.getProject(path.lastSegment()).exists()) // if project does not exist
				&& path.segmentCount() > 1
				&& ((location = root.getFile(path).getLocation()) == null
					|| !new java.io.File(location.toOSString()).exists()) // and internal jar file does not exist
				&& !new java.io.File(path.toOSString()).exists()) { // and external jar file does not exist
					continue;
			}
			if (projectFocus == null || canSeeFocus(projectFocus, this.isPolymorphicSearch, path)) {
				if (requiredIndexKeys.indexOf(path) == -1) {
					requiredIndexKeys.add(path);
				}
			}
		}
		this.indexKeys = new IPath[requiredIndexKeys.size()];
		requiredIndexKeys.toArray(this.indexKeys);
	}
	public IIndex[] getIndexes() {
		if (this.indexKeys == null) {
			this.initializeIndexKeys(); 
		}
		// acquire the in-memory indexes on the fly
		int length = this.indexKeys.length;
		IIndex[] indexes = new IIndex[length];
		int count = 0;
		for (int i = 0; i < length; i++){
			// may trigger some index recreation work
			IIndex index = indexManager.getIndex(indexKeys[i], true /*reuse index file*/, false /*do not create if none*/);
			if (index != null) indexes[count++] = index; // only consider indexes which are ready yet
		}
		if (count != length) {
			System.arraycopy(indexes, 0, indexes=new IIndex[count], 0, count);
		}
		return indexes;
	}
	/**
	 * Returns the project that corresponds to the given path.
	 * Returns null if the path doesn't correspond to a project.
	 */
	private static ICProject getCProject(IPath path, ICModel model) {
		ICProject project = model.getCProject(path.lastSegment());
		if (project.exists()) {
			return project;
		} else {
			return null;
		}
	}
	public static ICElement getProject(ICElement element) {
		while (!(element instanceof ICProject)) {
			element = element.getParent();
		}
		return element;
	}
}
