/*******************************************************************************
 * Copyright (c) 2003, 2004 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.j2ee.internal;

import java.util.StringTokenizer;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.jst.j2ee.applicationclient.internal.creation.ApplicationClientNatureRuntime;
import org.eclipse.jst.j2ee.internal.earcreation.EARNatureRuntime;
import org.eclipse.jst.j2ee.internal.ejb.project.EJBNatureRuntime;
import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorNatureRuntime;
import org.eclipse.jst.j2ee.internal.project.J2EENature;
import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
import org.eclipse.jst.j2ee.internal.web.operations.WebProjectInfo;
import org.eclipse.jst.j2ee.internal.web.operations.WebProjectPropertiesUpdateOperation;
import org.eclipse.jst.j2ee.internal.web.operations.WebPropertiesUtil;
import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.wst.common.componentcore.internal.StructureEdit;
import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;

/**
 * @author jsholl
 * 
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates. To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */
public class J2EEPropertiesPage extends PropertyPage implements J2EEPropertiesConstants {
	protected IProject project = null;
	private static final int SIZING_TEXT_FIELD_WIDTH = 250;
	Text contextRootNameField, webContentFolderField;
	protected WebProjectInfo wtWebProjectInfo = new WebProjectInfo();

	/**
	 * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
	 */
	protected Control createContents(Composite parent) {
		Control control = null;
		IProject aProject = getJ2EEProject();
		if (aProject != null) {
			Composite containerGroup = new Composite(parent, SWT.NONE);
			control = containerGroup;
			GridLayout layout = new GridLayout();
			layout.numColumns = 2;

			containerGroup.setLayout(layout);

			fillInformation(aProject, containerGroup);
		}
		return control;
	}

	private void fillInformation(IProject p, Composite c) {
		try {
			if (EARNatureRuntime.hasRuntime(p)) {
				EARNatureRuntime nature = EARNatureRuntime.getRuntime(p);
				fillJ2EELevel(nature, c);
			} else if (EJBNatureRuntime.hasRuntime(p)) {
				fillEJBLevel(p, c);
			} else if (ApplicationClientNatureRuntime.hasRuntime(p)) {
				fillAppClientLevel(p, c);
			} else if (ConnectorNatureRuntime.hasRuntime(p)) {
				fillConnectorLevel(p, c);
			}
			//Do: need to rework based on Module
			//else if (J2EEWebNatureRuntime.hasRuntime(p)) {
				//fillWebLevel(p, c);
			//}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param p
	 * @param c
	 */
	private void fillWebLevel(IProject p, Composite c) {
		int servletVersion = getModuleServletVersion();
		
		//fillJ2EELevel(nature,c);
		Label label = new Label(c, SWT.NONE);
		//label.setText(WEB_LEVEL + " " + nature.getModuleVersionText()); //$NON-NLS-1$
		label.setText(WEB_LEVEL + " " + getModuleServletVersion()); //$NON-NLS-1$
		String moduleDesc = null;
		//switch (nature.getModuleVersion()) {
		switch ( servletVersion ) {
			case J2EEVersionConstants.WEB_2_2_ID :
				moduleDesc = WEB_22_DESCRIPTION;
				break;
			case J2EEVersionConstants.WEB_2_3_ID :
				moduleDesc = WEB_23_DESCRIPTION;
				break;
			case J2EEVersionConstants.WEB_2_4_ID :
			default :
				moduleDesc = WEB_24_DESCRIPTION;
				break;
		}
		fillDescription(c, moduleDesc);
		fillContextRoot(p, c);
		fillWebContentFolderName(p, c);
	}


	/**
	 * @param p
	 * @param c
	 */
	private void fillWebContentFolderName(IProject p, Composite c) {
		// TODO Auto-generated method stub
		Label webContentFolderLabel = new Label(c, SWT.NULL);
		webContentFolderLabel.setText(WEB_CONTENT_FOLDER_NAME);
		GridData data = new GridData();
		data.horizontalIndent = 15;
		webContentFolderLabel.setLayoutData(data);

		webContentFolderField = new Text(c, SWT.BORDER);
		data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
		webContentFolderField.setLayoutData(data);
		webContentFolderField.setEditable(true);

		String s = getModuleServerRoot().getName();
		webContentFolderField.setText(s);

		webContentFolderField.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				String newWebContent = webContentFolderField.getText();
				validateWebContentName(newWebContent);
			}
		});

	}

	private void fillContextRoot(IProject p, Composite c) {
		Label contextRootLabel = new Label(c, SWT.NULL);
		contextRootLabel.setText(WEB_CONTEXT_ROOT);
		GridData data = new GridData();
		data.horizontalIndent = 15;
		contextRootLabel.setLayoutData(data);

		contextRootNameField = new Text(c, SWT.BORDER);
		data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
		contextRootNameField.setLayoutData(data);
		contextRootNameField.setEditable(true);

		String s = getModuleContextRoot();
		contextRootNameField.setText(s);

		contextRootNameField.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				String newContextRoot = contextRootNameField.getText();
				validateContextRoot(newContextRoot);
			}
		});
	}

	/**
	 * @param p
	 * @param c
	 */
	private void fillConnectorLevel(IProject p, Composite c) {
		ConnectorNatureRuntime nature = ConnectorNatureRuntime.getRuntime(p);
		//fillJ2EELevel(nature, c);
		Label label = new Label(c, SWT.NONE);
		label.setText(CONNECTOR_LEVEL + " " + nature.getModuleVersionText()); //$NON-NLS-1$
		String moduleDesc = null;
		switch (nature.getModuleVersion()) {
			case J2EEVersionConstants.JCA_1_0_ID :
				moduleDesc = CONNECTOR_10_DESCRIPTION;
				break;
			case J2EEVersionConstants.JCA_1_5_ID :
			default :
				moduleDesc = CONNECTOR_15_DESCRIPTION;
				break;
		}
		fillDescription(c, moduleDesc);
	}

	/**
	 * @param p
	 * @param c
	 */
	private void fillAppClientLevel(IProject p, Composite c) {
		ApplicationClientNatureRuntime nature = ApplicationClientNatureRuntime.getRuntime(p);
		//fillJ2EELevel(nature, c);
		Label label = new Label(c, SWT.NONE);
		label.setText(APP_CLIENT_LEVEL + " " + nature.getModuleVersionText()); //$NON-NLS-1$
		String moduleDesc = null;
		switch (nature.getModuleVersion()) {
			case J2EEVersionConstants.J2EE_1_2_ID :
				moduleDesc = APP_CLIENT_12_DESCRIPTION;
				break;
			case J2EEVersionConstants.J2EE_1_3_ID :
				moduleDesc = APP_CLIENT_13_DESCRIPTION;
				break;
			case J2EEVersionConstants.J2EE_1_4_ID :
			default :
				moduleDesc = APP_CLIENT_14_DESCRIPTION;
				break;
		}
		fillDescription(c, moduleDesc);
	}

	/**
	 * @param p
	 * @param c
	 */
	private void fillEJBLevel(IProject p, Composite c) {
		EJBNatureRuntime nature = EJBNatureRuntime.getRuntime(p);
		//fillJ2EELevel(nature, c);
		Label label = new Label(c, SWT.NONE);
		label.setText(EJB_LEVEL + " " + nature.getModuleVersionText()); //$NON-NLS-1$
		String moduleDesc = null;
		switch (nature.getModuleVersion()) {
			case J2EEVersionConstants.EJB_1_1_ID :
				moduleDesc = EJB_11_DESCRIPTION;
				break;
			case J2EEVersionConstants.EJB_2_0_ID :
				moduleDesc = EJB_20_DESCRIPTION;
				break;
			case J2EEVersionConstants.EJB_2_1_ID :
			default :
				moduleDesc = EJB_21_DESCRIPTION;
				break;
		}
		fillDescription(c, moduleDesc);
	}

	private void fillDescription(Composite c, String s) {
		GridData data = new GridData();
		data.horizontalSpan = 2;
		data.horizontalIndent = 15;
		Label label = new Label(c, SWT.NONE);
		label.setLayoutData(data);
		label.setText(DESCRIPTION);
		data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
		data.horizontalSpan = 2;
		data.horizontalIndent = 15;
		data.widthHint = 250;
		data.heightHint = 70;
		Text text = new Text(c, SWT.V_SCROLL | SWT.BORDER | SWT.MULTI | SWT.WRAP);
		text.setLayoutData(data);
		text.setTextLimit(80);
		text.setSize(300, 120);
		text.setEditable(false);
		text.setText(s);
	}

	private void fillJ2EELevel(J2EENature nature, Composite c) {
		Label label = new Label(c, SWT.NONE);
		label.setText(J2EE_LEVEL + " " + nature.getJ2EEVersionText()); //$NON-NLS-1$
		String desc = null;
		switch (nature.getJ2EEVersion()) {
			case J2EEVersionConstants.J2EE_1_2_ID :
				desc = J2EE_12_DESCRIPTION;
				break;
			case J2EEVersionConstants.J2EE_1_3_ID :
				desc = J2EE_13_DESCRIPTION;
				break;
			case J2EEVersionConstants.J2EE_1_4_ID :
			default :
				desc = J2EE_14_DESCRIPTION;
				break;
		}
		fillDescription(c, desc);
	}

	private IProject getJ2EEProject() {
		if (project == null) {
			Object element = getElement();
			if (element == null) {
				return null;
			}
			if (element instanceof IProject) {
				project = isJ2EEProject((IProject) element) ? (IProject) element : null;
				return project;
			}
			return null;
		}
		return project;
	}

	private static boolean isJ2EEProject(IProject p) {
		return EARNatureRuntime.hasRuntime(p) || /* //To Do: need to rework based on Module J2EEWebNatureRuntime.hasRuntime(p) || */ EJBNatureRuntime.hasRuntime(p) || ApplicationClientNatureRuntime.hasRuntime(p) || ConnectorNatureRuntime.hasRuntime(p);
	}



	private IHeadlessRunnableWithProgress getWebPropertiesUpdateOperation() {
		IProject aProject = getJ2EEProject();
		wtWebProjectInfo.setProject(aProject);
		int servletLevel = getModuleServletVersion();
		int jspLevel = getModuleJSPVersion();
				
		if (getContextRoot() != null)
			wtWebProjectInfo.setContextRoot(getContextRoot());
		if (getModuleServerRootName() != null)
			wtWebProjectInfo.setWebContentName(getModuleServerRootName());
		wtWebProjectInfo.setJSPLevel(jspLevel);
		wtWebProjectInfo.setServletLevel(servletLevel);

		return new WebProjectPropertiesUpdateOperation(wtWebProjectInfo);
	}

	/**
	 * @return
	 */
	private String getModuleServerRootName() {
		return (webContentFolderField != null) ? webContentFolderField.getText() : null;
	}

	/**
	 * @return
	 */
	private String getContextRoot() {
		return (contextRootNameField != null) ? contextRootNameField.getText() : null;
	}

	protected boolean hasUpdatedInformation() {
		return hasContextRootChanged() || hasWebContentNameChanged();

	}

	private boolean hasContextRootChanged() {
		String oldContextRoot = getModuleContextRoot();
		return oldContextRoot == null || !oldContextRoot.equals(getContextRoot());
	}

	private boolean hasWebContentNameChanged() {
		String oldWebContentName = getModuleServerRoot().getName();
		return oldWebContentName == null || !oldWebContentName.equals(getModuleServerRootName());
	}

	protected void performDefaults() {
		super.performDefaults();

       	String contextRoot = getModuleContextRoot();
       	String moduleServerRoot = getModuleServerRoot().getName();

		if (contextRootNameField != null)
			contextRootNameField.setText(contextRoot);

		if (webContentFolderField != null)
			webContentFolderField.setText(moduleServerRoot);
	}

	public boolean performOk() {
		boolean retVal = true;
		//IProject aProject = getJ2EEProject();
		// if the project isn't open, OK worked.
		
		//To Do: need to rework based on  Module
		
		/*
		if ( J2EEWebNatureRuntime.hasRuntime(aProject)) {
			WorkspaceModifyComposedOperation composedOp = new WorkspaceModifyComposedOperation();
			if (hasUpdatedInformation()) {
				IHeadlessRunnableWithProgress runnable = getWebPropertiesUpdateOperation();
				IRunnableWithProgress op = new RunnableWithProgressWrapper(runnable);
				composedOp.addRunnable(op);
				Shell shell = getControl().getShell();
				try {
					// perform a validateEdit to make sure we can write to the WebSettings file.
					WebSettingsStateInputProvider wssip = new WebSettingsStateInputProvider(aProject);
					ResourceStateValidatorImpl rsvi = new ResourceStateValidatorImpl(wssip);
					ValidateEditListener vel = new ValidateEditListener(null, rsvi);
					vel.setShell(shell);
					if (!vel.validateState().isOK())
						return false;
					new ProgressMonitorDialog(shell).run(false, true, composedOp);
				} catch (InvocationTargetException e) {
					Throwable t = e.getTargetException();
					if (t instanceof CoreException) {
						ErrorDialog.openError(getShell(), IDEWorkbenchMessages.getString("InternalError"), //$NON-NLS-1$
									e.getLocalizedMessage(), ((CoreException) t).getStatus());
						return false;
					}
					Logger.getLogger().logError(e);
					e.printStackTrace();
					return false;
				} catch (InterruptedException e) {
					// cancelled
					return false;
				}
			}
		} */
		return retVal;
	}

	public void validateWebContentName(String name) {
		String msg = WebPropertiesUtil.validateWebContentName(this.getModuleServerRootName(), getJ2EEProject(), null);
		if (msg != null) {
			setValid(false);
			setErrorMessage(msg);
		} else {
			setValid(true);
			setErrorMessage(null);
		}
	}



	public void validateContextRoot(String name) {
		boolean bValid = true;
		if (name == null || name.length() == 0) { //$NON-NLS-1$
			//  this was added because the error message shouldnt be shown initially. It should be
			// shown only if context
			// root field is edited to
			this.setErrorMessage(ProjectSupportResourceHandler.getString("Context_Root_cannot_be_empty_2")); //$NON-NLS-1$
			bValid = false;
		}

		if (name.trim().equals(name)) {
			StringTokenizer stok = new StringTokenizer(name, "."); //$NON-NLS-1$
			outer : while (stok.hasMoreTokens()) {
				String token = stok.nextToken();
				for (int i = 0; i < token.length(); i++) {
					if (!(token.charAt(i) == '_') && !(token.charAt(i) == '-') && !(token.charAt(i) == '/') && Character.isLetterOrDigit(token.charAt(i)) == false) {
						if (Character.isWhitespace(token.charAt(i)) == false) {
							this.setErrorMessage(ProjectSupportResourceHandler.getString("The_character_is_invalid_in_a_context_root", new Object[]{(new Character(token.charAt(i))).toString()})); //$NON-NLS-1$
							bValid = false;
						}
					}
				}
			}
		} // en/ end of if(name.trim
		else {
			this.setErrorMessage(ProjectSupportResourceHandler.getString("Names_cannot_begin_or_end_with_whitespace_5")); //$NON-NLS-1$
			bValid = false;
		}
		if (bValid)
			this.setErrorMessage(null);
		this.setValid(bValid);

	}


	protected String getModuleContextRoot() {
		WebArtifactEdit webEdit = null;
		try{
			webEdit = (WebArtifactEdit) StructureEdit.getFirstArtifactEditForRead(project);
       		if (webEdit != null) {
       			return webEdit.getServerContextRoot();
       		}			
		} finally{
			if( webEdit != null )
				webEdit.dispose();
		}
		return null;
	}
	
	protected IContainer getModuleServerRoot() {
		return WebPropertiesUtil.getModuleServerRoot(project);
	}
	
	protected int getModuleServletVersion() {
		WebArtifactEdit webEdit = null;
		try{
			webEdit = (WebArtifactEdit) StructureEdit.getFirstArtifactEditForRead(project);
       		if (webEdit != null) {
       			return webEdit.getServletVersion();
       		}			
		} finally{
			if( webEdit != null )
				webEdit.dispose();
		}
		return J2EEVersionConstants.SERVLET_2_2;
	}
	
	protected int getModuleJSPVersion() {
		WebArtifactEdit webEdit = null;
		try{
			webEdit = (WebArtifactEdit) StructureEdit.getFirstArtifactEditForRead(project);
       		if (webEdit != null) {
       			return webEdit.getJSPVersion();
       		}			
		} finally{
			if( webEdit != null )
				webEdit.dispose();
		}
		return J2EEVersionConstants.SERVLET_2_2;
	}

}