/*******************************************************************************
 * Copyright (c) 2017 Obeo.
 * 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:
 *    Obeo - initial API and implementation and/or initial documentation
 *    ...
 *******************************************************************************/
package org.eclipse.intent.mapping.ide.internal.content;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Set;

import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.intent.mapping.content.IFileType;
import org.eclipse.intent.mapping.content.IFileTypeProvider;
import org.eclipse.intent.mapping.content.IFileTypeRegistry;
import org.eclipse.intent.mapping.internal.content.FileType;
import org.eclipse.intent.mapping.internal.content.FileTypeRegistry;

/**
 * Ide implementation of {@link FileTypeRegistry}.
 *
 * @author <a href="mailto:yvan.lussaud@obeo.fr">Yvan Lussaud</a>
 */
public class IdeFileTypeRegistry implements IFileTypeRegistry {

	/**
	 * Delegating {@link IFileTypeRegistry}.
	 */
	private final IFileTypeRegistry registry;

	/**
	 * Constructor.
	 * 
	 * @param registry
	 *            the delegating {@link IFileTypeRegistry}
	 */
	public IdeFileTypeRegistry(IFileTypeRegistry registry) {
		this.registry = registry;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.content.IFileTypeRegistry#getFileTypeProviders()
	 */
	public List<IFileTypeProvider> getFileTypeProviders() {
		return registry.getFileTypeProviders();
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.content.IFileTypeRegistry#registerFileType(java.lang.String,
	 *      java.util.Set)
	 */
	public void registerFileType(String typeID, Set<String> suprTypeIDs) {
		registry.registerFileType(typeID, suprTypeIDs);
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.content.IFileTypeRegistry#unregisterFileType(java.lang.String)
	 */
	public void unregisterFileType(String typeID) {
		registry.unregisterFileType(typeID);
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.content.IFileTypeRegistry#getFileType(java.lang.String)
	 */
	public IFileType getFileType(String typeID) {
		final IFileType res;

		final IFileType delegateFileType = registry.getFileType(typeID);
		if (delegateFileType == null) {
			final IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
			final IContentType contentType = contentTypeManager.getContentType(typeID);
			if (contentType != null) {
				res = new FileType(contentType.getId());
			} else {
				res = null;
			}
		} else {
			res = delegateFileType;
		}

		return res;
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @throws IOException
	 * @see org.eclipse.intent.mapping.content.IFileTypeRegistry#getFileTypeFor(java.io.InputStream,
	 *      java.lang.String)
	 */
	public IFileType getFileTypeFor(InputStream contents, String name) throws IOException {
		final IFileType res;

		final IFileType delegateFileType = registry.getFileTypeFor(contents, name);
		if (delegateFileType == null) {
			final IContentType contentType = Platform.getContentTypeManager().findContentTypeFor(contents,
					name);
			if (contentType != null) {
				res = new FileType(contentType.getId());
			} else {
				res = null;
			}
		} else {
			res = delegateFileType;
		}

		return res;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.content.IFileTypeRegistry#isKindOf(java.lang.String, java.lang.String)
	 */
	public boolean isKindOf(String typeID, String superTypeID) {
		final boolean res;

		if (registry.isKindOf(typeID, superTypeID)) {
			res = true;
		} else {
			final IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
			final IContentType contentType = contentTypeManager.getContentType(typeID);
			final IContentType superContentType = contentTypeManager.getContentType(superTypeID);
			res = contentType != null && contentType.isKindOf(superContentType);
		}

		return res;
	}

	/**
	 * Gets the delegating {@link IFileTypeRegistry}.
	 * 
	 * @return the delegating {@link IFileTypeRegistry}
	 */
	public IFileTypeRegistry getDelegate() {
		return registry;
	}

}
