/*******************************************************************************
 * Copyright (c) 2012, 2015 Tasktop Technologies and others.
 * 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.context.ui.state;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchPage;

/**
 * Provides access to E4 API using reflection to avoid compile time dependencies.
 * 
 * @author Steffen Pingel
 */
// TODO e4.2 remove reflection
public class E4EditorReflector {

	private static final String MODEL_ELEMENT_ID = "org.eclipse.e4.ui.compatibility.editor"; //$NON-NLS-1$

	Class<?> eModelServiceClazz;

	Class<?> mUiElementClazz;

	Class<?> mPartClazz;

	private Class<?> ePartServiceClazz;

	private Class<?> partStateClazz;

	private Class<?> mApplicationElementClazz;

	public E4EditorReflector() {
		try {
			eModelServiceClazz = Class.forName("org.eclipse.e4.ui.workbench.modeling.EModelService"); //$NON-NLS-1$
			ePartServiceClazz = Class.forName("org.eclipse.e4.ui.workbench.modeling.EPartService"); //$NON-NLS-1$
			partStateClazz = Class.forName("org.eclipse.e4.ui.workbench.modeling.EPartService$PartState"); //$NON-NLS-1$
			mUiElementClazz = Class.forName("org.eclipse.e4.ui.model.application.ui.MUIElement"); //$NON-NLS-1$
			mPartClazz = Class.forName("org.eclipse.e4.ui.model.application.ui.basic.MPart"); //$NON-NLS-1$
			mApplicationElementClazz = Class.forName("org.eclipse.e4.ui.model.application.MApplicationElement"); //$NON-NLS-1$
		} catch (Exception e) {
			throw handleException(e);
		}
	}

	private RuntimeException handleException(Exception e) {
		return new RuntimeException(e);
	}

	public List<?> findElements(IWorkbenchPage page) {
		try {
			// page.getWindowModel()
			Method getWindowModel = page.getClass().getDeclaredMethod("getWindowModel"); //$NON-NLS-1$
			Object windowModel = getWindowModel.invoke(page);

			// EModelService modelService = PlatformUI.getWorkbench().getService(EModelService.class);
			Object modelService = getModelService();
			Method findElements = eModelServiceClazz.getDeclaredMethod("findElements", mUiElementClazz, String.class, //$NON-NLS-1$
					Class.class, List.class, int.class);

			//List<MPart> editors = modelService.findElements(page.getWindowModel(), CompatibilityEditor.MODEL_ELEMENT_ID, MPart.class, null, EModelService.IN_SHARED_AREA);
			List<?> editors = (List<?>) findElements.invoke(modelService, windowModel, MODEL_ELEMENT_ID, mPartClazz,
					null, 0x08);
			return editors;
		} catch (Exception e) {
			throw handleException(e);
		}
	}

	private Object getModelService() {
		return PlatformUI.getWorkbench().getService(eModelServiceClazz);
	}

	private Object getPartService(IWorkbenchWindow window) {
		return window.getService(ePartServiceClazz);
	}

	public Map<String, String> getPersistedState(Object editor) {
		try {
			//String state = editor.getPersistedState().get("memento");
			Method getPersistedStateMethod = mApplicationElementClazz.getDeclaredMethod("getPersistedState"); //$NON-NLS-1$
			Map<String, String> persistedState = (Map<String, String>) getPersistedStateMethod.invoke(editor);
			return persistedState;
		} catch (Exception e) {
			throw handleException(e);
		}
	}

	public Object createPart(IWorkbenchWindow window) {
		try {
			Object partService = getPartService(window);
			// MPart editor = partService.createPart(CompatibilityEditor.MODEL_ELEMENT_ID);
			Method method = ePartServiceClazz.getDeclaredMethod("createPart", String.class); //$NON-NLS-1$
			return method.invoke(partService, MODEL_ELEMENT_ID);
		} catch (Exception e) {
			throw handleException(e);
		}
	}

	public IEditorReference showPart(WorkbenchPage page, Object editorPart) {
		try {
			//EditorReference reference = page.createEditorReferenceForPart(editor, null, editor.getElementId(), null);
			Method method = mApplicationElementClazz.getDeclaredMethod("getElementId"); //$NON-NLS-1$
			String elementId = (String) method.invoke(editorPart);

			method = WorkbenchPage.class.getDeclaredMethod("createEditorReferenceForPart", mPartClazz, //$NON-NLS-1$
					IEditorInput.class, String.class, IMemento.class);
			Object editorReference = method.invoke(page, editorPart, null, elementId, null);

			Object partService = getPartService(page.getWorkbenchWindow());
			// PartState.ACTIVATE
			Object partStateActivate = partStateClazz.getEnumConstants()[0];
			//partService.showPart(editor, PartState.ACTIVATE);
			method = ePartServiceClazz.getDeclaredMethod("showPart", mPartClazz, partStateClazz); //$NON-NLS-1$
			method.invoke(partService, editorPart, partStateActivate);

			return (IEditorReference) editorReference;
		} catch (Exception e) {
			throw handleException(e);
		}

	}

}
