/*******************************************************************************
 * Copyright (c) 2007, 2008 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.core.internal.context.orm;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import org.eclipse.jpt.core.context.Query;
import org.eclipse.jpt.core.context.QueryHint;
import org.eclipse.jpt.core.context.java.JavaQuery;
import org.eclipse.jpt.core.context.orm.OrmJpaContextNode;
import org.eclipse.jpt.core.context.orm.OrmQuery;
import org.eclipse.jpt.core.context.orm.OrmQueryHint;
import org.eclipse.jpt.core.resource.orm.OrmFactory;
import org.eclipse.jpt.core.resource.orm.XmlQuery;
import org.eclipse.jpt.core.resource.orm.XmlQueryHint;
import org.eclipse.jpt.core.utility.TextRange;
import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;


public abstract class AbstractOrmQuery<E extends XmlQuery> extends AbstractOrmJpaContextNode 
	implements OrmQuery
{

	protected String name;

	protected String query;

	protected final List<OrmQueryHint> hints;

	protected E resourceQuery;
	
	protected AbstractOrmQuery(OrmJpaContextNode parent, E resourceQuery) {
		super(parent);
		this.hints = new ArrayList<OrmQueryHint>();
		this.initialize(resourceQuery);
	}

	protected E getResourceQuery() {
		return this.resourceQuery;
	}
	
	public String getName() {
		return this.name;
	}

	public void setName(String newName) {
		String oldName = this.name;
		this.name = newName;
		this.getResourceQuery().setName(newName);
		firePropertyChanged(Query.NAME_PROPERTY, oldName, newName);
	}

	public String getQuery() {
		return this.query;
	}

	public void setQuery(String newQuery) {
		String oldQuery = this.query;
		this.query = newQuery;
		this.getResourceQuery().setQuery(newQuery);
		firePropertyChanged(Query.QUERY_PROPERTY, oldQuery, newQuery);
	}

	public ListIterator<OrmQueryHint> hints() {
		return new CloneListIterator<OrmQueryHint>(this.hints);
	}
	
	public int hintsSize() {
		return this.hints.size();
	}
	
	public OrmQueryHint addHint(int index) {
		XmlQueryHint resourceQueryHint = OrmFactory.eINSTANCE.createXmlQueryHint();
		OrmQueryHint contextQueryHint = buildQueryHint(resourceQueryHint);
		this.hints.add(index, contextQueryHint);
		this.getResourceQuery().getHints().add(index, resourceQueryHint);
		this.fireItemAdded(Query.HINTS_LIST, index, contextQueryHint);
		return contextQueryHint;
	}

	protected void addHint(int index, OrmQueryHint queryHint) {
		addItemToList(index, queryHint, this.hints, Query.HINTS_LIST);
	}
	
	protected void addHint(OrmQueryHint queryHint) {
		this.addHint(this.hints.size(), queryHint);
	}
	
	public void removeHint(QueryHint queryHint) {
		removeHint(this.hints.indexOf(queryHint));
	}
	
	public void removeHint(int index) {
		OrmQueryHint queryHint = this.hints.remove(index);
		this.getResourceQuery().getHints().remove(index);
		fireItemRemoved(Query.HINTS_LIST, index, queryHint);
	}

	protected void removeHint_(OrmQueryHint queryHint) {
		removeItemFromList(queryHint, this.hints, Query.HINTS_LIST);
	}
	
	public void moveHint(int targetIndex, int sourceIndex) {
		this.getResourceQuery().getHints().move(targetIndex, sourceIndex);
		moveItemInList(targetIndex, sourceIndex, this.hints, Query.HINTS_LIST);		
	}

	
	protected void initialize(E resourceQuery) {
		this.resourceQuery = resourceQuery;
		this.name = resourceQuery.getName();
		this.query = resourceQuery.getQuery();
		this.initializeHints(resourceQuery);
	}
	
	protected void initializeHints(E resourceQuery) {
		for (XmlQueryHint resourceQueryHint : resourceQuery.getHints()) {
			this.hints.add(buildQueryHint(resourceQueryHint));
		}
	}

	protected OrmQueryHint buildQueryHint(XmlQueryHint resourceQueryHint) {
		return getJpaFactory().buildOrmQueryHint(this, resourceQueryHint);
	}
	
	public void update(E resourceQuery) {
		this.resourceQuery = resourceQuery;
		this.setName(resourceQuery.getName());
		this.setQuery(resourceQuery.getQuery());
		this.updateHints(resourceQuery);
	}
	
	protected void updateHints(E resourceQuery) {
		ListIterator<OrmQueryHint> contextHints = hints();
		ListIterator<XmlQueryHint> resourceHints = new CloneListIterator<XmlQueryHint>(resourceQuery.getHints());//prevent ConcurrentModificiationException
		
		while (contextHints.hasNext()) {
			OrmQueryHint contextHint = contextHints.next();
			if (resourceHints.hasNext()) {
				contextHint.update(resourceHints.next());
			}
			else {
				removeHint_(contextHint);
			}
		}
		
		while (resourceHints.hasNext()) {
			addHint(buildQueryHint(resourceHints.next()));
		}
	}
	
	public boolean overrides(Query query) {
		if (getName() == null) {
			return false;
		}
		// this isn't ideal, but it will have to do until we have further adopter input
		return this.getName().equals(query.getName()) && query instanceof JavaQuery;
	}

	public TextRange getValidationTextRange() {
		return this.getResourceQuery().getValidationTextRange();
	}
	
	public TextRange getNameTextRange() {
		return this.getResourceQuery().getNameTextRange();
	}

	@Override
	public void toString(StringBuilder sb) {
		sb.append(this.name);
	}

}
