/*******************************************************************************
 * Copyright (c) 2008, 2009 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.jpa1.context.orm;

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

import org.eclipse.jpt.core.context.XmlContextNode;
import org.eclipse.jpt.core.context.orm.OrmUniqueConstraint;
import org.eclipse.jpt.core.internal.context.orm.AbstractOrmXmlContextNode;
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 AbstractOrmXmlContextNode
	implements OrmUniqueConstraint
{
	
	protected final List<String> columnNames;
	
	protected XmlUniqueConstraint resourceUniqueConstraint;
	
	protected Owner owner;
	
	public GenericOrmUniqueConstraint(XmlContextNode parent, 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(COLUMN_NAMES_LIST, index, columnName);		
	}	
	
	protected void addColumnName_(int index, String columnName) {
		this.addItemToList(index, columnName, this.columnNames, COLUMN_NAMES_LIST);
	}	

	protected void addColumnName_(String columnName) {
		this.addItemToList(columnName, this.columnNames, COLUMN_NAMES_LIST);
	}	

	protected void setColumnName_(int index, String columnName) {
		this.setItemInList(index, columnName, this.columnNames, COLUMN_NAMES_LIST);
	}	

	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(COLUMN_NAMES_LIST, index, removedColumnName);
	}
	
	protected void removeColumnName_(int index) {
		this.removeItemFromList(index, this.columnNames, COLUMN_NAMES_LIST);
	}

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

	public TextRange getValidationTextRange() {
		return this.resourceUniqueConstraint.getValidationTextRange();
	}
	
	protected void initialize(XmlUniqueConstraint xmlUniqueConstraint) {
		this.resourceUniqueConstraint = xmlUniqueConstraint;
		this.initializeColumnNames();
	}
	
	protected void initializeColumnNames() {
		for (String annotationColumnName : this.resourceUniqueConstraint.getColumnNames()) {
			this.columnNames.add(annotationColumnName);
		}
	}
	
	public void update(XmlUniqueConstraint xmlUniqueConstraint) {
		this.resourceUniqueConstraint = xmlUniqueConstraint;
		this.updateColumnNames();
	}
	
	protected void updateColumnNames() {
		int index = 0;
		for (String xmlColumnName : this.resourceUniqueConstraint.getColumnNames()) {
			if (this.columnNames.size() > index) {
				if ( ! this.columnNames.get(index).equals(xmlColumnName)) {
					this.setColumnName_(index, xmlColumnName);
				}
			}
			else {
				this.addColumnName_(xmlColumnName);			
			}
			index++;
		}
		
		while (index < this.columnNames.size()) {
			this.removeColumnName_(index);
		}
	}
}
