/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * 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:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.core.model;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.wst.xsl.core.model.XSLModelObject.Type;

/**
 * The <code>xsl:template</code> model element.
 * 
 * @author Doug Satchwell
 */
public class Template extends XSLElement
{
	final List<Variable> variables = new ArrayList<Variable>();
	final List<Parameter> parameters = new ArrayList<Parameter>();
	
	/**
	 * Create a new instance of this.
	 * 
	 * @param stylesheet the stylesheet that this belongs to
	 */
	public Template(Stylesheet stylesheet)
	{
		super(stylesheet);
	}
	
	/**
	 * Add a parameter to this.
	 * 
	 * @param parameter the parameter to add
	 */
	public void addParameter(Parameter parameter)
	{
		parameters.add(parameter);
	}
	
	/**
	 * Add a variable to this.
	 * 
	 * @param var the variable to add
	 */
	public void addVariable(Variable var)
	{
		variables.add(var);
	}

	/**
	 * Get the value of the <code>name</code> attribute if one exists.
	 * 
	 * @return the template name, or null
	 */
	public String getName()
	{
		return getAttributeValue("name"); //$NON-NLS-1$
	}
	
	/**
	 * Get the value of the <code>match</code> attribute if one exists.
	 * 
	 * @return the match value, or null
	 */
	public String getMatch()
	{
		return getAttributeValue("match"); //$NON-NLS-1$
	}
	
	/**
	 * Get the value of the <code>mode</code> attribute if one exists.
	 * 
	 * @return the mode value, or null
	 */
	public String getMode()
	{
		return getAttributeValue("mode"); //$NON-NLS-1$
	}
	
	/**
	 * Get the value of the <code>priority</code> attribute if one exists.
	 * 
	 * @return the priority value, or null
	 */
	public String getPriority()
	{
		return getAttributeValue("priority"); //$NON-NLS-1$
	}

	/**
	 * Get the list of parameters of this.
	 * 
	 * @return the list of parameters
	 */
	public List<Parameter> getParameters()
	{
		return parameters;
	}
	
	@Override
	public int hashCode()
	{
		String name = getName();
		if (name != null)
		{
			return 3 + name.hashCode();
		}
		String match = getMatch();
		String mode = getMode();
		String priority = getPriority();
		if (match != null)
		{
			int hash = 3*match.hashCode();
			if (priority != null)
				hash += 5*priority.hashCode();
			if (mode != null)
				hash += 7*mode.hashCode();
			return 5 + hash;
		}
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj)
	{
		if (obj == null)
			return false;
		if (obj == this)
			return true;
		if (obj instanceof Template)
		{
			Template includedTemplate = (Template)obj;
			if (!matchesByMatchOrName(includedTemplate))
				return false;
			// only possibility is that priority is different
			String priority1 = getPriority();
			String priority2 = includedTemplate.getPriority();
			if (priority1 == null && priority2 == null || priority1 != null && priority1.equals(priority2))
				return true;
		}
		return false;
	}
	
	public boolean matchesByMatchOrName(Template includedTemplate)
	{
		String name1 = getName();
		String match1 = getMatch();
		String mode1 = getMode();
		String name2 = includedTemplate.getName();
		String match2 = includedTemplate.getMatch();
		String mode2 = includedTemplate.getMode();
		if (name1 != null && name1.equals(name2))
			return true;
		if (match1 != null && match1.equals(match2) && (mode1 == null && mode2 == null || mode1 != null && mode1.equals(mode2)))
			return true;
		return false;
	}
	
	
	@Override
	public String toString()
	{
		String name = getName();
		String match = getMatch();
		return "file="+getStylesheet().getFile()+", name="+name+", match="+match; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	}
	
	public Type getModelType()
	{
		return Type.TEMPLATE;
	}

}
