/*******************************************************************************
 *  Copyright (c) 2010  Oracle. 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: 
 *  	Oracle - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.common.core.internal.resource;

import static org.eclipse.jst.common.project.facet.core.internal.FacetedProjectFrameworkJavaPlugin.log;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.expressions.EvaluationResult;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jpt.common.core.JptCommonCorePlugin;
import org.eclipse.jpt.common.core.internal.XPointUtil;
import org.eclipse.jpt.common.core.resource.ResourceLocator;
import org.eclipse.jpt.common.utility.internal.StringTools;

public class ResourceLocatorConfig 
		implements Comparable<ResourceLocatorConfig> {
	
	public static final String PROJECT_ENABLEMENT_VARIABLE = "project";  //$NON-NLS-1$
	
	private String id;
	private String pluginId;
	private String className;
	private Priority priority;
	private Expression enablementCondition;
	
	
	ResourceLocatorConfig() {
		super();
	}
	
	
	public String getId() {
		return this.id;
	}
	
	void setId(String id) {
		this.id = id;
	}
	
	public String getPluginId() {
		return this.pluginId;
	}
	
	void setPluginId(String pluginId) {
		this.pluginId = pluginId;
	}
	
	public String getClassName() {
		return this.className;
	}
	
	void setClassName(String className) {
		this.className = className;
	}
	
	public Priority getPriority() {
		return this.priority;
	}
	
	void setPriority(Priority priority) {
		this.priority = priority;
	}
	
	public Expression getEnablementCondition() {
		return this.enablementCondition;
	}
	
	void setEnablementCondition(Expression enablementCondition) {
		this.enablementCondition = enablementCondition;
	}
	
	public ResourceLocator getResourceLocator() {
		return XPointUtil.instantiate(
				JptCommonCorePlugin.PLUGIN_ID, ResourceLocatorManager.QUALIFIED_EXTENSION_POINT_ID, 
				this.className, ResourceLocator.class);
	}
	
	public boolean isEnabledFor(IProject project) {
		EvaluationContext evalContext = new EvaluationContext(null, project);
		evalContext.setAllowPluginActivation(true);
		evalContext.addVariable(PROJECT_ENABLEMENT_VARIABLE, project);
		
		if (this.enablementCondition != null) {
			try {
				EvaluationResult evalResult = this.enablementCondition.evaluate(evalContext);
				
				if (evalResult == EvaluationResult.FALSE) {
					return false;
				}
			}
			catch (CoreException e) {
				log(e);
			}
		}
		
		return true;
	}
	
	public int compareTo(ResourceLocatorConfig other) {
		return Priority.compare(this.priority, other.priority);
	}
	
	
	public static enum Priority {
		
		/* The lowest priority for a resource locator */
		LOWEST(6, "lowest"), //$NON-NLS-1$
		
		/* The second lowest priority for a resource locator */
		LOWER(5, "lower"), //$NON-NLS-1$
		
		/* The third lowest priority for a resource locator */
		LOW(4, "low"), //$NON-NLS-1$
		
		/* The default priority for a resource locator */
		NORMAL(3, "normal"), //$NON-NLS-1$
		
		/* The third highest priority for a resource locator */
		HIGH(2, "high"), //$NON-NLS-1$
		
		/* The second highest priority for a resource locator */
		HIGHER(1, "higher"), //$NON-NLS-1$
		
		/* The highest priority for a resource locator */
		HIGHEST(0, "highest"); //$NON-NLS-1$
		
		
		public static int compare(Priority priority1, Priority priority2) {
			return priority1.value.compareTo(priority2.value);
		}
		
		public static Priority get(String literal) {
			if (literal == null) {
				return NORMAL;
			}
			for (Priority priority : values()) {
				if (StringTools.stringsAreEqual(literal, priority.literal)) {
					return priority;
				}
			}
			return null;
		}
		
		
		private Integer value;
		private String literal;
		
		
		private Priority(int value, String literal) {
			this.value = Integer.valueOf(value);
			this.literal = literal;
		}
		
		
		@Override
		public String toString() {
			return this.literal;
		}
	}
}
