/*******************************************************************************
 * Copyright (c) 2003, 2005 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.wst.common.frameworks.internal.enablement;

import java.util.Iterator;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;


/**
 * @author mdelder/blancett
 */
public class FunctionGroup implements Comparable {

	public static final String GROUP_NAME_ATTR = "name"; //$NON-NLS-1$
	public static final String GROUP_DESC_ATTR = "description"; //$NON-NLS-1$
	public static final String GROUP_ENABLED_BY_DEFAULT_ATTR = "enabledByDefault"; //$NON-NLS-1$
	public static final String GROUP_PRIORITY_ATTR = "priority"; //$NON-NLS-1$
	public static final String GROUP_INTIALIZER_CLASS_ATTR = "initializerClassName"; //$NON-NLS-1$
	private static final int NEGATIVE_PRIORITY = -1;

	private String groupID;
	private String name;
	private String description;
	private String intializerClassName;
	private String declaringExtension;
	private int priority = NEGATIVE_PRIORITY;
	private IConfigurationElement element;
	private IGroupInitializer groupInterface;
	private Set functionGroupPatternBindings;
//	private transient FunctionGroupPatternBinding[] functionGroupPatternBindingsAsArray;
	private boolean errorReported = false;

	public FunctionGroup(String groupID, IConfigurationElement element) {
		this.groupID = groupID;
		this.element = element;
	}

	public String getDescription() {
		if (description == null)
			description = element.getAttribute(GROUP_DESC_ATTR);
		return description;
	}

	String getInitalizerClassName() {
		if (intializerClassName == null)
			intializerClassName = element.getAttribute(GROUP_INTIALIZER_CLASS_ATTR);
		return intializerClassName;
	}

	public String getName() {
		if (name == null)
			name = element.getAttribute(GROUP_NAME_ATTR);
		return name;
	}

	private String getDeclaringExtensionName() {
		if (declaringExtension == null) {
			if (element.getDeclaringExtension() == null)
				return ""; //$NON-NLS-1$
			declaringExtension = element.getDeclaringExtension().toString();
		}
		return declaringExtension;
	}

	public String getGroupID() {
		return groupID;
	}

	IGroupInitializer getInitializerClass() {
		if (groupInterface == null)
			try {
				groupInterface = (IGroupInitializer) element.createExecutableExtension(GROUP_INTIALIZER_CLASS_ATTR);
			} catch (CoreException e) {
				Logger.getLogger().logError(WTPResourceHandler.getString("29", new Object[]{GROUP_INTIALIZER_CLASS_ATTR, getInitalizerClassName(), getDeclaringExtensionName()}) + "\r\n"); //$NON-NLS-1$//$NON-NLS-2$
				Logger.getLogger().logError(e);
			}
		return groupInterface;
	}

	public String toString() {
		return "\"" + getName() + "\" (" + getGroupID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	}

	public int getPriority() {
		if (priority == NEGATIVE_PRIORITY)
			priority = Integer.parseInt(element.getAttribute(GROUP_PRIORITY_ATTR));
		return priority;
	}

	public boolean isEnabled(IProject project) {
		if (getInitializerClass() != null)
			return getInitializerClass().isGroupEnabled(project);
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	public int compareTo(Object o) {
		if (this.equals(o))
			return 0;
		else if (!(o instanceof FunctionGroup))
			return 1;

		FunctionGroup group = (FunctionGroup) o;
		if (getPriority() == group.getPriority())
			return getGroupID().compareTo(group.getGroupID());

		else if (getPriority() < group.getPriority())
			return -1;
		else
			return 1;
	}

	public boolean isMatch(String string) {
		if (functionGroupPatternBindings == null) {
			if (!errorReported) {
				Logger.getLogger().logError(WTPResourceHandler.getString("30", new Object[]{getGroupID()})); //$NON-NLS-1$
				errorReported = true;
			}
			return false;
		}
		for (Iterator iterator = functionGroupPatternBindings.iterator(); iterator.hasNext();) {
			FunctionGroupPatternBinding functionGroupPatternBinding = (FunctionGroupPatternBinding) iterator.next();

			if (functionGroupPatternBinding.getPattern().matcher(string).matches())
				return true;
		}

		return false;
	}

	boolean setFunctionGroupPatternBindings(Set functionGroupPatternBindings) {
		functionGroupPatternBindings = Util.safeCopy(functionGroupPatternBindings, FunctionGroupPatternBinding.class);

		if (!Util.equals(functionGroupPatternBindings, this.functionGroupPatternBindings)) {
			this.functionGroupPatternBindings = functionGroupPatternBindings;
//			this.functionGroupPatternBindingsAsArray = (FunctionGroupPatternBinding[]) this.functionGroupPatternBindings.toArray(new FunctionGroupPatternBinding[this.functionGroupPatternBindings.size()]);

			return true;
		}

		return false;
	}

}
