/**
 * 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.xtext.oxtype.resource;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.osbp.xtext.oxtype.hooks.ExtensionsInferrerDelegate;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer;
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.JvmAnnotationReferenceBuilder;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypeReferenceBuilder;
import org.eclipse.xtext.xbase.lib.Extension;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Inject;

public class ExtendedModelInferrer extends AbstractModelInferrer {

	protected Logger log = LoggerFactory.getLogger(ExtendedModelInferrer.class);

	private @Inject JvmAnnotationReferenceBuilder.Factory annotationRefBuilderFactory;
	private @Inject JvmTypeReferenceBuilder.Factory typeRefBuilderFactory;

	protected @Extension JvmAnnotationReferenceBuilder _annotationTypesBuilder;
	protected @Extension JvmTypeReferenceBuilder _typeReferenceBuilder;

	@Inject
	private ExtensionsInferrerDelegate inferrerDelegate;

	/**
	 * @noreference This method is called by the framework
	 * @nooverride
	 */
	void setContext(Resource resource) {
		_annotationTypesBuilder = annotationRefBuilderFactory.create(resource
				.getResourceSet());
		_typeReferenceBuilder = typeRefBuilderFactory.create(resource
				.getResourceSet());
	}

	public void infer(EObject e,
			final/* @NonNull */IJvmDeclaredTypeAcceptor acceptor,
			boolean preIndexingPhase) {
		_infer(e, acceptor, preIndexingPhase);
	}

	public void _infer(EObject e, /* @NonNull */
			IJvmDeclaredTypeAcceptor acceptor, boolean preIndexingPhase) {
		for (EObject child : e.eContents()) {
			infer(child, acceptor, preIndexingPhase);
		}
	}

	public void inferTypesOnly(EObject e,
			final/* @NonNull */IJvmDeclaredTypeAcceptor acceptor,
			boolean preIndexingPhase) {

		// then iterate the contents
		_inferTypesOnly(e, acceptor, preIndexingPhase);
	}

	public void _inferTypesOnly(EObject e, IJvmDeclaredTypeAcceptor acceptor,
			boolean preIndexingPhase) {

		// pass inferring to delegates first
		inferTypesOnlyByDelegates(e, acceptor, preIndexingPhase);

		for (EObject child : e.eContents()) {
			inferTypesOnly(child, acceptor, preIndexingPhase);
		}
	}

	/**
	 * Delegates the inferTypes call to the delegates.
	 * 
	 * @param semanticElement
	 * @param acceptor
	 * @param preIndexingPhase
	 */
	protected void inferTypesOnlyByDelegates(EObject semanticElement,
			IJvmDeclaredTypeAcceptor acceptor, boolean preIndexingPhase) {
		inferrerDelegate.inferTypesOnly(semanticElement, acceptor,
				preIndexingPhase);
	}

	public void inferFullState(JvmType type, EObject e,
			IJvmDeclaredTypeAcceptor acceptor, boolean preIndexingPhase,
			String selector) {
	}

	/**
	 * Delegates the inferTypes call to the delegates.
	 * 
	 * @param jvmType
	 * @param semanticElement
	 * @param acceptor
	 * @param preIndexingPhase
	 * @param selector
	 */
	public void inferFullStateByDelegates(JvmType jvmType,
			EObject semanticElement, IJvmDeclaredTypeAcceptor acceptor,
			boolean preIndexingPhase, String selector) {
		inferrerDelegate.inferFullState((JvmDeclaredType) jvmType,
				semanticElement, acceptor, preIndexingPhase, selector);
	}
}
