/*****************************************************************************
 * Copyright (c) 2018 CEA LIST 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
 *
 * Contributors:
 *   CEA LIST - Initial API and implementation
 *   
 *****************************************************************************/

package org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.custom;

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

import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.LayersException;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.command.ComputePropertyValueCommand;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.LayerExpression;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.LayersStack;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.Property;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.TopLayerOperatorImpl;

/**
 * @author QL238289
 *
 */
public class CustomTopLayerOperatorImpl extends TopLayerOperatorImpl {

	/**
	 * Get the command to compute the required property value.
	 * Walk all layers and return the first cmd that is not null for specified view and property.
	 *
	 * @see org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.LayerExpressionImpl#getComputePropertyValueCommand(org.eclipse.gmf.runtime.notation.View, org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.Property)
	 *
	 * @param view
	 * @param property
	 * @return
	 * @throws LayersException
	 */
	@Override
	public ComputePropertyValueCommand getComputePropertyValueCommand(View view, Property property) throws LayersException {

		// Walk all layers and return the first cmd that is not null for specified view and property.
		for (LayerExpression layer : getLayers()) {

			ComputePropertyValueCommand cmd = layer.getComputePropertyValueCommand(view, property);
			if (cmd != null) {
				return cmd;
			}
		}
		// Nothing found
		return null;

	}

	/**
	 * For each property, add the first property value in the list of result.
	 *
	 * @see org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.LayerExpressionImpl#getPropertiesComputePropertyValueCommand(org.eclipse.gmf.runtime.notation.View, java.util.List)
	 *
	 * @param view
	 * @param property
	 * @return
	 * @throws LayersException
	 */
	@Override
	public List<ComputePropertyValueCommand> getPropertiesComputePropertyValueCommand(View view, List<Property> properties) throws LayersException {

		// Simple implementation
		// TODO Check if we can optimize

		// the result list
		List<ComputePropertyValueCommand> resCmds = new ArrayList<ComputePropertyValueCommand>(properties.size());
		boolean isCmdFound = false;

		for (Property property : properties) {
			if (property == null) {
				resCmds.add(null);
				continue;
			}

			ComputePropertyValueCommand cmd = getComputePropertyValueCommand(view, property);
			if (cmd != null) {
				isCmdFound = true;
			}
			resCmds.add(cmd);


		}
		// Return appropriate result
		if (isCmdFound) {
			return resCmds;
		} else {
			// No command ==> null
			return null;
		}
	}

	/**
	 * For each view, add the first property value in the list of result.
	 *
	 *
	 * @see org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.LayerExpressionImpl#getViewsComputePropertyValueCommand(java.util.List, org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.Property)
	 *
	 * @param view
	 * @param property
	 * @return
	 * @throws LayersException
	 */
	@Override
	public List<ComputePropertyValueCommand> getViewsComputePropertyValueCommand(List<View> views, Property property) throws LayersException {

		// Simple implementation
		// TODO Check if we can optimize

		// the result list
		List<ComputePropertyValueCommand> resCmds = new ArrayList<ComputePropertyValueCommand>(views.size());
		boolean isCmdFound = false;

		for (View view : views) {
			if (view == null) {
				resCmds.add(null);
				continue;
			}

			ComputePropertyValueCommand cmd = getComputePropertyValueCommand(view, property);
			if (cmd != null) {
				isCmdFound = true;
			}
			resCmds.add(cmd);
		}

		// Return appropriate result
		if (isCmdFound) {
			return resCmds;
		} else {
			// No command ==> null
			return null;
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	@Override
	public void addLayer(LayerExpression layer) {
		// getLayers().add(layer);
		// Add layer on top of the stack.
		getLayers().add(0, layer);
	}

	/**
	 * Propagate the change to children
	 *
	 * @see org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.LayerExpressionImpl#setIsBranchEnabled(boolean)
	 *
	 * @param newIsBranchEnabled
	 * 
	 * @generated
	 */
	@Override
	public void setIsBranchEnabled(boolean newIsBranchEnabled) {
		// First, set the value.
		super.setIsBranchEnabled(newIsBranchEnabled);
		// Now, propagate
		boolean value = isBranchEnabled();
		for (LayerExpression layer : getLayers()) {
			layer.setIsBranchEnabled(value);
		}
	}

	/**
	 * Set the value then propagate to children nodes.
	 *
	 * @see org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.LayerExpressionImpl#setOwningLayersStack(org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.LayersStack)
	 *
	 * @param newOwningLayersStack
	 * 
	 * @generated
	 */
	@Override
	public void setOwningLayersStack(LayersStack newOwningLayersStack) {
		// Set the value
		super.setOwningLayersStack(newOwningLayersStack);
		// Now propagate to children
		LayersStack value = getOwningLayersStack();
		for (LayerExpression layer : getLayers()) {
			layer.setOwningLayersStack(value);
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * Start this element after its reloading by EMF
	 * This method is called recursively by the parent of this element.
	 *
	 * <!-- end-user-doc -->
	 *
	 * @throws LayersException
	 * @generated
	 */
	@Override
	public void attach() throws LayersException {
		// Try to attach this Layer
		super.attach();
		// attach children
		for (LayerExpression l : getLayers()) {
			l.attach();
		}
	}

	/**
	 *
	 * @see org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.layers.impl.LayerExpressionImpl#detach()
	 *
	 * @throws LayersException
	 * @generated
	 */
	@Override
	public void detach() throws LayersException {
		// Detach this Layer
		super.detach();
		// detach children
		for (LayerExpression l : getLayers()) {
			l.detach();
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 *
	 * @deprecated unless we need it again
	 * @generated
	 */
	@Deprecated
	@Override
	public void attachToLayersStack(LayersStack owningLayersStack) {

		// the owning stack
		setOwningLayersStack(owningLayersStack);

		// Ensure child is started, if any
		for (LayerExpression l : getLayers()) {
			l.attachToLayersStack(owningLayersStack);
		}

		// Start local behaviors
		startBehaviors();
	}
}
