/**
 * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 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: 
 * 		Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.vaaclipse.addons.application.views;

import java.util.HashSet;
import java.util.Set;

import javax.inject.Inject;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.osbp.runtime.common.validation.Status;
import org.eclipse.osbp.vaaclipse.addons.common.api.explorer.IExplorerCategory;
import org.eclipse.osbp.vaaclipse.addons.common.api.explorer.IExplorerInfo;
import org.eclipse.osbp.vaaclipse.addons.common.api.explorer.IExplorerInfoManager;
import org.eclipse.osbp.vaaclipse.addons.common.api.explorer.IExplorerLeaf;
import org.eclipse.osbp.vaaclipse.addons.common.api.status.IStatusManager;
import org.osgi.framework.FrameworkUtil;
import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vaadin.data.Item;
import com.vaadin.data.util.HierarchicalContainer;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.server.Resource;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Tree;
import com.vaadin.ui.Tree.ExpandEvent;
import com.vaadin.ui.Tree.ExpandListener;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;

/**
 * The explorer view is the main entry point for the user to deal with the
 * applications. Applications, processes,... and beeing displayed there.
 */
@SuppressWarnings("serial")
public class ExplorerView implements ItemClickListener, ExpandListener {

	/** The Constant LOGGER. */
	private static final Logger LOGGER = LoggerFactory
			.getLogger(ExplorerView.class);

	/** The tree. */
	private Tree tree;
	
	/** The panel. */
	private Panel panel;

	/** The eclipse context. */
	private IEclipseContext eclipseContext;

	/** The container. */
	private LazyInfoLoader container;

	/** The resolved. */
	private Set<IExplorerInfo> resolved = new HashSet<IExplorerInfo>();

	/**
	 * Instantiates a new explorer view.
	 *
	 * @param parent
	 *            the parent
	 * @param eclipseContext
	 *            the eclipse context
	 * @param app
	 *            the app
	 */
	@Inject
	public ExplorerView(VerticalLayout parent, IEclipseContext eclipseContext,
			MApplication app) {

		this.eclipseContext = eclipseContext;

		panel = new Panel();
		panel.addStyleName(Reindeer.PANEL_LIGHT);
		panel.setSizeFull();
		tree = new Tree();
		tree.setImmediate(true);
		panel.setContent(tree);

		container = new LazyInfoLoader();
		tree.setContainerDataSource(container);
		tree.setItemCaptionPropertyId(IExplorerInfo.PROP__LABEL);
		tree.setItemIconPropertyId(IExplorerInfo.PROP__ICON);

		tree.addItemClickListener(this);
		tree.addExpandListener(this);

		parent.addComponent(panel);
	}

	/* (non-Javadoc)
	 * @see com.vaadin.ui.Tree.ExpandListener#nodeExpand(com.vaadin.ui.Tree.ExpandEvent)
	 */
	@Override
	public void nodeExpand(ExpandEvent event) {
		resolveChildren((IExplorerInfo) event.getItemId());
	}

	/**
	 * Resolve children.
	 *
	 * @param itemId
	 *            the item id
	 */
	@SuppressWarnings("unchecked")
	private void resolveChildren(IExplorerInfo itemId) {
		try {
			if (itemId instanceof IExplorerCategory) {
				IExplorerCategory category = (IExplorerCategory) itemId;
				// access the categories getChildren method. The category
				// will lazy load the childrens.
				for (IExplorerInfo newInfo : ((IExplorerCategory) itemId)
						.getChildren()) {
					Item item = container.addItem(newInfo);
					if (item == null) {
						continue;
					}
					item.getItemProperty("label").setValue(newInfo.getLabel());
					item.getItemProperty("icon").setValue(newInfo.getIcon());
					container.setParent(newInfo, category);
					if (newInfo instanceof IExplorerLeaf) {
						container.setChildrenAllowed(newInfo, false);
					}
				}
			}
		} finally {
			resolved.add(itemId);
		}
	}

	/**
	 * Gets the platform component.
	 *
	 * @return the platform component
	 */
	public Object getPlatformComponent() {
		return panel;
	}

	/* (non-Javadoc)
	 * @see com.vaadin.event.ItemClickEvent.ItemClickListener#itemClick(com.vaadin.event.ItemClickEvent)
	 */
	@Override
	public void itemClick(ItemClickEvent event) {
		IExplorerInfo info = (IExplorerInfo) event.getItemId();
		if (info instanceof IExplorerLeaf) {
			IExplorerLeaf leaf = (IExplorerLeaf) info;
			leaf.execute(eclipseContext);
		}
	}

	/**
	 * The Class LazyInfoLoader.
	 */
	private class LazyInfoLoader extends HierarchicalContainer {

		/**
		 * Instantiates a new lazy info loader.
		 */
		public LazyInfoLoader() {
			addContainerProperty("label", String.class, "");
			addContainerProperty("icon", Resource.class, null);

			loadRootElements();
		}

		/**
		 * Returns the infos as an input for the tree.
		 */
		@SuppressWarnings("unchecked")
		private void loadRootElements() {
			ServiceTracker<IExplorerInfoManager, IExplorerInfoManager> tracker = new ServiceTracker<IExplorerInfoManager, IExplorerInfoManager>(
					FrameworkUtil.getBundle(getClass()).getBundleContext(),
					IExplorerInfoManager.class, null);

			try {
				tracker.open();
				IExplorerInfoManager provider = tracker.waitForService(500);
				if (provider == null) {
					return;
				}
				for (IExplorerInfo newInfo : provider.getExplorerInfo(null,
						eclipseContext)) {
					Item item = addItem(newInfo);
					item.getItemProperty("label").setValue(newInfo.getLabel());
					item.getItemProperty("icon").setValue(newInfo.getIcon());
					if (newInfo instanceof IExplorerLeaf) {
						setChildrenAllowed(newInfo, false);
					}
				}
			} catch (InterruptedException e) {
				LOGGER.error("{}", e);
				eclipseContext.get(IStatusManager.class).getActiveScope()
						.addStatus(Status.createErrorStatus(e));
			} finally {
				tracker.close();
			}
		}
	}
}
