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

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

import org.eclipse.core.resources.IFile;
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.smells.interfaces.IHighlighting;
import org.eclipse.emf.refactor.smells.runtime.core.EObjectGroup;
import org.eclipse.emf.refactor.smells.runtime.core.ResultModel;
import org.eclipse.emf.refactor.smells.runtime.managers.RuntimeManager;
import org.eclipse.emf.refactor.smells.runtime.ui.actions.ClearAction;
import org.eclipse.emf.refactor.smells.runtime.ui.actions.SaveAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
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.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
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.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ViewPart;

/**
 * View for displaying the <i>ResultModel</i> of a smell identification process.
 * 
 * @author Matthias Burhenne
 *
 */

public class ResultModelTreeView extends ViewPart {
//	public static final String MENU_ID = "de.unimarburg.swt.emf.modelsmell.resultview.contextmenu";
	public static final String MENU_ID = "org.eclipse.emf.refactor.smells.view";
	private ResultModelTreeViewer viewer;
	private Composite parent;
	
	private SaveAction saveAction;
	private ClearAction clearAction;
	private List<Action> additionalActions = new ArrayList<Action>();
	private List<IHighlighting> additionalHighlightings = new ArrayList<IHighlighting>();
	
	private static IMenuManager barMM;
	private static IToolBarManager toolbarMM;
	
	@Override
	public void createPartControl(Composite parent) {
		this.parent = parent;
		this.viewer = new ResultModelTreeViewer(parent); //TODO: add link between viewer and EMFModelSmells
		viewer.setContentProvider(new ResultModelTreeViewerContentProvider());
		viewer.setLabelProvider(new ResultModelTreeViewerLabelProvider());
		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
			
			@Override
			public void selectionChanged(SelectionChangedEvent event) {
				 if(event.getSelection().isEmpty()) {
			           return;
			     }
//				 if (event.getSelection() instanceof StructuredSelection) {
//					 StructuredSelection ss = (StructuredSelection) event.getSelection();
//					 System.out.println("StructuredSelection: " + ss);	
//					 Object selection = ss.getFirstElement();
//					 System.out.println("Selection: " + selection);	
//					 ArrayList<EObject> eObjectList = new ArrayList<EObject>();
//					 System.out.println("eObjectList: " + eObjectList);	
//					 if (selection instanceof EObject) {
//						 String path = ((EObject) selection).eResource().getURI().toPlatformString(false);
//						 System.out.println("Path: " + path);
//						 eObjectList.add((EObject) selection);
//					 }
//					 if (selection instanceof EObjectGroup) {
//						 eObjectList.addAll(((EObjectGroup) selection).getEObjects());
//					 }
//					 System.out.println("eObjectList: " + eObjectList);
//					 Object[] objects = eObjectList.toArray();
//					 RuntimeManager.selectModelObjects(objects);
//				 }
				 IEditorPart editorPart = null;
				 if(event.getSelection() instanceof IStructuredSelection) {
					 editorPart = openEditor((IStructuredSelection)event.getSelection());
					 StructuredSelection ss = (StructuredSelection) event.getSelection();
					 Object selection = ss.getFirstElement();
//					 if (selection instanceof EObject || selection instanceof EObjectGroup) {
						 doAdditionalHighlightings(selection);
//					 }
				 }
				 if(editorPart != null && editorPart instanceof IViewerProvider){
					 setSelectionInModel((IViewerProvider)editorPart, (IStructuredSelection)event.getSelection());
//						 ((IViewerProvider)editorPart).getViewer().setSelection(event.getSelection(), true);
				 }
			}
			
			private void setSelectionInModel(IViewerProvider provider, IStructuredSelection selection){
				ArrayList<EObject> eObjectList = new ArrayList<EObject>();
				for(Object selectedObject : selection.toList()){
					if(selectedObject instanceof EObjectGroup){
						for(EObject currentEObject : ((EObjectGroup)selectedObject).getEObjects()){
							EObject modelInstanceObject = getModelObjectInstance(provider, currentEObject);
							eObjectList.add(modelInstanceObject);
						}
						((EObjectGroup)selectedObject).setEObjects(eObjectList);
					}else if(selectedObject instanceof EObject){
						eObjectList.add(getModelObjectInstance(provider, (EObject)selectedObject));
					}
				}
				provider.getViewer().setSelection(new StructuredSelection(eObjectList));
//				Object o = selection.getFirstElement();
//				if(o instanceof EObject){
//					Object input = provider.getViewer().getInput();
//					provider.getViewer().setSelection(selection);
//				}else if(o instanceof EObjectGroup){
//					StructuredSelection s = new StructuredSelection(((EObjectGroup)o).getEObjects());
//					provider.getViewer().setSelection(s);
//				}
				
			}
			
			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);
//				String uri = o.getURIFragment(eObject);
				return ob;
//				return o.getEObject(uri);
//				EObject equalObject = o.getEObject(eObject.eResource().getURIFragment(eObject));
//				return equalObject;
				

				
//				if(provider instanceof IEditingDomainProvider){
//					IEditingDomainProvider prov = (IEditingDomainProvider)provider;
//					TreeIterator iterator = prov.getEditingDomain().treeIterator(viewer.getCurrentRoot());
//					while(iterator.hasNext()){
//						Object itObj = iterator.next();
//						if(itObj.equals(eObject)){
//							return (EObject) itObj;
//						}
//					}
//				}
//				return eObject;
			}

			@SuppressWarnings("unchecked")
			private IEditorPart openEditor(IStructuredSelection selection){
				Object o = selection.getFirstElement();
				EObject obj = null;
				if(o instanceof EObject){
					obj = (EObject)o;
				}else if(o instanceof EObjectGroup){
					EObjectGroup group = (EObjectGroup)o;
					if(!group.getEObjects().isEmpty()){
						obj = group.getEObjects().getFirst();
					}
				}
				if(obj != null){
//					URI uri = obj.eResource().getURI();
//					String fileString = URI.decode(uri.path());
//					fileString = fileString.replaceFirst("/resource", "");
//					IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString));
//					IWorkbench workbench = PlatformUI.getWorkbench();
					IFile file = ((LinkedList<ResultModel>)viewer.getInput()).get(0).getIFile();
					IWorkbenchWindow workbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
					IWorkbenchPage page = workbenchWindow.getActivePage();
					try {
						if(file.exists()){
							return IDE.openEditor(page, file);
						}
					}catch (PartInitException exception) {
						return null;
					}
				}
		        return null;
		     }
				
			
		});
		RuntimeManager.setResultModelTreeViewer(viewer);
		LinkedList<ResultModel> result = RuntimeManager.getResultModels();
		if(result != null){
			viewer.setInput(result);
		}
		makeActions();
		hookContextMenu();
		contributeToActionBars();
	}
	
	protected void doAdditionalHighlightings(Object selection) {
		for (IHighlighting highlighting : additionalHighlightings) {
			highlighting.highlight(selection);
		}
	}

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

//	private void createContextMenu() {
//		MenuManager menuMgr = new MenuManager();
//        menuMgr.setRemoveAllWhenShown(true);
//        menuMgr.addMenuListener(new IMenuListener() {
//                     
//
//			@Override
//			public void menuAboutToShow(IMenuManager manager) {
//				fillContextMenu(manager);			
//			}
//			
//			private void fillContextMenu(IMenuManager manager){
//				 manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
//			}
//        });
//             
//             // Create menu.
//          Menu menu = menuMgr.createContextMenu(viewer.getControl());
//             viewer.getControl().setMenu(menu);
//             
//             // Register menu for extension.
//          getSite().registerContextMenu(MENU_ID, 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) {
		manager.add(saveAction);
		manager.add(clearAction);
		// Other plug-ins can contribute there actions here
		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
	}

	private void fillLocalToolBar(IToolBarManager manager) {
		toolbarMM = manager;
		manager.add(saveAction);
		manager.add(clearAction);
	}
	
	private void makeActions() {
		saveAction = new SaveAction(parent.getShell(), viewer);
		clearAction = new ClearAction();
	}
	
	@SuppressWarnings("unchecked")
	public IEditorPart openEditor(IStructuredSelection selection){
		Object o = selection.getFirstElement();
		EObject obj = null;
		if(o instanceof EObject){
			obj = (EObject)o;
		}
		if(o instanceof EObjectGroup){
			EObjectGroup group = (EObjectGroup)o;
			if(!group.getEObjects().isEmpty()){
				obj = group.getEObjects().getFirst();
			}
		}
		if(obj != null){
//			URI uri = obj.eResource().getURI();
//			String fileString = URI.decode(uri.path());
//			fileString = fileString.replaceFirst("/resource", "");
//			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString));
//			IWorkbench workbench = PlatformUI.getWorkbench();
			IFile file = ((LinkedList<ResultModel>)viewer.getInput()).get(0).getIFile();
			IWorkbenchWindow workbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
			IWorkbenchPage page = workbenchWindow.getActivePage();
			try {
				if(file.exists()){
					return IDE.openEditor(page, file);
				}
			}catch (PartInitException exception) {
				return null;
			}
		}
        return null;
     }


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

	public void addAction(Action action) {
		additionalActions.add(action);
	}
	
	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();
	}
	
	public void addHighlighting(IHighlighting highlighting) {
		additionalHighlightings.add(highlighting);
	}

}
