/*******************************************************************************
 * 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;

import org.eclipse.jdt.core.IJavaElement;
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.SOAPBindingParameterStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingUse;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.WebParamKind;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotation;

/**
 * Contains utility methods for calculating default values of some attributes/properties in 
 * annotations and DOM objects.
 * 
 * @author Georgi Vachkov
 */
public class JaxWsDefaultsCalculator 
{
	private static final String ARG = "arg"; //$NON-NLS-1$
	private static final String RETURN = "return"; //$NON-NLS-1$
	private static final String RESPONSE = "Response"; //$NON-NLS-1$
	
	/**
	 * Defines the SOAPBindingStyle. If there is a value for style attribute in <code>sbAnnotation</code> returns that value
	 * otherwise returns the default value for this attribute.
	 * @param sbAnnotation
	 * @return the style
	 */
	public SOAPBindingStyle defineSBStyle(final IAnnotation<? extends IJavaElement> sbAnnotation)
	{
		final String value = sbAnnotation!=null ? sbAnnotation.getPropertyValue(SBAnnotationFeatures.STYLE_ATTRIBUTE) : null;
		if (value!=null && SBAnnotationFeatures.SB_STYLE_RPC.endsWith(value.trim())) {
			return SOAPBindingStyle.RPC;
		}
		
		return SOAPBindingStyle.DOCUMENT;
	}
	
	/**
	 * Defines the SOAPBindingUse. If there is a value for use attribute in <code>sbAnnotation</code> returns that value
	 * otherwise returns the default value for this attribute.
	 * @param sbAnnotation
	 * @return the style
	 */
	public SOAPBindingUse defineSBUse(final IAnnotation<? extends IJavaElement> sbAnnotation) {
		final String value = sbAnnotation!=null ? sbAnnotation.getPropertyValue(SBAnnotationFeatures.USE_ATTRIBUTE) : null;
		if(value!=null && SBAnnotationFeatures.SB_USE_ENCODED.endsWith(value.trim())) {
			return SOAPBindingUse.ENCODED;
		}
		
		return SOAPBindingUse.LITERAL;
	}
	
	/**
	 * Defines the SOAPBindingUse. If there is a value for parameterStyle attribute in <code>sbAnnotation</code> 
	 * returns that value otherwise returns the default value for this attribute.
	 * @param sbAnnotation
	 * @return the style
	 */	
	public SOAPBindingParameterStyle defineSBParameterStyle(final IAnnotation<? extends IJavaElement> sbAnnotation)
	{
		final String value = sbAnnotation!=null ? sbAnnotation.getPropertyValue(SBAnnotationFeatures.PARAMETER_STYLE_ATTRIBUTE) : null;
		if (value!=null && SBAnnotationFeatures.SB_PARAMETER_STYLE_BARE.endsWith(value.trim())) {
			return SOAPBindingParameterStyle.BARE;
		}
		
		return SOAPBindingParameterStyle.WRAPPED;		
	}	
	
	/**
	 * Defines the default operation parameter name according to JSR-181 point 4.4 - WebParam name
	 * attribute  
	 * @param webMethod the method holding the parameter
	 * @param paramPosition the parameter position in method arguments list starting with 0
	 * @return calculated name
	 */
	public String calcWebParamDefaultName(final IWebMethod webMethod, final int paramPosition)
	{
		if(webMethod.getSoapBindingStyle()==SOAPBindingStyle.DOCUMENT &&
		   webMethod.getSoapBindingParameterStyle()==SOAPBindingParameterStyle.BARE) 
		{
			return webMethod.getName();
		}
		
		return ARG + paramPosition; 
	}
	
	/**
	 * Defines the default operation parameter name according to JSR-181 point 4.4 - WebParam name
	 * attribute 
	 * @param webParam
	 * @return
	 */
	public String calcWebParamDefaultName(final IWebParam webParam) 
	{
		final IWebMethod webMethod = (IWebMethod)webParam.eContainer();
		return calcWebParamDefaultName(webMethod, getParamPosition(webMethod, webParam));		
	}
	
	/**
	 * Calculates the position of <code>param</code> in <code>method</code> signature starting from 0
	 * @param webMethod
	 * @param param
	 * @return the param position
	 * @throws IllegalArgumentException in case <code>webMethod</code> does not contain <code>param</code>
	 */
	protected int getParamPosition(final IWebMethod webMethod, final IWebParam param)
	{
		int position = 0;
		for (IWebParam webParam : webMethod.getParameters()) 
		{
			if (webParam.getImplementation().equals("return")) {//$NON-NLS-1$
				continue;
			}
			
			if (webParam==param) {
				return position;
			}
			
			position++;
		}
		
		throw new IllegalStateException("Parameter[" + param.getImplementation() + "] was not found in method [" + webMethod.getImplementation() + "]");//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
	}
	
	/**
	 * Defines the default operation parameter name according to JSR-181 point 4.4 - WebParam target NS.
	 * @param webMethod the method holding the parameter
	 * @param webParam
	 * @return calculated NS
	 */
	public String calcWebParamDefaultTargetNS(final IWebMethod webMethod, final IWebParam webParam)
	{
		if(webMethod.getSoapBindingStyle()==SOAPBindingStyle.DOCUMENT &&
		   webMethod.getSoapBindingParameterStyle()==SOAPBindingParameterStyle.WRAPPED &&
		   !webParam.isHeader()) 
		{
			return "";//$NON-NLS-1$
		}
		
		return ((IServiceEndpointInterface)webMethod.eContainer()).getTargetNamespace();
	}
	
	/**
	 * @return the default kind for web parameters - returns {@link WebParamKind#IN}
	 */
	public WebParamKind getDefaultParamKind() {
		return WebParamKind.IN;		
	}
	
	/**
	 * @return false because the default value for WebParam(header) is false
	 */
	public boolean getDefaultParamInHedaer() {
		return false;
	}
	
	/**
	 * Defines the default operation parameter name according to JSR-181 point 4.5 - WebResult name.
	 * @param webMethod the method holding the parameter
	 * @return calculated name
	 */	
	public String calcWebResultDefaultName(final IWebMethod webMethod) 
	{
		if(webMethod.getSoapBindingStyle()==SOAPBindingStyle.DOCUMENT && 
		   webMethod.getSoapBindingParameterStyle()==SOAPBindingParameterStyle.BARE)
		{
			return webMethod.getName() + RESPONSE; 
		}
		
		return RETURN;
	}
}
