/**
 * Copyright (c) 2019 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();		
	}
}
