/*******************************************************************************
 * Copyright (c) 2000, 2016 IBM Corporation 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
 *
 *******************************************************************************/
package org.eclipse.dltk.internal.ui;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.internal.ui.model.DLTKElementResourceMapping;
import org.eclipse.dltk.internal.ui.search.DLTKSearchPageScoreComputer;
import org.eclipse.dltk.internal.ui.search.SearchUtil;
import org.eclipse.search.ui.ISearchPageScoreComputer;
import org.eclipse.ui.IActionFilter;
import org.eclipse.ui.IContainmentAdapter;
import org.eclipse.ui.IContributorResourceAdapter;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.ide.IContributorResourceAdapter2;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.views.properties.FilePropertySource;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.ResourcePropertySource;
import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter;

/**
 * Implements basic UI support for Script elements. Implements handle to
 * persistent support for Script elements.
 */
public class ModelElementAdapterFactory implements IAdapterFactory,
		IContributorResourceAdapter, IContributorResourceAdapter2 {
	private static Class<?>[] PROPERTIES = new Class[] { IPropertySource.class,
			IResource.class, IWorkbenchAdapter.class, IResourceLocator.class,
			IPersistableElement.class, IContributorResourceAdapter.class,
			IContributorResourceAdapter2.class, ITaskListResourceAdapter.class,
			IContainmentAdapter.class/*, IHistoryPageSource.class */, IActionFilter.class};

	/*
	 * Do not use real type since this would cause the Search plug-in to be
	 * loaded.
	 */
	private Object fSearchPageScoreComputer;
	private static IResourceLocator fgResourceLocator;
	private static DLTKWorkbenchAdapter fgScriptWorkbenchAdapter;
	private static DLTKElementContainmentAdapter fgScriptElementContainmentAdapter;

	@Override
	public Class<?>[] getAdapterList() {
		updateLazyLoadedAdapters();
		return PROPERTIES;
	}

	@Override
	@SuppressWarnings("unchecked")
	public <T> T getAdapter(Object element, Class<T> key) {
		updateLazyLoadedAdapters();
		IModelElement modelElement = getModelElement(element);
		if (IPropertySource.class.equals(key)) {
			return (T) getProperties(modelElement);
		}
		if (IResource.class.equals(key)) {
			return (T) getResource(modelElement);
		}
		if (DLTKCore.DEBUG_SCOPES) {
			System.err
					.println("Add search scope computer support in ModelElementAdapterFactory"); //$NON-NLS-1$
		}
		if (fSearchPageScoreComputer != null
				&& ISearchPageScoreComputer.class.equals(key)) {
			return (T) fSearchPageScoreComputer;
		}
		if (IWorkbenchAdapter.class.equals(key)) {
			return (T) getScriptWorkbenchAdapter();
		}
		if (IResourceLocator.class.equals(key)) {
			return (T) getResourceLocator();
		}
		if (IPersistableElement.class.equals(key)) {
			return (T) new PersistableModelElementFactory(modelElement);
		}
		if (IContributorResourceAdapter.class.equals(key)) {
			return (T) this;
		}
		if (IContributorResourceAdapter2.class.equals(key)) {
			return (T) this;
		}
		if (ITaskListResourceAdapter.class.equals(key)) {
			return (T) getTaskListAdapter();
		}
		if (IContainmentAdapter.class.equals(key)) {
			return (T) getScriptElementContainmentAdapter();
		}
		if( IActionFilter.class.equals(key) ) {
			return (T) new ModelElementActionFilterAdapter();
		}
		//if (IHistoryPageSource.class.equals(key)
		//		&& JavaElementHistoryPageSource.hasEdition(java)) {
		//	return JavaElementHistoryPageSource.getInstance();
		//}
		return null;
	}

	private IResource getResource(IModelElement element) {
		// can't use IModelElement.getResource directly as we are interested in
		// the
		// corresponding resource
		switch (element.getElementType()) {
		case IModelElement.TYPE:
			// top level types behave like the CU
			IModelElement parent = element.getParent();
			if (parent instanceof ISourceModule) {
				return ((ISourceModule) parent).getPrimary().getResource();
			}
			return null;
		case IModelElement.SOURCE_MODULE:
			return ((ISourceModule) element).getPrimary().getResource();
		case IModelElement.PROJECT_FRAGMENT:
			// test if in a archive
			IProjectFragment root = (IProjectFragment) element
					.getAncestor(IModelElement.PROJECT_FRAGMENT);
			if (DLTKCore.DEBUG_SCOPES) {
				System.err.println("Check for archives"); //$NON-NLS-1$
			}
			if (!root.isArchive()) {
				return element.getResource();
			}
			return null;
		case IModelElement.SCRIPT_FOLDER:
		case IModelElement.SCRIPT_PROJECT:
		case IModelElement.SCRIPT_MODEL:
			return element.getResource();
		default:
			return null;
		}
	}

	@Override
	public IResource getAdaptedResource(IAdaptable adaptable) {
		IModelElement je = getModelElement(adaptable);
		if (je != null)
			return getResource(je);
		return null;
	}

	@Override
	public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
		IModelElement je = getModelElement(adaptable);
		if (je != null)
			return DLTKElementResourceMapping.create(je);
		return null;
	}

	private IModelElement getModelElement(Object element) {
		if (element instanceof IModelElement)
			return (IModelElement) element;
		return null;
	}

	private IPropertySource getProperties(IModelElement element) {
		IResource resource = getResource(element);
		if (resource == null)
			return new ScriptElementProperties(element);
		if (resource.getType() == IResource.FILE)
			return new FilePropertySource((IFile) resource);
		return new ResourcePropertySource(resource);
	}

	private void updateLazyLoadedAdapters() {
		if (DLTKCore.DEBUG_SCOPES) {
			System.err.println("Add search page scope compiler"); //$NON-NLS-1$
		}
		if (fSearchPageScoreComputer == null
				&& SearchUtil.isSearchPlugInActivated())
			createSearchPageScoreComputer();
	}

	private void createSearchPageScoreComputer() {
		if (DLTKCore.DEBUG_SCOPES) {
			System.err.println("Add search page scope compiler"); //$NON-NLS-1$
		}
		fSearchPageScoreComputer = new DLTKSearchPageScoreComputer();
		PROPERTIES = new Class[] { IPropertySource.class, IResource.class,
				ISearchPageScoreComputer.class, IWorkbenchAdapter.class,
				IResourceLocator.class, IPersistableElement.class,
				IProject.class, IContributorResourceAdapter.class,
				IContributorResourceAdapter2.class,
				ITaskListResourceAdapter.class, IContainmentAdapter.class, IActionFilter.class };
	}

	private static IResourceLocator getResourceLocator() {
		if (fgResourceLocator == null)
			fgResourceLocator = new ResourceLocator();
		return fgResourceLocator;
	}

	private static DLTKWorkbenchAdapter getScriptWorkbenchAdapter() {
		if (fgScriptWorkbenchAdapter == null)
			fgScriptWorkbenchAdapter = new DLTKWorkbenchAdapter();
		return fgScriptWorkbenchAdapter;
	}

	private static ITaskListResourceAdapter getTaskListAdapter() {
		// if (fgTaskListAdapter == null)
		// fgTaskListAdapter = new ScriptTaskListAdapter();
		// return fgTaskListAdapter;
		if (DLTKCore.DEBUG_SCOPES) {
			System.err
					.println("Add Task list adaptor to ModelElementAdapterFactory"); //$NON-NLS-1$
		}
		return null;
	}

	private static DLTKElementContainmentAdapter getScriptElementContainmentAdapter() {
		if (fgScriptElementContainmentAdapter == null)
			fgScriptElementContainmentAdapter = new DLTKElementContainmentAdapter();
		return fgScriptElementContainmentAdapter;
	}
}
