/*******************************************************************************
 * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
 *     Soyatec - initial API and implementation
 *******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.core.editor.dnd;

import org.eclipse.xwt.tools.ui.palette.ContextType;
import org.eclipse.xwt.tools.ui.palette.Entry;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.eclipse.xwt.tools.ui.designer.core.editor.text.StructuredTextHelper;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @author jliu (jin.liu@soyatec.com)
 */
public abstract class DropContext {
	public int findDropPosition(Node node, Entry entry, int documentPosition) {
		String scope = entry.getScope();
		ContextType contextType = entry.getContext();

		return findDropPosition(node, scope, contextType, documentPosition);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.xwt.vex.VEXContext#findDropPosition(org.w3c.dom.Node, java.lang.String, org.eclipse.xwt.vex.toolpalette.ContextType, int)
	 */
	public int findDropPosition(Node node, String scope, ContextType contextType, int cursorPosition) {
		IDOMNode treeNode = (IDOMNode) node;
		// check scope first
		if (scope != null) {
			String scopeName = scope.trim();
			if (scopeName.length() > 0) {
				// check from registered class
				if (treeNode.getNodeType() == Node.TEXT_NODE) {
					Node parentNode = treeNode.getParentNode();
					if (parentNode == null || !isKindOf(parentNode, scopeName)) {
						return -1;
					}
				}
			}
		}

		switch (contextType) {
		case XML_ALL:
			break;
		case XML_ATTRIBUTE:
			break;
		case XML_ATTRIBUTE_VALUE: {
			ITextRegion completionRegion = StructuredTextHelper.getCompletionRegion(cursorPosition, treeNode);

			String regionType = completionRegion.getType();

			if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
				return ((IDOMNode) treeNode).getStartOffset();
			}
			return -1;
		}
		case NONE:
			break;
		case XML_NEW:
			break;
		case XML_TAG: {
			if (treeNode.getNodeType() == Node.TEXT_NODE) {
				return treeNode.getStartOffset();
			}

			// Node node = (Node) treeNode;
			// while ((node != null) && (node.getNodeType() == Node.TEXT_NODE)
			// && (node.getParentNode() != null)) {
			// node = node.getParentNode();
			// }
			// IDOMNode xmlnode = treeNode;

			ITextRegion completionRegion = StructuredTextHelper.getCompletionRegion(cursorPosition, treeNode);

			String regionType = completionRegion.getType();

			if (regionType == DOMRegionContext.XML_PI_CLOSE || regionType == DOMRegionContext.XML_PI_OPEN || regionType == DOMRegionContext.XML_CONTENT || regionType == DOMRegionContext.XML_TAG_OPEN || regionType == DOMRegionContext.XML_TAG_CLOSE || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS || regionType == DOMRegionContext.XML_TAG_NAME || regionType == DOMRegionContext.XML_END_TAG_OPEN) {
				// in case of attribute, find the first text node
				NodeList nodeList = treeNode.getChildNodes();
				int length = nodeList.getLength();
				for (int i = 0; i < length; i++) {
					Node child = nodeList.item(i);
					if (child.getNodeType() == Node.TEXT_NODE) {
						return ((IDOMNode) child).getEndOffset();
					}
				}

				if (regionType == DOMRegionContext.XML_END_TAG_OPEN && length == 0) {
					IStructuredDocumentRegion endStructuredDocumentRegion = treeNode.getEndStructuredDocumentRegion();
					if (cursorPosition == endStructuredDocumentRegion.getStart()) {
						return cursorPosition;
					}
				}
			}
		}
			return -1;
		default:
			throw new UnsupportedOperationException();
		}

		return cursorPosition;
	}

	/**
	 * 
	 * @param node
	 * @param targetType
	 *            a qualified class name
	 * @return
	 */
	protected abstract boolean isKindOf(Node node, String targetType);
}
