/*******************************************************************************
 * Copyright (c) 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.UniqueConstraint;
import org.eclipse.jpt.core.context.orm.OrmJpaContextNode;
import org.eclipse.jpt.core.context.orm.OrmUniqueConstraint;
import org.eclipse.jpt.core.resource.orm.XmlUniqueConstraint;
import org.eclipse.jpt.core.utility.TextRange;
import org.eclipse.jpt.utility.internal.CollectionTools;
import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;

public class GenericOrmUniqueConstraint extends AbstractOrmJpaContextNode
	implements OrmUniqueConstraint
{
	
	protected final List<String> columnNames;
	
	protected XmlUniqueConstraint resourceUniqueConstraint;
	
	protected UniqueConstraint.Owner owner;
	
	public GenericOrmUniqueConstraint(OrmJpaContextNode parent, UniqueConstraint.Owner owner, XmlUniqueConstraint resourceUniqueConstraint) {
		super(parent);
		this.owner = owner;
		this.columnNames = new ArrayList<String>();
		this.initialize(resourceUniqueConstraint);
	}
	
	public ListIterator<String> columnNames() {
		return new CloneListIterator<String>(this.columnNames);
	}

	public int columnNamesSize() {
		return this.columnNames.size();
	}

	public void addColumnName(int index, String columnName) {
		this.columnNames.add(index, columnName);
		this.resourceUniqueConstraint.getColumnNames().add(index, columnName);
		fireItemAdded(UniqueConstraint.COLUMN_NAMES_LIST, index, columnName);		
	}	
	
	protected void addColumnName_(int index, String columnName) {
		this.columnNames.add(index, columnName);
		fireItemAdded(UniqueConstraint.COLUMN_NAMES_LIST, index, columnName);		
	}	

	public void removeColumnName(String columnName) {
		this.removeColumnName(this.columnNames.indexOf(columnName));
	}

	public void removeColumnName(int index) {
		String removedColumnName = this.columnNames.remove(index);
		this.resourceUniqueConstraint.getColumnNames().remove(index);
		fireItemRemoved(UniqueConstraint.COLUMN_NAMES_LIST, index, removedColumnName);
	}
	
	protected void removeColumnName_(int index) {
		String removedColumnName = this.columnNames.remove(index);
		fireItemRemoved(UniqueConstraint.COLUMN_NAMES_LIST, index, removedColumnName);
	}

	public void moveColumnName(int targetIndex, int sourceIndex) {
		CollectionTools.move(this.columnNames, targetIndex, sourceIndex);
		this.resourceUniqueConstraint.getColumnNames().move(targetIndex, sourceIndex);
		fireItemMoved(UniqueConstraint.COLUMN_NAMES_LIST, targetIndex, sourceIndex);		
	}

	public TextRange getValidationTextRange() {
		return this.resourceUniqueConstraint.getValidationTextRange();
	}
	
	protected void initialize(XmlUniqueConstraint resourceUniqueConstraint) {
		this.resourceUniqueConstraint = resourceUniqueConstraint;
		this.initializeColumnNames(resourceUniqueConstraint);
	}
	
	protected void initializeColumnNames(XmlUniqueConstraint uniqueConstraint) {
		ListIterator<String> xmlColumnNames = new CloneListIterator<String>(uniqueConstraint.getColumnNames());
		
		for (String annotationColumnName : CollectionTools.iterable(xmlColumnNames)) {
			this.columnNames.add(annotationColumnName);
		}
	}
	
	public void update(XmlUniqueConstraint resourceUniqueConstraint) {
		this.resourceUniqueConstraint = resourceUniqueConstraint;
		this.updateColumnNames(resourceUniqueConstraint);
	}
	
	protected void updateColumnNames(XmlUniqueConstraint resourceUniqueConstraint) {
		ListIterator<String> xmlColumnNames = new CloneListIterator<String>(resourceUniqueConstraint.getColumnNames());
		
		int index = 0;
		for (String xmlColumnName : CollectionTools.iterable(xmlColumnNames)) {
			if (columnNamesSize() > index) {
				if (this.columnNames.get(index) != xmlColumnName) {
					addColumnName_(index, xmlColumnName);
				}
			}
			else {
				addColumnName_(index, xmlColumnName);			
			}
			index++;
		}
		
		for ( ; index < columnNamesSize(); ) {
			removeColumnName_(index);
		}
	}
}
