/*******************************************************************************
 * Copyright (c) 2014 Manumitting Technologies Inc 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:
 *     Brian de Alwis (MTI) - initial API and implementation
 *******************************************************************************/
package org.eclipse.e4.ui.css.model.workbench.internal.elements;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.e4.ui.css.core.dom.ElementAdapter;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Represents a Modelled Workbench element; it wraps most of
 * {@link MApplicationElement}.
 */
public class WMElement extends ElementAdapter {
	/**
	 * Convenience method for getting the CSS class of a widget.
	 * 
	 * @param widget
	 *            SWT widget with associated CSS class name
	 * @return CSS class name
	 */
	public static String getCSSClass(MApplicationElement element) {
		return join(element.getTags());
	}

	private static String join(Collection<String> tags) {
		if (tags.isEmpty()) {
			return "";
		}
		if (tags.size() == 1) {
			return tags instanceof List<?> ? ((List<String>) tags).get(0)
					: tags.iterator().next();
		}
		StringBuilder sb = new StringBuilder();
		for (Iterator<String> it = tags.iterator(); it.hasNext(); sb
				.append(' ')) {
			sb.append(it.next());
		}
		return sb.toString();
	}

	/**
	 * Convenience method for getting the CSS ID of a widget.
	 * 
	 * @param widget
	 *            SWT widget with associated CSS id
	 * @return CSS ID
	 */
	public static String getID(MApplicationElement element) {
		String elementId = element.getElementId();
		if (elementId == null) {
			return null;
		}
		return elementId.replace(".", "-");
	}

	protected String localName;
	protected String namespaceURI;

	public WMElement(MApplicationElement element, CSSEngine engine) {
		super(element, engine);
		EClass eclass = element instanceof EObject ? ((EObject) element)
				.eClass() : null;
		localName = eclass == null ? element.getClass().getSimpleName()
				: eclass.getName();
		namespaceURI = eclass == null ? element.getClass().getPackage()
				.getName() : eclass.getEPackage().getNsURI();
	}

	public String getNamespaceURI() {
		return namespaceURI;
	}

	public String getCSSId() {
		return getID(getUIElement());
	}

	public String getCSSClass() {
		return getCSSClass(getUIElement());
	}

	public String getCSSStyle() {
		return "";
	}

	@Override
	public String getLocalName() {
		return localName;
	}

	/**
	 * Check for attribute. Attributes are looked up in the modelled workbench
	 * element's persisted and transient data maps too.
	 */
	@Override
	public String getAttribute(String attr) {
		MUIElement element = getUIElement();
		if ("class".equals(attr)) {
			return getCSSClass(element);
		}
		String value = element.getPersistedState().get(attr);
		if (value != null) {
			return value;
		}
		Object tvalue = element.getTransientData().get(attr);
		if (tvalue != null) {
			return tvalue.toString();
		}
		return "";
	}

	@Override
	public boolean isPseudoInstanceOf(String s) {
		if (getUIElement().getTags().contains(s)) {
			return true;
		}
		return super.isPseudoInstanceOf(s);
	}

	/** Return the modelled workbench element */
	public MUIElement getUIElement() {
		return (MUIElement) getNativeWidget();
	}

	/********** CHILDREN **********/

	public NodeList getChildNodes() {
		if (getNativeWidget() instanceof MElementContainer<?>) {
			return new ListBasedNodeList(
					((MElementContainer<?>) getNativeWidget()).getChildren(),
					engine);
		}
		return new ListBasedNodeList(Collections.emptyList(), engine);
	}

	public Node getParentNode() {
		return getElement(getUIElement().getParent());
	}
}
