/*******************************************************************************
 * 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.emf.ecore.EObject;
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;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;


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);
		boolean moduleInXML = false;
		//Check if module to remove is in xml
		ICommonApplication mergedApp = (ICommonApplication)earModel.getModelObject();
		ICommonModule module = mergedApp.getFirstEARModule(moduleURI);
		if (module != null) {
			IFile file = WorkbenchResourceHelper.getFile((EObject)module);
			if (file != null && file.exists())
				moduleInXML = true;
		}
		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);
		//If change is to "merged model" only - remove from merged model
		if (!moduleInXML)
			mergedApp.getEARModules().remove(module);
	}
	
	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;
	}


}
