package org.eclipse.wst.xsd.ui.internal.refactor.rename;

import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.TextChange;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.wst.common.core.search.SearchMatch;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xsd.ui.internal.refactor.RefactoringMessages;
import org.eclipse.wst.xsd.ui.internal.refactor.TextChangeManager;
import org.eclipse.wst.xsd.ui.internal.refactor.util.TextChangeCompatibility;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Node;

public class XMLComponentRenameParticipant extends RenameParticipant {
	
	protected SearchMatch match;

	protected TextChangeManager changeManager;
	protected List matches;

    
    
	protected boolean initialize(Object element) {
		
		if(getArguments() instanceof ComponentRenameArguments){
			// changeManger is passed in from the RenameComponentProcessor to collect all the changes
			changeManager = ((ComponentRenameArguments)getArguments()).getChangeManager();
		}
		
		return false;
	}
	
	public String getName() {
		return "XML Component Rename Participant";
	}

	public RefactoringStatus checkConditions(IProgressMonitor monitor,
			CheckConditionsContext context) throws OperationCanceledException {
		return null;
	}
	
	public TextChangeManager getChangeManager(){
		
		if(changeManager == null){
				changeManager = new TextChangeManager(false);
		}
		return changeManager;
		
	}
	
	private RefactoringStatus createRenameChanges(final IProgressMonitor monitor) throws CoreException {
		Assert.isNotNull(monitor);
		final RefactoringStatus status= new RefactoringStatus();
		try {
			monitor.beginTask("RefactoringMessages.RenameComponentRefactoring_searching", 1); 
			createRenameChanges(new SubProgressMonitor(monitor, 1));
			//updateChangeManager(new SubProgressMonitor(monitor, 1), status);
		} finally {
			monitor.done();
		}
		return status;
	}

	public Change createChange(IProgressMonitor pm) throws CoreException,
			OperationCanceledException {
		//System.out.println("createChange("  + getChangeManager() + ")" + matches.size());
		for (Iterator iter = matches.iterator(); iter.hasNext();) {
			SearchMatch match = (SearchMatch) iter.next();
			TextChange textChange = getChangeManager().get(match.getFile());
			String newName = getArguments().getNewName();
			String qualifier = "";
			if(getArguments() instanceof ComponentRenameArguments){
				qualifier = ((ComponentRenameArguments)getArguments()).getQualifier();
			}
			if(match.getObject() instanceof Node){
				Node node = (Node)match.getObject();
				if(node instanceof IDOMAttr){
					IDOMAttr attr = (IDOMAttr)node;
					IDOMElement element = (IDOMElement)attr.getOwnerElement() ;
					newName = getNewQName(element, qualifier, newName);
				}
				newName = RenameComponentProcessor.quoteString(newName);
			}
			
			ReplaceEdit replaceEdit = new ReplaceEdit(match.getOffset(), match.getLength(), newName );
			String editName = RefactoringMessages.getString("RenameComponentProcessor.Component_Refactoring_update_reference");
          //  System.out.println("textChange " + textChange + "/ replaceEdit " + replaceEdit);
			TextChangeCompatibility.addTextEdit(textChange, editName, replaceEdit);
   		}
		// don't create any change now, all the changes are in changeManger variable and will be combined in RenameComponentProcessor.postCreateChange method
		return null;
	}
	
	private static String getNewQName(Node node, String targetNamespace, String newName) {
		StringBuffer sb = new StringBuffer();
		if (newName != null) {
			String prefix = XSDConstants.lookupQualifier(node, targetNamespace);
			if (prefix != null && prefix.length() > 0) {
				sb.append(prefix);
				sb.append(":");
				sb.append(newName);
			} else {
				sb.append(newName);
			}
		} else {
			sb.append(newName);
		}

		return sb.toString();
	}

  public void setChangeManager(TextChangeManager changeManager)
  {
    this.changeManager = changeManager;
  }

}
