/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.runtime.persistence.serializer;

import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WPAnnotationFeatures.HEADER_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WPAnnotationFeatures.NAME_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WPAnnotationFeatures.PART_NAME_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WPAnnotationFeatures.TARGET_NAMESPACE_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WPAnnotationFeatures.WP_ANNOTATION;

import java.util.Set;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebMethod;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebParam;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.WebParamKind;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.JaxWsWorkspaceResource;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WPAnnotationFeatures;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.annotation.AnnotationAdapterFactory;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.annotation.IAnnotationAdapter;
import org.eclipse.jst.ws.jaxws.dom.runtime.util.Jee5DomUtils;
import org.eclipse.jst.ws.jaxws.utils.annotations.AnnotationFactory;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotation;
import org.eclipse.jst.ws.jaxws.utils.annotations.IParamValuePair;
import org.eclipse.jst.ws.jaxws.utils.annotations.IValue;
import org.eclipse.jst.ws.jaxws.utils.logging.Logger;

/**
 * Class that serializes {@link IWebParam} objects to WebParam annotation in underlying java
 * class. Checks the attribute values and omits the defaults.
 *  
 * @author Georgi Vachkov
 */
public class ParameterSerializerAdapter extends AbstractSerializerAdapter
{
	private final Jee5DomUtils jee5Utils = Jee5DomUtils.getInstance();
	
	/**
	 * Constructor
	 * @param resource
	 */
	public ParameterSerializerAdapter(JaxWsWorkspaceResource resource) {
		super(resource);
	}
	
	@Override
	public void notifyChanged(final Notification msg) 
	{
		if (!resource().isSaveEnabled()) {
			return;
		}
		
		final EStructuralFeature feature = (EStructuralFeature)msg.getFeature();
		if (feature.getFeatureID()==DomPackage.ISERVICE_ENDPOINT_INTERFACE__NAME) 
		{
			try {
				changePartName(msg);
			} 
			catch (JavaModelException e) {
				(new Logger()).logError(e.getMessage(), e);
			}
		}	
		
		super.notifyChanged(msg);
	}
	
	private void changePartName(final Notification msg) throws JavaModelException
	{
		final IWebParam webParam = (IWebParam)getTarget();
		if (jee5Utils.isPartNameUsed(webParam)) 
		{
			final IAnnotationAdapter annAdapter = (IAnnotationAdapter )AnnotationAdapterFactory.INSTANCE.adapt(webParam, IAnnotationAdapter.class);
			final IAnnotation<? extends IJavaElement> ann = annAdapter.getAnnotation(WPAnnotationFeatures.WP_ANNOTATION);
			if (ann!=null && ann.getPropertyValue(WPAnnotationFeatures.PART_NAME_ATTRIBUTE)!=null) {
				return;
			}
		}
		
		if (checkValue(msg)) {
			putValue(webParam, DomPackage.Literals.IWEB_PARAM__PART_NAME, msg.getNewValue());
		}
	}
	
	@Override
	protected boolean isAnnotationRequired() {
		return false;
	}
	
	@Override
	protected IAnnotation<? extends IJavaElement> getAnnotation() throws JavaModelException 
	{
		final IWebParam webParam = (IWebParam)getTarget();
		final IWebMethod webMethod = (IWebMethod)webParam.eContainer();
		if (webMethod==null || webMethod.eContainer()==null) {
			return null;
		}
		
		final IType seiType = findType(webMethod, ((IServiceEndpointInterface)webMethod.eContainer()).getImplementation());
		final IMethod method = util().findMethod(seiType, webMethod);
		
		return AnnotationFactory.createAnnotation(WP_ANNOTATION, 
				method.getTypeParameter(webParam.getImplementation()),
				defineParamValues(webParam, webMethod));	
	}
	
	protected Set<IParamValuePair> defineParamValues(final IWebParam webParam, final IWebMethod webMethod)
	{
		final Set<IParamValuePair> valuePairs = createParamValueSortedTreeSet();
		
		if (webParam.getKind()!=WebParamKind.IN) {
			valuePairs.add(createModeValuePair(webParam));
		}
		
		if (webParam.isHeader()) {
			valuePairs.add(createParamValue(HEADER_ATTRIBUTE, true));
		}

		final String defName = defCalc().calcWebParamDefaultName(webParam);
		if (jee5Utils.isNameRequired(webParam) || 
			(!webParam.getName().equals(defName) && jee5Utils.isNameUsed(webParam))) 
		{
			valuePairs.add(createParamValue(NAME_ATTRIBUTE, webParam.getName()));
		}
		
		if (jee5Utils.isPartNameUsed(webParam) && !webParam.getPartName().equals(defName)) {
			valuePairs.add(createParamValue(PART_NAME_ATTRIBUTE, webParam.getPartName()));
		}

		if (webParam.getTargetNamespace()!=null) 
		{
			final String defNs = defCalc().calcWebParamDefaultTargetNS(webMethod, webParam);
			if (webParam.getTargetNamespace().trim().length() != 0 && !webParam.getTargetNamespace().equals(defNs)) {
				valuePairs.add(createParamValue(TARGET_NAMESPACE_ATTRIBUTE, webParam.getTargetNamespace()));
			}
		}
		
		return valuePairs;
	}	
	
	protected IParamValuePair createModeValuePair(final IWebParam webParam) 
	{
		IValue value = null;
		switch (webParam.getKind()) 
		{
		case OUT:
			value = AnnotationFactory.createQualifiedNameValue(WPAnnotationFeatures.WEB_PARAM_MODE_OUT);
			break;
		case INOUT:
			value = AnnotationFactory.createQualifiedNameValue(WPAnnotationFeatures.WEB_PARAM_MODE_INOUT);
			break;
		default:
			return null;
		}
		
		return AnnotationFactory.createParamValuePairValue(WPAnnotationFeatures.MODE_ATTRIBUTE, value);
	}
	
	protected boolean hasParamWithSameName(final IWebParam param, final String newName)
	{
		final IWebMethod webMethod = (IWebMethod)param.eContainer();
		for (IWebParam webParam : webMethod.getParameters()) 
		{
			if(webParam==param) {
				continue;
			}
			
			if(webParam.getName().equals(newName)) {
				return true;
			}
		}
		
		return false;
	}
	
	@Override
	protected boolean checkValue(final Notification msg) 
	{
		if(((EStructuralFeature)msg.getFeature()).getFeatureID()==DomPackage.IWEB_PARAM__TARGET_NAMESPACE) {
			return true;
		}
		
		return super.checkValue(msg);
	}
}