/*******************************************************************************
 * Copyright (c) 2008, 2009 IBM Corporation and others.
 * 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.javaee.ltk.core.change;

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

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.model.IEARModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler;
import org.eclipse.jst.jee.application.ICommonApplication;
import org.eclipse.jst.jee.application.ICommonModule;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;


public class EARReferenceRemoveChange extends Change {

	
	public EARReferenceRemoveChange(IProject referencingEARProject, IProject projectToRemove) {
		super();
		this.referencingEARProject = referencingEARProject;
		this.projectToRemove = projectToRemove;
		this.referencingEARProjectComp = ComponentCore.createComponent(referencingEARProject);
		cachedRefs = referencingEARProjectComp.getReferences();
		this.projectToRemoveComp = ComponentCore.createComponent(projectToRemove);
		earModel = (IEARModelProvider)ModelProviderManager.getModelProvider(referencingEARProject);
		moduleURI = earModel.getModuleURI(projectToRemoveComp);
	}

	IProject referencingEARProject = null;
	IVirtualComponent referencingEARProjectComp = null;
	IProject projectToRemove = null;
	IVirtualComponent projectToRemoveComp = null;
	IVirtualReference[] cachedRefs = null;
	IEARModelProvider earModel = null;
	String moduleURI = null;
	@Override
	public Object getModifiedElement() {
		return null;
	}

	@Override
	public String getName() {
		String name = NLS.bind( RefactoringResourceHandler.Remove_JavaEE_References, 
				new Object[] {projectToRemove.getName()});
		name += referencingEARProject.getName();
		return name;
	}

	@Override
	public void initializeValidationData(IProgressMonitor pm) {
	}

	@Override
	public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException,
			OperationCanceledException {
	return null;
	}

	@Override
	public Change perform(IProgressMonitor pm) throws CoreException {
		updateEARDD();
		removeReferencedComponents(pm);
		return null;
	}
	
	@Override
	public ChangeDescriptor getDescriptor() {
		return null;
	}
	
	private void updateEARDD() {
		if (!referencingEARProject.isAccessible())
			return;
		J2EEComponentClasspathUpdater.getInstance().queueUpdateEAR(referencingEARProject);
		
		earModel.modify(new Runnable() {
			public void run() {
				ICommonApplication application = (ICommonApplication)earModel.getModelObject();
				if (application == null)
					return;
				IVirtualComponent moduleComponent = projectToRemoveComp.getComponent();
				if(!moduleComponent.isBinary()){
					J2EEComponentClasspathUpdater.getInstance().queueUpdateModule(moduleComponent.getProject());
				}
			
				removeModule(application, moduleURI); 
				IVirtualFile vFile = referencingEARProjectComp.getRootFolder().getFile(moduleURI);
				IFile iFile = vFile.getUnderlyingFile();
				if(iFile.exists()){
					try {
						iFile.delete(true, new NullProgressMonitor());
					} catch (CoreException e) {
						J2EEPlugin.logError(e);
					}
				}
			
			}
		}, null);
	}
	
	protected void removeModule(ICommonApplication application, String moduleURI) {
		ICommonModule module = application.getFirstEARModule(moduleURI);
		application.getEARModules().remove(module);
	}
	
	protected void removeReferencedComponents(IProgressMonitor monitor) {
		
		if (referencingEARProjectComp == null || !referencingEARProjectComp.getProject().isAccessible() || referencingEARProjectComp.isBinary()) return;
		
		IVirtualReference [] existingReferencesArray = cachedRefs;
		if(existingReferencesArray == null || existingReferencesArray.length == 0){
			return;
		}
		List existingReferences = new ArrayList();
		for(int i=0;i<existingReferencesArray.length; i++){
			existingReferences.add(existingReferencesArray[i]);
		}
		List targetprojectList = new ArrayList();
		if (projectToRemoveComp==null )
				return;
		IVirtualReference ref = findMatchingReference(existingReferences, projectToRemoveComp, null);
		//if a ref was found matching the specified deployPath, then remove it
		if(ref != null){
			removeRefereneceInComponent(referencingEARProjectComp, ref);
			existingReferences.remove(ref);
			//after removing the ref, check to see if it was the last ref removed to that component
			//and if it was, then also remove the project reference
			ref = findMatchingReference(existingReferences, projectToRemoveComp);
			if(ref == null){
				IProject targetProject = projectToRemoveComp.getProject();
				targetprojectList.add(targetProject);
			}
		}
		
		try {
			ProjectUtilities.removeReferenceProjects(referencingEARProjectComp.getProject(),targetprojectList);
		} catch (CoreException e) {
			J2EEPlugin.logError(e);
		}		
		
	}
	
	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp) {
		return findMatchingReference(existingReferences, comp, null);
	}

	protected void removeRefereneceInComponent(IVirtualComponent component, IVirtualReference reference) {
		((VirtualComponent)component.getComponent()).removeReference(reference);
	}
	
	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp, IPath path) {
		for(int i=0;i<existingReferences.size(); i++){
			IVirtualReference ref = (IVirtualReference)existingReferences.get(i);
			IVirtualComponent c = ref.getReferencedComponent();
			if(c != null && c.getName().equals(comp.getName())){
				if(path == null){
					return ref;
				} else if(path.equals(ref.getRuntimePath())){
					return ref;
				}
			}
		}
		return null;
	}


}
