/*******************************************************************************
 * Copyright (c) 2010, 2011 Oracle Corporation and others.
 * 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:
 *    Oracle Corporation - initial API and implementation and/or initial documentation
 *******************************************************************************/

package org.eclipse.jst.jsf.common.metadata.query.internal.taglib;

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

import org.eclipse.core.resources.IProject;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelManager;
import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModelManagerFactory;
import org.eclipse.jst.jsf.common.metadata.query.AbstractEntityQueryVisitor;
import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
import org.eclipse.jst.jsf.common.metadata.query.internal.IHierarchicalEntityVisitor;
import org.eclipse.jst.jsf.common.metadata.query.internal.IPredicateMatcher.MATCH;
import org.eclipse.jst.jsf.common.metadata.query.internal.SearchControl;
import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleResultSet;

/**
 * @author gekessle
 *
 */
public class TaglibDomainEntityQuerySpecVisitor extends AbstractEntityQueryVisitor implements IHierarchicalEntityVisitor {
	private HierarchicalSearchControl 			_control;
	private ITaglibDomainEntityPredicateMatcher	_matcher;
	private IMetaDataDomainContext 				_context;
	private List<Entity> 						_entityResults;
	private Model 								_initialEntity;
	private boolean 							_stop;

	/**
	 * Constructor with default SearchControl 
	 * @param context 
	 * @param matcher
	 */
	public TaglibDomainEntityQuerySpecVisitor(final IMetaDataDomainContext context, final ITaglibDomainEntityPredicateMatcher matcher) {
		this(context, matcher, new HierarchicalSearchControl());
	}
	
	/**
	 * Constructor 
	 * @param context 
	 * @param matcher
	 * @param control 
	 */
	public TaglibDomainEntityQuerySpecVisitor(final IMetaDataDomainContext context, final ITaglibDomainEntityPredicateMatcher matcher, final HierarchicalSearchControl control) {
		_matcher = matcher;
		_context = context;		
		_control = control;
	}

	/**
	 * @return Set of {@link Entity}s matching the entity query spec
	 * Note: does not support wild card match of models yet.
	 */
	public IResultSet<Entity> findEntities() {// throws InvalidQuerySpecification, MetaDataException {
		_matcher.reset();
		
		//first find model according to matcher...   
		//DOES NOT SUPPORT WILD CARDS FOR MODEL URI YET!!!
		//we cannot support wild cards because models are loaded lazily; even their id's.
		final IMetaDataModelManager mgr = MetaDataModelManagerFactory.getMetaDataModelManagerInstance(getProject());
		if (mgr != null) {
			final Model model= mgr.getModel(getModelContext());
			findEntities(model);			
		} else {
			//throw err?
		}
		return new SimpleResultSet<Entity>(getInternalEntityResults());
	}

	private void findEntities(final Model model) {

		if (model != null){
			_initialEntity = model;	
			_initialEntity.accept(this);			
		}

	}

	private List<Entity> getInternalEntityResults(){
		if (_entityResults == null){
			_entityResults = new ArrayList<Entity>();
		}
		return _entityResults;
	}
	
	private IMetaDataModelContext getModelContext() {
		return new MetaDataModelContext(getProject(), _context.getDomainId(), _matcher.getUri());
	}

	private IProject getProject() {		
		return (IProject)_context.getAdapter(IProject.class);
	}

	public boolean visitEnter(final Entity entity) {
		_matcher.pushLevel();
		if (_matcher.getCurrentLevel() <= _matcher.getMaxLevel()) {
			final MATCH match = _matcher.matches(entity);
			if (match == MATCH.FULLY) {
				getInternalEntityResults().add(entity);
				checkShouldStopVisitingEntities();
				return false;
			}
			else if (match == MATCH.PARTIALLY) {
				return true;
			}
		}
		return false;
	}

	public boolean stopVisiting() {
		return _stop;
	}

	private void checkShouldStopVisitingEntities(){
		//implement how to set stop to signal to the entity accept() to skip visiting
		if (_stop == false
				&& _control.getCountLimit()== getInternalEntityResults().size() 
				&& _control.getCountLimit() != SearchControl.COUNT_LIMIT_NONE )
			
			_stop = true;
	}

	public boolean visitLeave(Entity entity) {
//		_stop = _matcher.checkShouldStopVisitingEntities();
//		if (entity != _initialEntity)
//			_entityQuery.popLevel();
		if (entity != _initialEntity) 
			_matcher.popLevel();
		return true;
	}
	
	
	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor#visit(org.eclipse.jst.jsf.common.metadata.Entity)
	 */
	public void visit(final Entity key) {
		//do nothing... all work now done in visitEnter/visitLeave
	}
	
}
