/*******************************************************************************
 * Copyright (c) 2011 Mia-Software.
 * 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:
 *    Fabien Giquel (Mia-Software)
 *    Romain Dervaux (Mia-Software)
 *    Nicolas Bros (Mia-Software) - Bug 335003 - [Discoverer] : Existing Discoverers Refactoring based on new framework
 *******************************************************************************/
package org.eclipse.modisco.kdm.source.discoverer.internal;

import java.io.File;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.gmt.modisco.omg.kdm.kdm.KdmFactory;
import org.eclipse.gmt.modisco.omg.kdm.kdm.Segment;
import org.eclipse.gmt.modisco.omg.kdm.source.Directory;
import org.eclipse.gmt.modisco.omg.kdm.source.InventoryContainer;
import org.eclipse.gmt.modisco.omg.kdm.source.InventoryItem;
import org.eclipse.gmt.modisco.omg.kdm.source.InventoryModel;
import org.eclipse.gmt.modisco.omg.kdm.source.SourceFactory;

/**
 * Services for building a basic file system representation, based on the Source
 * package from the KDM metamodel.
 */
public class KDMSourceDiscoverer {

	/**
	 * Memorize if top level container is a project.
	 */
	private boolean rootIsProject = false;

	/**
	 * Memorize top level container.
	 */
	private InventoryContainer rootContainer = null;

	/**
	 * The ContentTypeManager of the Platform.
	 */
	private static final IContentTypeManager CONTENT_TYPE_MANAGER = Platform
			.getContentTypeManager();

	/**
	 * The content type corresponding to a generic text file.
	 */
	private static final IContentType TEXT_CONTENT_TYPE = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
			.getContentType(Activator.PLUGIN_ID + ".textFile"); //$NON-NLS-1$

	/**
	 * The content type corresponding to a configuration file.
	 */
	private static final IContentType CONFIG_CONTENT_TYPE = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
			.getContentType(Activator.PLUGIN_ID + ".confFile"); //$NON-NLS-1$

	/**
	 * The content type corresponding to a source file.
	 */
	private static final IContentType SRC_CONTENT_TYPE = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
			.getContentType(Activator.PLUGIN_ID + ".srcFile"); //$NON-NLS-1$

	/**
	 * The content type corresponding to a generic binary file.
	 */
	private static final IContentType BIN_CONTENT_TYPE = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
			.getContentType(Activator.PLUGIN_ID + ".binaryFile"); //$NON-NLS-1$

	/**
	 * The content type corresponding to an image.
	 */
	private static final IContentType IMAGE_CONTENT_TYPE = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
			.getContentType(Activator.PLUGIN_ID + ".imageFile"); //$NON-NLS-1$

	/**
	 * The content type corresponding to an executable file.
	 */
	private static final IContentType EXECUTABLE_CONTENT_TYPE = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
			.getContentType(Activator.PLUGIN_ID + ".executableFile"); //$NON-NLS-1$

	/**
	 * Create a new File system representation for the given File.
	 *
	 * @param file
	 *            must be a directory
	 * @return the resource containing the representation
	 */
	public final Resource getKDMModelFromDirectory(final File file) {
		if (!file.isDirectory()) {
			return null;
		}
		this.rootIsProject = false;
		this.rootContainer = null;
		return createKDMModelFromDirectory(file, file.getName());
	}

	/**
	 * Create a new File system representation for the given project.
	 *
	 * @param project
	 *            a project
	 * @return the resource containing the representation
	 */
	public final Resource getKDMModelFromProject(final IProject project) {
		this.rootIsProject = true;
		this.rootContainer = null;
		return createKDMModelFromDirectory(project.getLocation().toFile(), project.getName());
	}

	/**
	 * Create a new File system representation for the given Eclipse container.
	 *
	 * @param aContainer
	 *            a Eclipse container
	 * @return the resource containing the representation
	 */
	public final Resource getKDMModelFromContainer(final IContainer aContainer) {
		this.rootIsProject = (aContainer == aContainer.getProject());
		this.rootContainer = null;
		return createKDMModelFromDirectory(aContainer.getLocation().toFile(), aContainer.getName());
	}

	/**
	 * Create a new File system representation for the given directory.
	 *
	 * @param directoryFile
	 *            a directory
	 * @param name
	 *            name of the model
	 * @return the resource containing the representation
	 */
	private Resource createKDMModelFromDirectory(final File directoryFile, final String name) {
		Resource resultModel = new XMIResourceImpl();
		Segment segment = KdmFactory.eINSTANCE.createSegment();

		InventoryModel inventoryModel = SourceFactory.eINSTANCE.createInventoryModel();
		inventoryModel.setName(name);
		// resultModel.getContents().add(inventoryModel);
		segment.getModel().add(inventoryModel);
		resultModel.getContents().add(segment);

		InventoryContainer project = createFileSystemTree(directoryFile);
		inventoryModel.getInventoryElement().add(project);
		return resultModel;
	}

	/**
	 * Create a new File system representation for the given directory.
	 *
	 * @param directory
	 *            a directory
	 * @return the inventory container
	 */
	private InventoryContainer createFileSystemTree(final File directory) {
		InventoryContainer resultDirectory;
		if (this.rootContainer == null && this.rootIsProject) {
			resultDirectory = SourceFactory.eINSTANCE.createProject();
			this.rootContainer = resultDirectory;
		} else {
			resultDirectory = SourceFactory.eINSTANCE.createDirectory();
			((Directory) resultDirectory).setPath(directory.getAbsolutePath());
			if (this.rootContainer == null) {
				this.rootContainer = resultDirectory;
			}
		}
		resultDirectory.setName(directory.getName());

		File[] children = directory.listFiles();
		for (File child : children) {
			if (child.isFile()) {
				InventoryItem childItem = getElement(child);
				childItem.setPath(child.getAbsolutePath());
				childItem.setName(child.getName());
				resultDirectory.getInventoryElement().add(childItem);
			} else {
				Directory childDirectory = (Directory) createFileSystemTree(child);
				resultDirectory.getInventoryElement().add(childDirectory);
			}
		}
		return resultDirectory;
	}

	/**
	 * Between multiple content types for the file, search for the most
	 * specialized defined in this plug-in, or <code>null</code> if no content
	 * type is associated with this file in this plug-in.
	 *
	 * @param fileName
	 *            the file name
	 * @return the more specialized content type defined in this plug-in
	 */
	private static IContentType findBestContentTypeFor(final String fileName) {
		IContentType[] contentTypes = KDMSourceDiscoverer.CONTENT_TYPE_MANAGER
				.findContentTypesFor(fileName);

		IContentType bestContentType = null;

		for (IContentType contentType : contentTypes) {
			if (contentType.getId().startsWith(Activator.PLUGIN_ID)) {
				if (bestContentType == null || contentType.isKindOf(bestContentType)) {
					bestContentType = contentType;
				}
			}
		}
		return bestContentType;
	}

	/**
	 * Create the Inventory Item corresponding to the given file's content type.
	 *
	 * @param file
	 *            the file
	 * @return the inventory item
	 */
	private static InventoryItem getElement(final File file) {

		InventoryItem item = null;

		IContentType contentType = findBestContentTypeFor(file.getName());

		if (contentType != null) {

			if (contentType.isKindOf(KDMSourceDiscoverer.BIN_CONTENT_TYPE)) {
				if (contentType.isKindOf(KDMSourceDiscoverer.IMAGE_CONTENT_TYPE)) {
					item = SourceFactory.eINSTANCE.createImage();
					return item;
				} else if (contentType.isKindOf(KDMSourceDiscoverer.EXECUTABLE_CONTENT_TYPE)) {
					item = SourceFactory.eINSTANCE.createExecutableFile();
					return item;
				} else {
					item = SourceFactory.eINSTANCE.createBinaryFile();
				}

			} else if (contentType.isKindOf(KDMSourceDiscoverer.TEXT_CONTENT_TYPE)) {

				if (contentType.isKindOf(KDMSourceDiscoverer.CONFIG_CONTENT_TYPE)) {
					item = SourceFactory.eINSTANCE.createConfiguration();
				} else if (contentType.isKindOf(KDMSourceDiscoverer.SRC_CONTENT_TYPE)) {
					item = SourceFactory.eINSTANCE.createSourceFile();
				}
			}
		}
		if (item == null) {
			item = SourceFactory.eINSTANCE.createSourceFile();
		}
		return item;
	}

}
