/*******************************************************************************
 * Copyright (c) 2009 Standards for Technology in Automotive Retail 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:
 *     David Carver (STAR) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.core.internal.model;

import org.eclipse.wst.xsl.core.model.CallTemplate;
import org.eclipse.wst.xsl.core.model.Function;
import org.eclipse.wst.xsl.core.model.Import;
import org.eclipse.wst.xsl.core.model.Include;
import org.eclipse.wst.xsl.core.model.Parameter;
import org.eclipse.wst.xsl.core.model.Template;
import org.eclipse.wst.xsl.core.model.Variable;
import org.eclipse.wst.xsl.core.model.XSLElement;
import org.eclipse.wst.xsl.core.model.XSLModelObject;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * A Factory that creates XSL Elements of the requested type.
 * @since 1.1
 */
public class XSLElementFactory {

	private StylesheetParserData stylesheetParserData;
	private Element element;
	
	public XSLElementFactory(StylesheetParserData data, Element element) {
		stylesheetParserData = data;
		this.element = element;
	}
		
	public XSLElement createStyleSheet() {
		String version = element.getAttribute("version"); //$NON-NLS-1$
		stylesheetParserData.getStylesheet().setVersion(version);
		return stylesheetParserData.getStylesheet();
	}
	
	public XSLElement createInclude() {
		Include include = new Include(stylesheetParserData.getStylesheet());
		stylesheetParserData.getStylesheet().addInclude(include);
		return include;
	}
	
	public XSLElement createImport() {
		Import include = new Import(stylesheetParserData.getStylesheet());
		stylesheetParserData.getStylesheet().addImport(include);
		return include;
	}
	
	public XSLElement createTemplate() {
		stylesheetParserData.setCurrentTemplate(new Template(stylesheetParserData.getStylesheet()));
		stylesheetParserData.getStylesheet().addTemplate(stylesheetParserData.getCurrentTemplate());
		return stylesheetParserData.getCurrentTemplate();
	}
	
	public XSLElement createParamater() {
		Parameter param = new Parameter(stylesheetParserData.getStylesheet());
		// determine whether param has a value
		NodeList childNodes = element.getChildNodes();
		for (int i = 0; i < childNodes.getLength(); i++) {
			Node childNode = childNodes.item(i);
			if (childNode.getNodeType() != Node.ATTRIBUTE_NODE) {
				param.setValue(true);
				break;
			}
		}
		if (stylesheetParserData.getParentEl() != null) {
			if (stylesheetParserData.getParentEl().getModelType() == XSLModelObject.Type.FUNCTION) {
				Function function = (Function) stylesheetParserData.getParentEl();
				function.addParameter(param);
			} else if (stylesheetParserData.getParentEl().getModelType() == XSLModelObject.Type.TEMPLATE
					&& stylesheetParserData.getElementStack().size() == 2 && stylesheetParserData.getCurrentTemplate() != null) {
				Template template = (Template) stylesheetParserData.getParentEl();
				template.addParameter(param);
			}
		}
		return param;
	}
	
	public XSLElement createCallTemplate() {
		CallTemplate currentCallTemplate = new CallTemplate(stylesheetParserData.getStylesheet());
		stylesheetParserData.getCallTemplates().push(currentCallTemplate);
		stylesheetParserData.getStylesheet().addCalledTemplate(currentCallTemplate);
		return currentCallTemplate;
	}

	public XSLElement createWithParamParm() {
		Parameter param = new Parameter(stylesheetParserData.getStylesheet());
		// determine whether param has a value
		NodeList childNodes = element.getChildNodes();
		for (int i = 0; i < childNodes.getLength(); i++) {
			Node childNode = childNodes.item(i);
			if (childNode.getNodeType() != Node.ATTRIBUTE_NODE) {
				param.setValue(true);
				break;
			}
		}
		// get the previous call-template
		CallTemplate currentCallTemplate = stylesheetParserData.getCallTemplates().peek();
		currentCallTemplate.addParameter(param);
		return param;
	}

	public XSLElement createVariable(XSLElement xslEl) {
		if (stylesheetParserData.getElementStack().size() == 1) {// global variable
			Variable var = new Variable(stylesheetParserData.getStylesheet());
			stylesheetParserData.getStylesheet().addGlobalVariable(var);
			xslEl = var;
		} else if (stylesheetParserData.getElementStack().size() > 1 && stylesheetParserData.getCurrentTemplate() != null) {// local
																		// variable
			Variable var = new Variable(stylesheetParserData.getStylesheet());
			stylesheetParserData.getCurrentTemplate().addVariable(var);
			xslEl = var;
		}
		return xslEl;
	}
	
	public XSLElement createFunction() {
		stylesheetParserData.setCurrentTemplate(null);
		Function function = new Function(stylesheetParserData.getStylesheet());
		stylesheetParserData.getFunctions().push(function);
		stylesheetParserData.getStylesheet().addFunction(function);
		return function;
	}
	
	public XSLElement createXSLElement() {
		return new XSLElement(stylesheetParserData.getStylesheet());
	}
	
	
}
