/*=============================================================================#
 # Copyright (c) 2012, 2021 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.ui.workbench.workspace;

import java.util.Iterator;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;

import org.eclipse.statet.ecommons.resources.core.variables.ResourceVariableResolver;
import org.eclipse.statet.ecommons.ui.util.UIAccess;


@NonNullByDefault
public class ResourceVariableUtil implements ResourceVariableResolver.Context {
	
	
	/**
	 * Returns the currently selected resource in the active workbench window, or <code>null</code>
	 * if none.  If an editor is active, the resource adapter associated with the editor is
	 * returned, if any.
	 * 
	 * @return selected resource or <code>null</code>
	 */
	public static @Nullable IResource fetchSelectedResource() {
		return fetchSelectedResource(null);
	}
	
	private static @Nullable IResource fetchSelectedResource(final @Nullable IWorkbenchPart part) {
		// Compatible with DebugUITools.getSelectedResource
		final Display display= UIAccess.getDisplay();
		if (Thread.currentThread() == display.getThread()) {
			return getSelectedResource0(part);
		}
		else {
			class DisplayRunnable implements Runnable {
				
				@Nullable IResource resource;
				
				@Override
				public void run() {
					this.resource= getSelectedResource0(part);
				}
				
			}
			final DisplayRunnable runnable= new DisplayRunnable();
			display.syncExec(runnable);
			return runnable.resource;
		}
	}
	
	private static @Nullable IResource getSelectedResource0(@Nullable IWorkbenchPart part) {
		IResource resource= null;
		if (part == null) {
			final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(true);
			if (page != null) {
				part= page.getActivePart();
			}
		}
		if (part != null) {
			if (part instanceof IEditorPart) {
				final IEditorPart epart= (IEditorPart) part;
				resource= epart.getEditorInput().getAdapter(IResource.class);
			}
			if (resource == null) {
				final IWorkbenchPartSite site= part.getSite();
				if (site != null) {
					final ISelectionProvider provider= site.getSelectionProvider();
					if (provider != null) {
						final ISelection selection= provider.getSelection();
						if (selection instanceof IStructuredSelection) {
							final IStructuredSelection structuredSelection= (IStructuredSelection) selection;
							if (!structuredSelection.isEmpty()) {
								final Iterator<?> iterator= structuredSelection.iterator();
								final IAdapterManager adapterManager= Platform.getAdapterManager();
								while (resource == null && iterator.hasNext()) {
									final Object element= iterator.next();
									resource= adapterManager.getAdapter(element, IResource.class);
								}
							}
						}
					}
				}
			}
		}
		return resource;
	}
	
	
	protected static final byte S_RESOURCE_FETCHED=         0b0_0000_0001;
	
	
	private final IWorkbenchPage workbenchPage;
	
	private final @Nullable IWorkbenchPart part;
	
	private byte state;
	
	private @Nullable IResource resource;
	
	
	
	public ResourceVariableUtil() {
		this(UIAccess.getActiveWorkbenchPage(true));
	}
	
	public ResourceVariableUtil(final IWorkbenchPage page) {
		this.workbenchPage= page;
		this.part= this.workbenchPage.getActivePart();
	}
	
	public ResourceVariableUtil(final IWorkbenchPart part) {
		this.workbenchPage= part.getSite().getPage();
		this.part= part;
	}
	
	public ResourceVariableUtil(final @Nullable IResource resource) {
		this();
		this.state|= S_RESOURCE_FETCHED;
		this.resource= resource;
	}
	
	public ResourceVariableUtil(final ResourceVariableUtil location, final @Nullable IResource resource) {
		this.workbenchPage= location.getWorkbenchPage();
		this.part= location.getWorkbenchPart();
		this.state|= S_RESOURCE_FETCHED;
		this.resource= resource;
	}
	
	
	public IWorkbenchPage getWorkbenchPage() {
		return this.workbenchPage;
	}
	
	public @Nullable IWorkbenchPart getWorkbenchPart() {
		return this.part;
	}
	
	@Override
	public @Nullable IResource getResource() {
		if ((this.state & S_RESOURCE_FETCHED) == 0) {
			this.state|= S_RESOURCE_FETCHED;
			this.resource= fetchResource();
		}
		return this.resource;
	}
	
	protected void resetResource() {
		this.state&= ~S_RESOURCE_FETCHED;
		this.resource= null;
	}
	
	protected @Nullable IResource fetchResource() {
		return fetchSelectedResource(getWorkbenchPart());
	}
	
}
