/*******************************************************************************
 * Copyright (c) 2013 CEA LIST.
 * 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:
 *     Cedric Dumoulin - cedric.dumoulin@lifl.fr
 ******************************************************************************/
package org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders;

import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createFolder;
import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createLayerOperatorConfig;
import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createLayerOperatorsMultipleBinding;
import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createOperatorBinding;
import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createPropertyId;
import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createPropertyOperatorConfig;
import static org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.loaders.LayersConfigModelUtils.createTypeConfig;

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

import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.Folder;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.LayerOperatorConfig;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.LayerOperatorMultipleBinding;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.LayersConfigFactory;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.OperatorBinding;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.OperatorConfig;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.PropertyId;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.configmodel.layersconfig.TypeConfig;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.LayersPackage;


/**
 * This class encapsulate an LayersConfig model.
 * It provides a default instance initialized with a model.
 *
 * @author cedric dumoulin
 *
 */
public class LayersConfigModel {

	/**
	 * The default instance used by all applications.
	 */
	static final protected LayersConfigModel instance;

	protected Resource resource;



	/**
	 * Create and initialize default instance.
	 */
	static {
		instance = new LayersConfigModel();
		instance.initDefaultModel();
	}

	/**
	 * Constructor.
	 *
	 */
	public LayersConfigModel() {
		createResourceAndRootFolder();
	}


	/**
	 * @return the instance
	 */
	public static LayersConfigModel getInstance() {
		return instance;
	}

	/**
	 * Init the object with a default model.
	 */
	private void initDefaultModel() {
		// Create model
		Folder layeropFolder = createFolder(getRootFolder(), "layerOp");

		LayerOperatorConfig stackedLayersOperatorConfig = createLayerOperatorConfig(layeropFolder, "stackedLayersOperator", LayersPackage.eINSTANCE.getStackedLayerOperatorDescriptor().getName());
		LayerOperatorConfig stackedLayersOperatorMinimunConfig = createLayerOperatorConfig(layeropFolder, "stackedLayersOperatorMinimum", LayersPackage.eINSTANCE.getStackedLayerOperatorDescriptor().getName());
		createLayerOperatorConfig(layeropFolder, "stackedLayersOperatorMaximum", LayersPackage.eINSTANCE.getStackedLayerOperatorDescriptor().getName());
		LayerOperatorConfig stackedLayersOperatorAverage = createLayerOperatorConfig(layeropFolder, "stackedLayersOperatorAverage", LayersPackage.eINSTANCE.getStackedLayerOperatorDescriptor().getName());

		// Create Operators
		Folder operatorFolder = createFolder(getRootFolder(), "operatorDesc");
		// OperatorConfig operatorBooleanAnd = createPropertyOperatorConfig(operatorFolder, "operatorBooleanAnd", BooleanAndOperator.class.getName());
		// OperatorConfig operatorBooleanOr = createPropertyOperatorConfig(operatorFolder, "operatorBooleanOr", BooleanOrOperator.class.getName());
		// OperatorConfig operatorFillAverage = createPropertyOperatorConfig(operatorFolder, "operatorFillAverage", FillAverageOperator.class.getName());


		// Create basic types
		Folder typeFolder = createFolder(getRootFolder(), "types");
		TypeConfig typeBoolean = createTypeConfig(typeFolder, "boolean");
		TypeConfig typeInt = createTypeConfig(typeFolder, "int");
		TypeConfig typeString = createTypeConfig(typeFolder, "String");
		TypeConfig typeFont = createTypeConfig(typeFolder, "Font");
		TypeConfig typeColor = createTypeConfig(typeFolder, "Color");
		TypeConfig typeFill = createTypeConfig(typeFolder, "Fill");
		TypeConfig typeLine = createTypeConfig(typeFolder, "Line");

		// Create properties
		Folder propertiesFolder = createFolder(getRootFolder(), "properties");
		PropertyId propertyIsVisible = createPropertyId(propertiesFolder, "isVisible", typeBoolean);
		PropertyId propertyIsAbstract = createPropertyId(propertiesFolder, "isAbstract", typeBoolean);
		PropertyId propertyFill = createPropertyId(propertiesFolder, "fill", typeFill);
		PropertyId propertyLine = createPropertyId(propertiesFolder, "line", typeLine);
		PropertyId propertyFont = createPropertyId(propertiesFolder, "font", typeFont);
		PropertyId propertyBgcolor = createPropertyId(propertiesFolder, "bgcolor", typeColor);
		PropertyId propertyFgcolor = createPropertyId(propertiesFolder, "fgcolor", typeColor);

		PropertyId propertyCSS = createPropertyId(propertiesFolder, "css", typeString);

		// Bind operators to layers
		Folder opBindingFolder = createFolder(getRootFolder(), "opBindings");

		LayerOperatorMultipleBinding layerOpBindingsA = createLayerOperatorsMultipleBinding(opBindingFolder, stackedLayersOperatorConfig);
		// createOperatorBinding(layerOpBindingsA, propertyIsVisible, operatorBooleanAnd);
		// createOperatorBinding(layerOpBindingsA, propertyIsAbstract, operatorBooleanAnd);
		// createOperatorBinding(layerOpBindingsA, propertyFill, operatorFillAverage);

		LayerOperatorMultipleBinding layerOpBindingsB = createLayerOperatorsMultipleBinding(opBindingFolder, stackedLayersOperatorMinimunConfig);
		// createOperatorBinding(layerOpBindingsB, propertyIsVisible, operatorBooleanOr);
		// createOperatorBinding(layerOpBindingsB, propertyIsAbstract, operatorBooleanOr);
		// createOperatorBinding(layerOpBindingsB, propertyFill, operatorFillAverage);

		LayerOperatorMultipleBinding layerOpBindingsAverage = createLayerOperatorsMultipleBinding(opBindingFolder, stackedLayersOperatorAverage);
		// createOperatorBinding(layerOpBindingsAverage, propertyIsVisible, operatorBooleanOr);
		// createOperatorBinding(layerOpBindingsAverage, propertyIsAbstract, operatorBooleanOr);
		// createOperatorBinding(layerOpBindingsAverage, propertyFill, operatorFillAverage);

	}

	/**
	 * Create the resource and add it the root folder.
	 *
	 * @return
	 */
	protected Folder createResourceAndRootFolder() {
		// Create a resource set.
		ResourceSet resourceSet = new ResourceSetImpl();

		// Register the default resource factory -- only needed for stand-alone!
		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
				Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());

		// Get the URI of the model file.
		URI fileURI = URI.createURI("config.layersconfig");

		// Create a resource for this file.
		resource = resourceSet.createResource(fileURI);
		Folder parent = LayersConfigFactory.eINSTANCE.createFolder();
		resource.getContents().add(parent);
		return parent;
	}


	/**
	 * @return the resource
	 */
	public Resource getResource() {
		return resource;
	}

	/**
	 * Get the root folder of the model.
	 * There is always a root folder
	 *
	 * @return
	 */
	public Folder getRootFolder() {
		return (Folder) getResource().getContents().get(0);
	}

	/**
	 * Get all {@link LayerOperatorConfig} contained in the model.
	 *
	 * @return
	 */
	public List<LayerOperatorConfig> getAllLayerOperatorConfig() {

		List<LayerOperatorConfig> res = new ArrayList<LayerOperatorConfig>();

		TreeIterator<EObject> iter = resource.getAllContents();
		while (iter.hasNext()) {
			EObject obj = iter.next();
			if (obj instanceof LayerOperatorConfig) {
				res.add((LayerOperatorConfig) obj);
			}
		}
		return res;
	}

	/**
	 * Get all object of the specified type contained in the model.
	 *
	 * @param type
	 *            The expected type for objects
	 *
	 * @return A list of object with the specified type.
	 */
	@SuppressWarnings("unchecked")
	public <T extends EObject> List<T> getAllOfType(Class<T> type) {
		List<T> res = new ArrayList<T>();

		TreeIterator<EObject> iter = resource.getAllContents();
		while (iter.hasNext()) {
			EObject obj = iter.next();
			if (type.isInstance(obj)) {
				res.add((T) obj);
			}
		}
		return res;
	}

	/**
	 * Get all operators config objects.
	 *
	 * @return
	 */
	public List<OperatorConfig> getAllOperatorConfig() {

		return getAllOfType(OperatorConfig.class);
	}


	/**
	 * Get all {@link OperatorBinding} declared in the model.
	 *
	 * @return
	 */
	public List<OperatorBinding> getAllOperatorBinding() {
		return getAllOfType(OperatorBinding.class);
	}


	/**
	 * Initialize the provided model with some defs for tests.
	 *
	 * @param model
	 */
	private void initLayersConfigModel(LayersConfigModel model) {

	}
}
