/*******************************************************************************
 * Copyright (c) 2006 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.jsdt.web.css.core.internal.document;

import java.util.regex.Pattern;

import org.eclipse.wst.jsdt.web.css.core.internal.parserz.JSPedCSSRegionContexts;
import org.eclipse.wst.css.core.internal.document.CSSModelCreationContext;
import org.eclipse.wst.css.core.internal.document.CSSModelParser;
import org.eclipse.wst.css.core.internal.document.CSSNodeImpl;
import org.eclipse.wst.css.core.internal.document.CSSStructuredDocumentRegionContainer;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSDocument;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSRuleContainer;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocumentRegion;

/**
 * 
 */
class JSPedCSSModelParser extends CSSModelParser {

	public JSPedCSSModelParser(ICSSDocument doc) {
		super(doc);
	}

	/**
	 * 
	 */
	@Override
	protected CSSNodeImpl insertStructuredDocumentRegion(
			IStructuredDocumentRegion region) {
		CSSModelCreationContext creationContext = getCreationContext();
		if (creationContext == null || region == null) {
			return null;
		}

		String type = ((BasicStructuredDocumentRegion) region).getType();
		CSSNodeImpl modified = null;

		// ICSSNode target = fCreationContext.getTargetNode();

		if (type == JSPedCSSRegionContexts.CSS_JSP_DIRECTIVE) {

			boolean isInclude = region.getText().indexOf("include") != -1;
			if (isInclude) {
				modified = insertUnknownImport(region);
			} else {
				modified = insertUnknownRule(region);
			}
		}

		// post process
		if (modified != null) {
			if (modified instanceof CSSStructuredDocumentRegionContainer) {
				((CSSStructuredDocumentRegionContainer) modified)
						.propagateRangeStructuredDocumentRegion();
			}
		}

		return modified != null ? modified : super
				.insertStructuredDocumentRegion(region);
	}

	private CSSNodeImpl insertUnknownImport(IStructuredDocumentRegion region) {
		CSSModelCreationContext creationContext = getCreationContext();
		CSSNodeImpl parent = creationContext.getTargetNode();
		ICSSDocument sheet = parent.getOwnerDocument();

		String text = region.getText();
		Pattern pattern = Pattern.compile(" ");
		String[] strs = pattern.split(text);
		String hrefValue = null;
		for (int i = 0; i < strs.length; i++) {
			String hrefStr = "file=\"";
			if (strs[i].startsWith(hrefStr)) {
				int hrefStr_length = hrefStr.length();
				// minus 1 to avoid quote?
				int hrefValue_length = strs[i].length() - 1;
				if (hrefValue_length > hrefStr_length) {
					hrefValue = strs[i].substring(hrefStr_length,
							hrefValue_length);
				} else {
					/*
					 * ISSUE: this handles cases where, e.g. "file=" has no
					 * subsequent 'value' ... and from code in
					 * insertStructuredDocumentRegion I believe should return
					 * null, rather than empty string, but, this may need some
					 * fine tuning eventually.
					 */
					hrefValue = null;
				}
				break;
			}
		}

		if (hrefValue == null) {
			return null;
		}

		JSPCSSImportRuleImpl rule = new JSPCSSImportRuleImpl();
		rule.setOwnerDocument(sheet);
		rule.appendChild((CSSNodeImpl) sheet.createMediaList());
		rule.setRangeStructuredDocumentRegion(region, region);

		if (!isUpdateContextActive()) {
			rule.setHref(hrefValue);// Attribute(ICSSImportRule.HREF,
									// hrefValue);
		}

		// insert to tree
		if (!isUpdateContextActive() && parent != null) {
			// propagateRangePreInsert(sheet, rule);
			CSSNodeImpl next = creationContext.getNextNode();
			if (next != null) {
				((CSSNodeImpl) sheet).insertBefore(rule, next);
			} else {
				((CSSNodeImpl) sheet).appendChild(rule);
			}
		}
		// creationContext.setTargetNode(rule);
		return rule;
	}

	private CSSNodeImpl insertUnknownRule(IStructuredDocumentRegion flatNode) {
		CSSModelCreationContext creationContext = getCreationContext();
		CSSNodeImpl parent = creationContext.getTargetNode();
		if (!isParseFloating() && !(parent instanceof ICSSRuleContainer)) {
			return null;
		}

		JSPCSSNodeImpl rule = new JSPCSSNodeImpl(flatNode.getText());
		rule.setOwnerDocument(parent.getOwnerDocument());

		// setup flat container
		rule.setRangeStructuredDocumentRegion(flatNode, flatNode);

		// insert to tree
		if (!isUpdateContextActive() && parent != null) {
			propagateRangePreInsert(parent, rule);
			CSSNodeImpl next = creationContext.getNextNode();
			if (next != null) {
				parent.insertBefore(rule, next);
			} else {
				parent.appendChild(rule);
			}
		}

		// creationContext.setTargetNode(parent.getOwnerDocument());
		// TargetNext is set to null automatically

		return rule;
	}

}
