/**
 * Copyright (c) 2017 CEA.
 * 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:
 *     CEA - initial API and implementation and/or initial documentation
 */
/**
 * Navigator Widget with the filter bar on the top


 */
package org.eclipse.sensinact.studio.navigator.device;

import org.apache.log4j.Logger;
import org.eclipse.emf.transaction.ResourceSetChangeEvent;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetListener;
import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetManager;
import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
import org.eclipse.sensinact.studio.navigator.device.commands.OpenResourceInvokerHandler;
import org.eclipse.sensinact.studio.navigator.device.doubleclick.BasicQueryResourceHelper;
import org.eclipse.sensinact.studio.navigator.device.filter.SensinactFilteredTree;
import org.eclipse.sensinact.studio.navigator.device.filter.SensinactPatternFilter;
import org.eclipse.sensinact.studio.navigator.device.toolbar.dialog.GatewayConfigDialog;
import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
import org.eclipse.sensinact.studio.resource.Gateway;
import org.eclipse.sensinact.studio.resource.Resource;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.navigator.NavigatorContentService;
import org.eclipse.ui.navigator.CommonDragAdapter;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.eclipse.ui.part.ViewPart;

/**
 * @author Etienne Gandrille
 */
public class DeviceNavigatorFilterView extends ViewPart implements ResourceModelSetListener,IDoubleClickListener {

	private static final Logger logger = Logger.getLogger(DeviceNavigatorFilterView.class);

	public static final String VIEW_ID = "org.eclipse.sensinact.studio.navigator.device";

	private TreeViewer viewer;
	private NavigatorContentService contentService;

	private FilteredTree tree;

	@Override
	public void createPartControl(Composite aParent) {

	contentService = new NavigatorContentService(super.getViewSite().getId());
		
		PatternFilter filter = new SensinactPatternFilter();
		filter.setIncludeLeadingWildcard(true);
		tree = new SensinactFilteredTree(this, aParent, SWT.H_SCROLL | SWT.V_SCROLL, filter, true);
		viewer = tree.getViewer();
		getSite().setSelectionProvider(viewer);
		GridData gd = new GridData(GridData.FILL_BOTH);
		tree.setLayoutData(gd);
				
		viewer.setSorter(new DeviceNavigatorSorter());
		viewer.setContentProvider(new DeviceNavigatorContentProvider());
		viewer.setLabelProvider(new DeviceNavigatorLabelProvider());
		viewer.setSelection(getSite().getSelectionProvider().getSelection());
		
		INavigatorContentService ncs = contentService;//getSite().getService(INavigatorContentService.class);
		CommonDragAdapter cd = new CommonDragAdapter(ncs, getSite().getSelectionProvider());
		int ops = org.eclipse.swt.dnd.DND.DROP_MOVE | org.eclipse.swt.dnd.DND.DROP_COPY;
		Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() };
		viewer.addDragSupport(ops, transfers, cd);
		viewer.addDoubleClickListener(this);
		
		try {
			tree.getViewer().setInput(ModelEditor.getInstance().getViewerInput());
		} catch (InterruptedException e) {
			logger.error("Error while setting input for the view", e);
		} 
		
		IHandlerService handlerService = (IHandlerService) getSite()
				.getService(IHandlerService.class);
		OpenResourceInvokerHandler invoker=new OpenResourceInvokerHandler();
		handlerService.activateHandler(VIEW_ID,invoker);
		
		MenuManager menuMgr = new MenuManager();
		Menu menu = menuMgr.createContextMenu(tree.getViewer().getControl());
		tree.getViewer().getControl().setMenu(menu);
		getSite().registerContextMenu(menuMgr, tree.getViewer());

		ResourceModelSetManager.getInstance().subscribe(this);
	}
	
	@Override
	public void doubleClick(DoubleClickEvent event) {

		IStructuredSelection selection = (IStructuredSelection) event.getSelection();
		Object element = selection.getFirstElement();
		Shell parent = getViewSite().getShell();
		
		if (element != null && element instanceof Resource) {
			Resource resource = (Resource) element;
			BasicQueryResourceHelper manager = new BasicQueryResourceHelper(parent, resource);
			try {
				manager.execute();
			} catch (InterruptedException e) {
				logger.error("Error during double click handler processing", e);
			}
		}

		if (element != null && element instanceof Gateway) {
			Gateway gateway = (Gateway) element;
			GatewayHttpConfig config = ConfigurationManager.getGateway(gateway.getName());
			
			if (config == null) {
				MessageDialog.openError(parent, "Error", "Can't find gateway " + gateway.getName());
				logger.error("Can't find gateway " + gateway.getName());
			} else {
				GatewayConfigDialog dialog = new GatewayConfigDialog(parent, config.getName(), config.getURL().getHost(), config.getURL().getPort(), config.getTimeout(), config.getUsername(), config.getPassword());
				
				if (dialog.open() == Window.OK) {
					GatewayHttpConfig gatewayConfig = dialog.getGateway();
					if (! ConfigurationManager.addGateway(gatewayConfig))
						MessageDialog.openError(parent, "Update Error", "Please check logs.");
				}
			}
		}
	}
	

	@Override
	public void modelSetUpdated(ResourceSetChangeEvent event) {
		Display.getDefault().asyncExec(new Runnable() {
			public void run() {
				if(contentService!=null){
					contentService.getActivationService().persistExtensionActivations();
					contentService.update();
					contentService.dispose();
				}
//				tree.update();
				viewer.refresh();
			}
		});
	}

	@Override
	public void setFocus() {
		viewer.getTree().setFocus();		
	}
}
