/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.xtext.oxtype.linking;

import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.osbp.xtext.oxtype.linking.JvmTypeAwareLinkingHelper.IJvmLinkCrossRefStringEnhancer;
import org.eclipse.xtext.linking.impl.DefaultLinkingService;
import org.eclipse.xtext.linking.impl.IllegalNodeException;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.IScopeProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Inject;

public class JvmTypeEnhancingLinkingService extends DefaultLinkingService {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(JvmTypeEnhancingLinkingService.class);

	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;

	@Inject
	private JvmTypeAwareLinkingHelper jvmTypeLinkingHelper;

	LinkingMetric metric = LinkingMetric.getInstance();
	
	/**
	 * @return the first element returned from the injected
	 *         {@link IScopeProvider} which matches the text of the passed
	 *         {@link INode node}
	 */
	public List<EObject> getLinkedObjects(EObject context, EReference ref,
			INode node) throws IllegalNodeException {
		final EClass requiredType = ref.getEReferenceType();
		if (requiredType == null)
			return Collections.<EObject> emptyList();

		String crossRefString = getCrossRefNodeAsString(node);
		if (crossRefString != null && !crossRefString.equals("")) {

			// enhance the cross reference string before scoping
			try {
				EStructuralFeature containingFeature = context
						.eContainingFeature();
				if (jvmTypeLinkingHelper.isJvmLink(containingFeature)) {
					IJvmLinkCrossRefStringEnhancer enhancer = jvmTypeLinkingHelper
							.getEnhancer(containingFeature);
					if (enhancer != null) {
						crossRefString = enhancer.enhance(context,
								containingFeature, crossRefString);
					}
					if (crossRefString == null || crossRefString.equals("")) {
						crossRefString = "LUN__UNDEFINED";
					}
				}
			} catch (Exception e) {
				LOGGER.error("{}", e);
			}

			String scopeKey = context.eClass().getEPackage().getNsPrefix()
					+ "." + context.eClass().getName() + "#"
					+ ref.getName();

			Date startScoping = new Date();
			final IScope scope = getScope(context, ref);
			Date scopeCreated = new Date();

			QualifiedName qualifiedLinkName = qualifiedNameConverter
					.toQualifiedName(crossRefString);

			// TimeLogger doScopeLog = TimeLogger.start(getClass());
			IEObjectDescription eObjectDescription = scope
					.getSingleElement(qualifiedLinkName);
			Date scopingDone = new Date();

			long creatingScopeTime = scopeCreated.getTime()
					- startScoping.getTime();
			long doScopingTime = scopingDone.getTime() - scopeCreated.getTime();

			metric.addMetric(scopeKey, creatingScopeTime, doScopingTime);

			// for debugging issues
			boolean clear = false;
			boolean print = false;
			if(clear) {
				metric.clear();
			}
			if(print) {
				metric.print();
			}
			
			if (eObjectDescription != null) {
				EObject result = eObjectDescription.getEObjectOrProxy();
				doCheckAndLog(context, ref, eObjectDescription);
				return Collections.singletonList(result);
			}
		}
		return Collections.emptyList();
	}

	/**
	 * This method can be overridden to do any kind of checks for logging
	 * issues.
	 * 
	 * @param context
	 * @param ref
	 * @param eObjectDescription
	 */
	protected void doCheckAndLog(EObject context, EReference ref,
			IEObjectDescription eObjectDescription) {

	}

	private String toRefName(EReference ref) {
		EClass type = ref.getEReferenceType();
		return type.getName() + "#" + ref.getName();
	}
}
