/*******************************************************************************
 * Copyright (c) 2010, 2015 BestSolution.at and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
 * Lars Vogel <Lars.Vogel@gmail.com> - Bug 421453
 ******************************************************************************/
package org.eclipse.e4.tools.compat.internal;

import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.log.ILoggerProvider;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.tools.services.IClipboardService;
import org.eclipse.e4.ui.css.swt.theme.IThemeEngine;
import org.eclipse.e4.ui.css.swt.theme.IThemeManager;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.internal.services.IWorkbenchLocationService;
import org.eclipse.ui.services.AbstractServiceFactory;
import org.eclipse.ui.services.IServiceLocator;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.w3c.dom.css.CSSStyleDeclaration;

@SuppressWarnings("restriction")
public class ContextServiceFactory extends AbstractServiceFactory {

	@Override
	public Object create(Class serviceInterface, IServiceLocator parentLocator,
		IServiceLocator locator) {
		if (!IEclipseContext.class.equals(serviceInterface)) {
			return null;
		}

		final IWorkbenchLocationService wls = locator.getService(IWorkbenchLocationService.class);
		final IWorkbenchWindow window = wls.getWorkbenchWindow();
		final IWorkbenchPartSite site = wls.getPartSite();

		@SuppressWarnings("unchecked")
		final Object o = parentLocator.getService(serviceInterface);

		// This happens when we run in plain 3.x
		// We need to create a parent service context
		if (window == null && site == null) {
			final Bundle bundle = FrameworkUtil.getBundle(ContextServiceFactory.class);
			final BundleContext bundleContext = bundle.getBundleContext();
			final IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(bundleContext);

			final IEclipseContext appContext = serviceContext.createChild("WorkbenchContext"); //$NON-NLS-1$
			appContext.set(Display.class, Display.getCurrent());
			appContext.set(Logger.class, new WorkbenchLogger());
			appContext.set(IClipboardService.class, new ClipboardServiceImpl());
			appContext.set(Realm.class, Realm.getDefault());

			final Display d = Display.getCurrent();
			appContext.set(UISynchronize.class, new UISynchronize() {

				@Override
				public void syncExec(Runnable runnable) {
					d.syncExec(runnable);
				}

				@Override
				public void asyncExec(Runnable runnable) {
					d.asyncExec(runnable);
				}
			});

			final IThemeManager manager = serviceContext.get(IThemeManager.class);
			final IThemeEngine engine = manager.getEngineForDisplay(Display.getCurrent());
			appContext.set(IThemeEngine.class, engine);

			appContext.set(IStylingEngine.class, new IStylingEngine() {

				@Override
				public void setClassname(Object widget, String classname) {
					((Widget) widget).setData("org.eclipse.e4.ui.css.CssClassName", classname); //$NON-NLS-1$
					engine.applyStyles(widget, true);
				}

				@Override
				public void setId(Object widget, String id) {
					((Widget) widget).setData("org.eclipse.e4.ui.css.id", id); //$NON-NLS-1$
					engine.applyStyles(widget, true);
				}

				@Override
				public void style(Object widget) {
					engine.applyStyles(widget, true);
				}

				@Override
				public CSSStyleDeclaration getStyle(Object widget) {
					return engine.getStyle(widget);
				}

				@Override
				public void setClassnameAndId(Object widget, String classname,
					String id) {
					((Widget) widget).setData("org.eclipse.e4.ui.css.CssClassName", classname); //$NON-NLS-1$
					((Widget) widget).setData("org.eclipse.e4.ui.css.id", id); //$NON-NLS-1$
					engine.applyStyles(widget, true);
				}
			});

			if (appContext.get(ILoggerProvider.class) == null) {
				appContext.set(ILoggerProvider.class,
					ContextInjectionFactory.make(DefaultLoggerProvider.class, appContext));
			}

			return appContext;
		} else if (o != null && site == null) {
			final IEclipseContext windowContext = ((IEclipseContext) o).createChild("WindowContext(" + window + ")"); //$NON-NLS-1$ //$NON-NLS-2$
			windowContext.set(ISelectionService.class, window.getSelectionService());

			windowContext.declareModifiable(IServiceConstants.ACTIVE_SELECTION);
			window.getSelectionService().addSelectionListener((part, selection) -> {
				if (!selection.isEmpty()) {
					if (selection instanceof IStructuredSelection) {
						final IStructuredSelection s = (IStructuredSelection) selection;
						if (s.size() == 1) {
							windowContext.set(IServiceConstants.ACTIVE_SELECTION, s.getFirstElement());
						} else {
							windowContext.set(IServiceConstants.ACTIVE_SELECTION, s.toList());
						}
					} else {
						windowContext.set(IServiceConstants.ACTIVE_SELECTION, selection);
					}
				}
			});
			return windowContext;
		}

		return o;
	}
}