/*******************************************************************************
 *  Copyright (c) 2007 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.base;

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

import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jpt.core.internal.ITextRange;
import org.eclipse.jpt.core.internal.resource.persistence.PersistenceFactory;
import org.eclipse.jpt.core.internal.resource.persistence.XmlPersistence;
import org.eclipse.jpt.core.internal.resource.persistence.XmlPersistenceUnit;
import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;

public class Persistence extends JpaContextNode
	implements IPersistence
{	
	protected XmlPersistence xmlPersistence;
	
	protected final List<IPersistenceUnit> persistenceUnits;
	
	
	public Persistence(IPersistenceXml parent) {
		super(parent);
		this.persistenceUnits = new ArrayList<IPersistenceUnit>();
	}
	
	
	// **************** persistence units **************************************
	
	public ListIterator<IPersistenceUnit> persistenceUnits() {
		return new CloneListIterator<IPersistenceUnit>(persistenceUnits);
	}
	
	public IPersistenceUnit addPersistenceUnit() {
		return addPersistenceUnit(persistenceUnits.size());
	}
	
	// TODO - add better change support
	public IPersistenceUnit addPersistenceUnit(int index) {
		XmlPersistenceUnit xmlPersistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
		IPersistenceUnit persistenceUnit = createPersistenceUnit(xmlPersistenceUnit);
		persistenceUnits.add(index, persistenceUnit);
		xmlPersistence.getPersistenceUnits().add(xmlPersistenceUnit);
		fireListChanged(PERSISTENCE_UNITS_LIST);
		return persistenceUnit;
	}
	
	public void removePersistenceUnit(IPersistenceUnit persistenceUnit) {
		removePersistenceUnit(persistenceUnits.indexOf(persistenceUnit));
	}
	
	public void removePersistenceUnit(int index) {
		persistenceUnits.remove(index);
		xmlPersistence.getPersistenceUnits().remove(index);
		fireListChanged(PERSISTENCE_UNITS_LIST);
	}
	
	protected void addPersistenceUnit_(IPersistenceUnit persistenceUnit) {
		addPersistenceUnit_(persistenceUnits.size(), persistenceUnit);
	}
	
	protected void addPersistenceUnit_(int index, IPersistenceUnit persistenceUnit) {
		persistenceUnits.add(index, persistenceUnit);
		fireListChanged(PERSISTENCE_UNITS_LIST);
	}
	
	protected void removePersistenceUnit_(IPersistenceUnit persistenceUnit) {
		removePersistenceUnit_(persistenceUnits.indexOf(persistenceUnit));
	}
	
	protected void removePersistenceUnit_(int index) {
		persistenceUnits.remove(index);
		fireListChanged(PERSISTENCE_UNITS_LIST);
	}
	
	
	// **************** updating ***********************************************
	
	public void initialize(XmlPersistence xmlPersistence) {
		this.xmlPersistence = xmlPersistence;
		initializePersistenceUnits(xmlPersistence);
	}
	
	protected void initializePersistenceUnits(XmlPersistence persistence) {
		for (XmlPersistenceUnit xmlPersistenceUnit : persistence.getPersistenceUnits()) {
			this.persistenceUnits.add(createPersistenceUnit(xmlPersistenceUnit));
		}
	}

	public void update(XmlPersistence persistence) {
		this.xmlPersistence = persistence;
		Iterator<IPersistenceUnit> stream = persistenceUnits();
		Iterator<XmlPersistenceUnit> stream2 = persistence.getPersistenceUnits().iterator();
		
		while (stream.hasNext()) {
			IPersistenceUnit persistenceUnit = stream.next();
			if (stream2.hasNext()) {
				persistenceUnit.update(stream2.next());
			}
			else {
				removePersistenceUnit_(persistenceUnit);
			}
		}
		
		while (stream2.hasNext()) {
			addPersistenceUnit_(createPersistenceUnit(stream2.next()));
		}
	}
	
	protected IPersistenceUnit createPersistenceUnit(XmlPersistenceUnit xmlPersistenceUnit) {
		IPersistenceUnit persistenceUnit = jpaFactory().createPersistenceUnit(this);
		persistenceUnit.initialize(xmlPersistenceUnit);
		return persistenceUnit;
	}
	
	
	// *************************************************************************
	
	@Override
	public IPersistenceUnit persistenceUnit() {
		throw new UnsupportedOperationException("No PersistenceUnit in this context");
	}
	
	public ITextRange validationTextRange() {
		return this.xmlPersistence.validationTextRange();
	}


	@Override
	public void addToMessages(List<IMessage> messages, CompilationUnit astRoot) {
		super.addToMessages(messages, astRoot);
		
		//persistence root validation
		addNoPersistenceUnitMessage(messages);
		addMultiplePersistenceUnitMessage(messages);
		
		
		//persistence unit validation
		for (IPersistenceUnit pu : persistenceUnits){
			pu.addToMessages(messages, astRoot);
		}
	}
	
	protected void addNoPersistenceUnitMessage(List<IMessage> messages) {
		if (persistenceUnits.size() == 0) {
			messages.add(
					JpaValidationMessages.buildMessage(
						IMessage.HIGH_SEVERITY,
						IJpaValidationMessages.PERSISTENCE_NO_PERSISTENCE_UNIT,
						this, this.validationTextRange())
				);
		}
	}
	
	protected void addMultiplePersistenceUnitMessage(List<IMessage> messages) {
		if (persistenceUnits.size() > 1) {
			messages.add(
					JpaValidationMessages.buildMessage(
						IMessage.HIGH_SEVERITY,
						IJpaValidationMessages.PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS,
						this, this.validationTextRange())
				);
		}
	}
}
