package org.eclipse.emf.refactor.metrics.runtime.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.refactor.metrics.interfaces.IHighlighting;
import org.eclipse.emf.refactor.metrics.runtime.core.Result;
import org.eclipse.emf.refactor.metrics.runtime.managers.RuntimeManager;
import org.eclipse.emf.refactor.metrics.runtime.ui.actions.ClearAction;
import org.eclipse.emf.refactor.metrics.runtime.ui.actions.SaveAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

public class MetricResultsView extends ViewPart {
	
	private static final String RESULT_COLUMN_LABEL = "Result";

	private static final String DESCRIPTION_COLUMN_LABEL = "Description";

	private static final String METRIC_COLUMN_LABEL = "Metric";

	private static final String CONTEXT_COLUMN_LABEL = "Context";

	private static final String TIME_COLUMN_LABEL = "Time";
	
	private static IMenuManager barMM;
	private static IToolBarManager toolbarMM;

	/**
	 * The ID of the view as specified by the extension.
	 */
	public static final String ID = "org.eclipse.emf.refactor.metrics.view";
	private TableViewer viewer;
	private Composite parent;
	private SaveAction saveAction;
	private Action clearAction;
	private List<Action> additionalActions = new ArrayList<Action>();
	private List<IHighlighting> additionalHighlightings = new ArrayList<IHighlighting>();

	public MetricResultsView() { }
	
	public void addAction(Action action) {
		additionalActions.add(action);
	}
	
	@Override
	public void setFocus() {
		viewer.getControl().setFocus();
	}

	@Override
	public void createPartControl(Composite parent) {
		RuntimeManager.getInstance();
		this.parent = parent;
		TableColumn column;
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
				| SWT.V_SCROLL);
		final Table table = viewer.getTable();
		RuntimeManager.setResultsViewer(viewer);
		
		column = new TableColumn(table, SWT.LEFT);
		column.setText(CONTEXT_COLUMN_LABEL);
		column.setWidth(200);
		column.addListener(SWT.Selection, new ColumnSortListener(column));
		
		column = new TableColumn(table, SWT.LEFT);
		column.setText(METRIC_COLUMN_LABEL);
		column.setWidth(120);
		column.addListener(SWT.Selection, new ColumnSortListener(column));
		
		column = new TableColumn(table, SWT.LEFT);
		column.setText(DESCRIPTION_COLUMN_LABEL);
		column.setWidth(360);
		column.addListener(SWT.Selection, new ColumnSortListener(column));
		
		column = new TableColumn(table, SWT.LEFT);
		column.setText(RESULT_COLUMN_LABEL);
		column.setWidth(70);
		column.addListener(SWT.Selection, new ColumnSortListener(column));
		
		column = new TableColumn(table, SWT.LEFT);
		column.setText(TIME_COLUMN_LABEL);
		column.setWidth(150);
		column.addListener(SWT.Selection, new ColumnSortListener(column));
		
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		
		viewer.setContentProvider(new MetricResultsViewContentProvider());
		viewer.setLabelProvider(new MetricResultsViewLabelProvider());
		viewer.setInput(RuntimeManager.getResultsViewInput());
		viewer.addSelectionChangedListener(new ISelectionChangedListener() {

			@Override
			public void selectionChanged(SelectionChangedEvent event) {
				if(event.getSelection().isEmpty()) {
					return;
			    }
				IWorkbenchWindow workbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
				IEditorPart editorPart = workbenchWindow.getActivePage().getActiveEditor();
				if (event.getSelection() instanceof IStructuredSelection) {
					StructuredSelection ss = (StructuredSelection) event.getSelection();
					doAdditionalHighlightings(ss);
				}
				System.out.println("editorPart: " + editorPart);
				System.out.println("editorPart.class: " + editorPart.getClass());
				if(editorPart != null && editorPart instanceof IViewerProvider) {
					setSelectionInModel((IViewerProvider)editorPart, (IStructuredSelection)event.getSelection());
				}				
			}
			
			private void setSelectionInModel(IViewerProvider provider, IStructuredSelection selection){
				ArrayList<EObject> eObjectList = new ArrayList<EObject>();
				for(Object selectedObject : selection.toList()){
					if(selectedObject instanceof Result){
						for(EObject currentEObject : ((Result) selectedObject).getContext()) {
							EObject modelInstanceObject = getModelObjectInstance(provider, currentEObject);
							eObjectList.add(modelInstanceObject);
						}
					}
				}
				provider.getViewer().setSelection(new StructuredSelection(eObjectList));				
			}
			
			private EObject getModelObjectInstance(IViewerProvider provider, EObject eObject) {
				Viewer viewer = provider.getViewer();
				TreeViewer treeViewer = (TreeViewer)viewer;
				Tree tree = treeViewer.getTree();
				TreeItem treeItem = tree.getItem(0);
				Resource o = (Resource)treeItem.getData();
				ResourceSet set = o.getResourceSet();
				EObject ob = set.getEObject(EcoreUtil.getURI(eObject), true);
				return ob;
			}
			
		});
		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),"EMFMetrics.viewer");
		makeActions();
//		hookContextMenu();
		//hookDoubleClickAction();
		contributeToActionBars();
	}

//	private void hookContextMenu() {
//		MenuManager menuMgr = new MenuManager("#PopupMenu");
//		menuMgr.setRemoveAllWhenShown(true);
//		menuMgr.addMenuListener(new IMenuListener() {
//			public void menuAboutToShow(IMenuManager manager) {
//				MetricResultsView.this.fillContextMenu(manager);
//			}
//		});
//		Menu menu = menuMgr.createContextMenu(viewer.getControl());
//		viewer.getControl().setMenu(menu);
//		getSite().registerContextMenu(menuMgr, viewer);
//	}

	private void contributeToActionBars() {
		IActionBars bars = getViewSite().getActionBars();
		fillLocalPullDown(bars.getMenuManager());
		fillLocalToolBar(bars.getToolBarManager());
	}

	private void fillLocalPullDown(IMenuManager manager) {
		barMM = manager;
		manager.add(saveAction);
		manager.add(clearAction);
		manager.add(new Separator());
	}

//	private void fillContextMenu(IMenuManager manager) {
//		contextMM = manager;
//		manager.add(saveAction);
//		manager.add(clearAction);
//		// Other plug-ins can contribute there actions here
////		for (Action action : additionalActions) {
////			manager.add(action);
////		}
//		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
//	}

	private void fillLocalToolBar(IToolBarManager manager) {
		toolbarMM = manager;
		manager.add(saveAction);
		manager.add(clearAction);
	}
	
	public void addActionsToMenu() {
		for (Action action : additionalActions) {	
			if (toolbarMM.getItems().length != additionalActions.size()+2) {
				barMM.add(action);
				barMM.update(true);
				toolbarMM.add(action);
				toolbarMM.update(true);
			}
		}
		additionalActions.clear();
	}

	private void makeActions() {
		saveAction = new SaveAction(parent.getShell(), viewer);		
		clearAction = new ClearAction(viewer);		
	}
	
	private class ColumnSortListener implements Listener {
		private TableColumn column;
		public ColumnSortListener(TableColumn column) {
			this.column = column;
		}
		
		private void orderByColumn(TableColumn column) {
			MetricResultsViewContentProvider provider = (MetricResultsViewContentProvider)viewer.getContentProvider();
			if(column.getText().equals(METRIC_COLUMN_LABEL))
				provider.sortContent(MetricResultsViewContentProvider.METRIC_NAME);
			if(column.getText().equals(RESULT_COLUMN_LABEL))
				provider.sortContent(MetricResultsViewContentProvider.VALUE);
			if(column.getText().equals(DESCRIPTION_COLUMN_LABEL))
				provider.sortContent(MetricResultsViewContentProvider.DESCRIPTION);
			if(column.getText().equals(TIME_COLUMN_LABEL))
				provider.sortContent(MetricResultsViewContentProvider.TIME);
			if(column.getText().equals(CONTEXT_COLUMN_LABEL))
				provider.sortContent(MetricResultsViewContentProvider.CONTEXT);
		}

		@Override
		public void handleEvent(Event event) {
			orderByColumn(column);		
		}
	}

	public void addHighlighting(IHighlighting highlighting) {
		additionalHighlightings.add(highlighting);
	}
	
	protected void doAdditionalHighlightings(Object selection) {
		for (IHighlighting highlighting : additionalHighlightings) {
			highlighting.highlight(selection);
		}
	}

}
