/*******************************************************************************
 * 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.internal.model;

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

/**
 * 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;
			String name1 = getName();
			String match1 = getMatch();
			String mode1 = getMode();
			String priority1 = getPriority();
			String name2 = includedTemplate.getName();
			String match2 = includedTemplate.getMatch();
			String mode2 = includedTemplate.getMode();
			String priority2 = includedTemplate.getPriority();

			if (name1 != null && name1.equals(name2))
				return true;
			if (match1 != null && match1.equals(match2) && 
					(mode1 == null && mode2 == null || mode1 != null && mode1.equals(mode2)) &&
					(priority1 == null && priority2 == null || priority1 != null && priority1.equals(priority2))
				)
				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$
	}
}
