/**
 ********************************************************************************
 * Copyright (c) 2015-2020 Robert Bosch GmbH.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */

package org.eclipse.app4mc.amalthea.model.provider;

import java.util.Collection;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;

public class AmaltheaItemProviderAdapter extends ItemProviderAdapter {

	public AmaltheaItemProviderAdapter(final AdapterFactory adapterFactory) {
		super(adapterFactory);
	}

	@Override
	public String getCreateChildText(final Object owner, final Object feature, final Object child, final Collection<?> selection) {

		if (!(feature instanceof EStructuralFeature) || !(child instanceof EObject)) {
			// fallback
			return super.getCreateChildText(owner, feature, child, selection);
		}

		EStructuralFeature childFeature = (EStructuralFeature) feature;
		Object childObject = child;

		// Handle FeatureMaps
		if (FeatureMapUtil.isFeatureMap(childFeature)) {
			final FeatureMap.Entry entry = (FeatureMap.Entry) child;
			childFeature = entry.getEStructuralFeature();
			childObject = entry.getValue();
		}

		final String featureText = getFeatureText2(childFeature);
		final String childTypeText = getTypeText(childObject);

		// Attribute => Use feature name as action text
		if (childFeature instanceof EAttribute) {
			return getTypeText((EAttribute) childFeature);
		}

		// More than one action ==> Use Submenu
		if (menuHasManyActions(childFeature, owner)) {
			return featureText + " | " + childTypeText; //$NON-NLS-1$
		}

		// Use flat action text (without prefix)

		// (Feature name == Type name) ==> Use name as action text
		if (featureText.equals(childTypeText)) {
			return childTypeText;
		}

		if (childFeature.isMany()) {
			// Plural+Singular ==> Use type name as action text
			String trimmedType = childTypeText;
			if (childTypeText.toUpperCase().startsWith("HW ") || childTypeText.toUpperCase().startsWith("OS ")) {
				trimmedType = childTypeText.substring(3);
			}
			String substring = trimmedType.substring(0, trimmedType.length() - 1);
			if (featureText.toLowerCase().startsWith(substring.toLowerCase())) {
				return trimmedType;
			}
		}

		// flat default
		return featureText;
	}


	private String getFeatureText2(EStructuralFeature feature) {
		String text = getFeatureText(feature);

		// use singular
		if (text.equals("Entries")) return "Entry";
		if (text.equals("Stimuli")) return "Stimulus";
		if (text.endsWith("Items")
				|| text.endsWith("Values")
				|| text.endsWith("Requirements")
				|| text.endsWith("Constraints")
				|| text.endsWith("Definitions")
				|| text.endsWith("Domains")
				|| text.endsWith("Components")
				|| text.endsWith("Systems")
				|| text.endsWith("Modules")
				|| text.endsWith("Clocks")
				|| text.endsWith("Events")) {
			return text.substring(0, text.length() - 1);
		}

		return text;
	}

	private boolean menuHasManyActions(final EStructuralFeature feature, final Object owner) {
		final EList<Object> newChildDescriptors = new BasicEList<>();
		collectNewChildDescriptors(newChildDescriptors, owner);

		int counter = 0;
		for (final Object obj : newChildDescriptors) {
			if (obj instanceof CommandParameter) {
				CommandParameter comParam = (CommandParameter) obj;
				if (feature.equals(comParam.getEStructuralFeature())) {
					counter++;
					if (counter > 1) {
						return true;
					}
				}
			}
		}

		return false;
	}

}
