/*
 * Licensed Materials - Property of IBM,
 * WebSphere Studio Workbench
 * (c) Copyright IBM Corp 1999, 2000
 */

package org.eclipse.jdt.internal.ui.reorg;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProvider;

import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageDeclaration;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;

import org.eclipse.jdt.ui.JavaElementLabelProvider;

import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.jdt.internal.ui.javaeditor.ISavePolicy;
import org.eclipse.jdt.internal.ui.util.JdtHackFinder;


public class CUSavePolicy implements ISavePolicy {
	
	private static final String PREFIX= "SmartSave.";
	private static final String RENAME_CU= "rename_cu.";
	private static final String MOVE_CU= "move_cu.";
	private static final String CREATE_PKG= "create_pkg.";
	private static final String PICK_PKG= "pick_pkg.";
	private static final String EXCEPTION= "exception.";

	private String fOldTypeName;

	/**
	 * 
	 * @return com.oti.leapfrog.javamodel.ILFType
	 * @param cu com.oti.leapfrog.javamodel.LFCompilationUnit
	 */
	protected IType getMainType(ICompilationUnit cu) throws JavaModelException {
		IType[] p= cu.getTypes();
		if (p.length == 1)
			return p[0];
		for (int i= 0; i < p.length; i++) {
			if (Flags.isPublic(p[i].getFlags()))
				return p[i];
		}
		return null;
	}
	protected String makeMainTypeName(String cuName) {
		if (cuName.endsWith(".java"))
			return cuName.substring(0, cuName.length()-5);
		return cuName;
	}
	/**
	 * 
	 * @param cu com.oti.leapfrog.javamodel.LFCompilationUnit
	 * @param info CompilationUnitInfo
	 */
	protected String handleTypeNameChanged(final Shell shell, ICompilationUnit cu, String oldName) throws JavaModelException {
		IType publicType= getMainType(cu);
		if (publicType != null) {
			String typeName= publicType.getElementName();
			if (typeName.equals(oldName))
				return null;
			renameConstructors(publicType, oldName, typeName);
			if (!typeName.equals(makeMainTypeName(cu.getElementName()))) {
				if (shouldRenameCU(shell, typeName)) {
					return typeName+".java";
				}
			}
		}
		return null;
	}
	private boolean shouldRenameCU(final Shell shell, String typeName) {
		final String cuName= typeName+".java";
		String message= JavaPlugin.getResourceString(PREFIX+RENAME_CU+"message");
		String title= JavaPlugin.getResourceString(PREFIX+RENAME_CU+"title");
		return confirm(shell, title, message, new Object[] { cuName });
	}
	
	private boolean confirm(final Shell shell,final String title, final String format, final Object[] args) {
		final String message= MessageFormat.format(format, args);
		final boolean[] confirmed= new boolean[] {false};
		Runnable r= new Runnable() {
			public void run() {
				if (MessageDialog.openConfirm(shell, title, message)) {
					confirmed[0]= true;
				}
			}
		};
		
		
		shell.getDisplay().syncExec(r);
		
		return confirmed[0];
	}

/**
 * 
 * @param t com.oti.leapfrog.javamodel.ILFType
 */
protected void renameConstructors(IType t, String oldName, String newName) throws JavaModelException {
	JdtHackFinder.fixMeSoon("1G3FV4S: ITPJCORE:WIN - DOMException when renaming constructor");
	if (oldName == null)
		return;
	IMethod[] p= t.getMethods();
	for (int i= 0; i < p.length; i++) {
		if (oldName.equals(p[i].getElementName()))
			p[i].rename(newName, true, null);
	}
}
/**
 * 
 * @param cu com.oti.leapfrog.javamodel.LFCompilationUnit
 * @param typeName java.lang.String
 */
protected String checkOverwriteCU(final Shell shell, final ICompilationUnit cu, final IPackageFragment newPackage, final String newName) {
	final INamingPolicy namingPolicy= ReorgSupportFactory.createNamingPolicy(cu);
	class Runner implements Runnable {
		public String fNewName= null;
		
		public void run() {
				NameClashDialog dialog= new NameClashDialog(shell, new IInputValidator() {
					public String isValid(String newText) {
						return namingPolicy.isValidNewName(cu, newPackage, newText);
					}
				}, newName, true);
				if (dialog.open() == dialog.CANCEL)
					return;
				if (!dialog.isReplace())
					fNewName= dialog.getNewName();
				else
					fNewName= newName;
			}
	};
	if (namingPolicy.isValidNewName(cu, newPackage, newName) != null) {
		Runner r= new Runner();
		shell.getDisplay().syncExec(r);
		return r.fNewName;
	}
	return newName;
}
/**
 * collectInfo method comment.
 */
public void preSave(ICompilationUnit element) {
	ICompilationUnit cu= (ICompilationUnit)element;
	fOldTypeName= null;
	try {
		IType t= getMainType(cu);
		if (t != null)
			fOldTypeName= t.getElementName();
	} catch (JavaModelException e) {
	}
}
	/**
	 * 
	 * @param cu com.oti.leapfrog.javamodel.LFCompilationUnit
	 * @param oldPackageName java.lang.String
	 */
	private IPackageFragment handlePackageChanged(final Shell shell, ICompilationUnit cu) throws JavaModelException {
		IPackageFragment oldPackage= (IPackageFragment)cu.getParent();
		String oldPkgName= oldPackage.getElementName();
		String newPkgName= getPackageDeclaration(cu);
	
		if (oldPkgName.equals(newPkgName))
			return null;
		
		IPackageFragment pack= null;
		IPackageFragment[] packs= getNewPackages(cu, newPkgName);
		
		if (packs.length > 1) {
			pack= pickPackage(shell, packs);
		} else if (packs.length == 1) {
			//if (!packs[0].getElementName().equals(oldPackage.getElementName())) {
				int flags= JavaElementLabelProvider.SHOW_BASICS | JavaElementLabelProvider.SHOW_CONTAINER
					| JavaElementLabelProvider.SHOW_ROOT;
				ILabelProvider renderer= new JavaElementLabelProvider(flags);
				String packageLabel= renderer.getText(packs[0]);
				if (shouldMoveCU(shell, cu, packageLabel))
					pack= packs[0];
			//}
		} else {
			return tryCreatePackage(shell, (IPackageFragmentRoot)oldPackage.getParent(), newPkgName);
		}
		
		return pack;
	}
	
	private IPackageFragment[] getNewPackages(ICompilationUnit cu, String name) throws JavaModelException {
		List v= new ArrayList();
		IPackageFragment[] packages= cu.getJavaProject().getPackageFragments();
		for (int i= 0; i < packages.length; i++) {
			if (name.equals(packages[i].getElementName()) && !packages[i].isReadOnly())
				v.add(packages[i]);
		}
		return (IPackageFragment[])v.toArray(new IPackageFragment[v.size()]);
	}

	IPackageFragment pickPackage(final Shell shell, IPackageFragment[] packages) {
		if (packages.length == 1)
			return packages[0];
		
		int flags= JavaElementLabelProvider.SHOW_BASICS | JavaElementLabelProvider.SHOW_CONTAINER
					| JavaElementLabelProvider.SHOW_ROOT;
		ILabelProvider renderer= new JavaElementLabelProvider(flags);
		String title= JavaPlugin.getResourceString(PREFIX+PICK_PKG+"title");
		ElementListSelectionDialog dialog= new ElementListSelectionDialog(shell, title, null, renderer, true, false);
		dialog.setMessage(JavaPlugin.getResourceString(PREFIX+PICK_PKG+"message"));
		 
		dialog.open(packages);
		Object[] selection= dialog.getSelectedElements();
		if (selection != null && selection.length == 1) {
			return (IPackageFragment)selection[0];
		}
		return null;
	}
	/**
	 * 
	 * @param cu com.oti.leapfrog.javamodel.LFCompilationUnit
	 * @param typeName java.lang.String
	 */
	private boolean shouldMoveCU(final Shell shell, ICompilationUnit cu, final String newPackage) {
		String message= JavaPlugin.getResourceString(PREFIX+MOVE_CU+"message");
		String title= JavaPlugin.getResourceString(PREFIX+MOVE_CU+"title");
		return confirm(shell, title, message, new Object[] { newPackage });
	}

	private IPackageFragment tryCreatePackage(final Shell shell, IPackageFragmentRoot pkgRoot, String packageName) throws JavaModelException {
		String title= JavaPlugin.getResourceString(PREFIX+CREATE_PKG+"title");
		String message= JavaPlugin.getResourceString(PREFIX+CREATE_PKG+"message");
		if (confirm(shell, title, message, new Object[] { packageName }))
			return pkgRoot.createPackageFragment(packageName, true, null);
		return null;
	}
	/**
	 * update method comment.
	 */
	public void postSave(ICompilationUnit cu) {
	
		IPackageFragment oldPackage= (IPackageFragment)cu.getParent();
		Shell shell= JavaPlugin.getActiveWorkbenchShell();
	
		try {
			ICompilationUnit newCU= null;
			String newName= handleTypeNameChanged(shell, cu, fOldTypeName);
			IPackageFragment newPackage= handlePackageChanged(shell, cu);
			if (newPackage != null) {
				// handle the move, perhaps renaming
				if (newName == null) {
					newName= cu.getElementName();
				}
				if ((newName= checkOverwriteCU(shell, cu, newPackage, newName)) == null)
					return;
				cu.move(newPackage, null, newName, true, null);
				newCU= newPackage.getCompilationUnit(newName);
			} else if (newName != null) {
				if ((newName= checkOverwriteCU(shell, cu, oldPackage, newName)) == null)
					return;
				cu.rename(newName, true, null);
				newCU= oldPackage.getCompilationUnit(newName);
			}
			if (newCU != null) {
				newName= newCU.getElementName();
				IType newType= getMainType(newCU);
				if (newType != null) {
					if (!makeMainTypeName(newName).equals(newType.getElementName())) {
						newType.rename(makeMainTypeName(newName), false, null);
					}
				}
			}
		} catch (JavaModelException e) {
			showErrorDialog(shell, e);
		}
	}


	private String getPackageDeclaration(ICompilationUnit cu) throws JavaModelException {
		IPackageDeclaration[] pkgs= cu.getPackageDeclarations();
		if (pkgs.length == 0)
			return "";
		else 
			return pkgs[0].getElementName();		
	}

	private void showErrorDialog(Shell shell, JavaModelException e) {
		String title= JavaPlugin.getResourceString(PREFIX+EXCEPTION+"title");
		String message= JavaPlugin.getResourceString(PREFIX+EXCEPTION+"message");
		ErrorDialog.openError(shell, title, message, e.getStatus());
	}
	
}