/*******************************************************************************
 * Copyright (c) 2001, 2011 IBM Corporation and others.
 * All rights reserved. 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:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.ui.internal.provisional.extensions;

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

import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.part.MultiPageEditorSite;

public class ConfigurationPointCalculator {
	public static final String DESIGN = ".design"; //$NON-NLS-1$
	public static final String SOURCE = ".source"; //$NON-NLS-1$

	public static String[] getConfigurationPoints(IEditorPart part, String contentType, String subContext, Class rootClass) {
		ConfigurationPointCalculator calculator = new ConfigurationPointCalculator();
		calculator.setContentType(contentType);
		calculator.setPart(part);
		calculator.setRootClass(rootClass);
		calculator.setSubContext(subContext);
		return calculator.getConfigurationPoints();
	}

	protected String fContentType = null;
	protected IWorkbenchPart fPart = null;

	protected Class fRootClass = null;
	protected String fSubContext = null;

	/**
	 * 
	 */
	public ConfigurationPointCalculator() {
		super();
	}

	public String[] getConfigurationPoints() {
		List points = new ArrayList(2);

		IWorkbenchPartSite site = null;
		if (fPart != null) {
			site = fPart.getSite();
			if (site != null) {
				String id = site.getId();
				if (id != null && id.length() > 0 && !id.equals(fRootClass.getName()))
					points.add(id);
			}
			if (site instanceof MultiPageEditorSite) {
				String multipageID = ((MultiPageEditorSite) site).getMultiPageEditor().getSite().getId();
				if (!points.contains(multipageID))
					points.add(multipageID);
				String sourcePageID = ((MultiPageEditorSite) site).getMultiPageEditor().getSite().getId() + ".source"; //$NON-NLS-1$
				if (!points.contains(sourcePageID))
					points.add(sourcePageID);
			}
			if (site instanceof MultiPageEditorSite) {
				String multipageClassName = ((MultiPageEditorSite) site).getMultiPageEditor().getClass().getName();
				if (!points.contains(multipageClassName))
					points.add(multipageClassName);
			}
			Class editorClass = fPart.getClass();
			while (editorClass != null && fRootClass != null && !editorClass.equals(fRootClass)) {
				if (!points.contains(editorClass.getName()))
					points.add(editorClass.getName());
				editorClass = editorClass.getSuperclass();
			}
		}

		if (fContentType != null) {
			IContentType contentType = Platform.getContentTypeManager().getContentType(fContentType);
			while (contentType != null && !contentType.getId().equals(IContentTypeManager.CT_TEXT)) {
				if (!points.contains(contentType.getId()))
					points.add(contentType.getId());
				contentType = contentType.getBaseType();
			}
		}

		if (fRootClass != null && !points.contains(fRootClass.getName()))
			points.add(fRootClass.getName());
		return (String[]) points.toArray(new String[0]);
	}

	/**
	 * @return Returns the contentType.
	 */
	public String getContentType() {
		return fContentType;
	}

	/**
	 * @return Returns the part.
	 */
	public IWorkbenchPart getPart() {
		return fPart;
	}

	/**
	 * @return Returns the rootClass.
	 */
	public Class getRootClass() {
		return fRootClass;
	}

	/**
	 * @return Returns the subContext.
	 */
	public String getSubContext() {
		return fSubContext;
	}

	/**
	 * @param contentType
	 *            The contentType to set.
	 */
	public void setContentType(String contentType) {
		fContentType = contentType;
	}

	/**
	 * @param part
	 *            The part to set.
	 */
	public void setPart(IWorkbenchPart part) {
		fPart = part;
	}

	/**
	 * @param rootClass
	 *            The rootClass to set.
	 */
	public void setRootClass(Class rootClass) {
		fRootClass = rootClass;
	}

	/**
	 * @param subContext
	 *            The subContext to set.
	 */
	public void setSubContext(String subContext) {
		fSubContext = subContext;
	}

}
