/*******************************************************************************
 * 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.utils.annotations;

import static org.eclipse.jst.ws.jaxws.utils.ContractChecker.nullCheckParam;

import java.io.FileNotFoundException;
import java.util.Set;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeParameter;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.AnnotationImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.AnnotationInspectorImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.AnnotationUtils;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.ArrayValueImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.BooleanValueImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.ClassValueImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.IntegerValueImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.ParamValuePairImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.QualifiedNameValueImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.annotations.impl.StringValueImpl;
import org.eclipse.jst.ws.jaxws.utils.internal.text.JaxWsUtilMessages;
import org.eclipse.text.edits.MalformedTreeException;


/**
 * Factory class containing common factory and utility methods Annotation processing.
 * 
 * @author Plamen Pavlov
 */
public class AnnotationFactory
{
	/**
	 * Creates complex Annotation, e.g. Annotation of kind \@WebService(param1="value1", param2="value2").
	 * 
	 * @param annotationQName
	 * @param paramValuePairs
	 * 
	 * @return Instantiated Annotation of type IComplexAnnotation.
	 * 
	 * @throws NullPointerException in case <tt>annotationQName</tt> or <tt>paramValuePairs</tt> are null.
	 * @throws IllegalArgumentException in case <tt>annotationQName</tt> is empty String.
	 */
	public static <T extends IJavaElement> IAnnotation<T> createAnnotation(String annotationQName, Set<IParamValuePair> paramValuePairs, final T appliedElement)
	{
		if (annotationQName == null)
		{
			throw new NullPointerException("annotationQName should not be null!"); //$NON-NLS-1$
		}
		if (annotationQName.trim().length() == 0)
		{
			throw new IllegalArgumentException("annotationQName should not be empty String!"); //$NON-NLS-1$
		}

		if (paramValuePairs == null)
		{
			throw new NullPointerException("paramValuePairs should not be null!"); //$NON-NLS-1$
		}

		final AnnotationImpl<T> impl = new AnnotationImpl<T>(annotationQName, paramValuePairs);
		impl.setJavaElement(appliedElement);
		
		return impl;
	}
	
	
	/**
	 * Creates {@link IAnnotation} instance that references <code>appliedElement</code> java element 
	 * @param annotationQName the annotation name
	 * @param appliedElement the java element that this annotation is applied on
	 * @param paramValuePairs the annotation attributes
	 * @return {@link IAnnotation} instance
	 * @throws NullPointerException in case some of params is <code>null</code>
	 * @throws IllegalArgumentException in case <code>annotationQName</code> is empty string
	 */
	public static IAnnotation<? extends IJavaElement> createAnnotation(String annotationQName, IJavaElement appliedElement, Set<IParamValuePair> paramValuePairs)
	{
		nullCheckParam(annotationQName, "annotationQName");	 //$NON-NLS-1$	
		if (annotationQName.trim().length() == 0) {
			throw new IllegalArgumentException("annotationQName should not be empty String!"); //$NON-NLS-1$
		}

		nullCheckParam(paramValuePairs, "paramValuePairs"); //$NON-NLS-1$
		nullCheckParam(appliedElement, "appliedElement"); //$NON-NLS-1$

		final AnnotationImpl<IJavaElement> annotation = new AnnotationImpl<IJavaElement>(annotationQName, paramValuePairs);
		annotation.setAppliedElementWithoutSave(appliedElement);
		
		return annotation;
	}	
	
	/**
	* Creates param-value pair needed in complex Annotations.
	 * 
	 * @param param
	 * @param value
	 * 
	 * @return instance of IParamValuePair
	 * 
	 * @throws NullPointerException in case <code>param</code> or <code>value</code> is <code>null</code>.
	 * @throws IllegalArgumentException in case <code>param</code> parameter is empty String.
	 */
	public static IParamValuePair createParamValuePairValue(String param, IValue value)
	{
		if (param == null)
		{
			throw new NullPointerException("param should not be null!"); //$NON-NLS-1$
		}
		if (param.trim().length() == 0)
		{
			throw new IllegalArgumentException("param should not be empty String!"); //$NON-NLS-1$
		}

		if (value == null)
		{
			throw new NullPointerException("value should not be null!"); //$NON-NLS-1$
		}

		return new ParamValuePairImpl(param, value);
	}
	
	/**
	 * Creates {@link IValue} instance using provided <code>values</code>.
	 * 
	 * @param values
	 * 
	 * @return instance of {@link IValue}
	 * 
	 * @throws NullPointerException in case <code>values</code> is null.
	 * @throws IllegalArgumentException in case <code>values</code> is empty Set.
	 */
	public static IValue createArrayValue(Set<IValue> values)
	{
		if (values == null)
		{
			throw new NullPointerException("values should not be null!"); //$NON-NLS-1$
		}
		if (values.size() < 1)
		{
			throw new IllegalArgumentException("values should not be empty Set!"); //$NON-NLS-1$
		}

		return new ArrayValueImpl(values);
	}
	
	/**
	 * Creates {@link IValue} instance out of <code>value</code>.
	 * 
	 * @param value
	 * 
	 * @return instance of {@link IValue}
	 */
	public static IValue createBooleanValue(boolean value)
	{
		return new BooleanValueImpl(value);
	}
		
	/**
	 * Creates {@link IValue} instance out of <code>value</code>.
	 * 
	 * @param value
	 * 
	 * @return instance of {@link String}
	 */
	public static IValue createClassValue(String value)
	{
		if (value == null)
		{
			throw new NullPointerException("value should not be null!"); //$NON-NLS-1$
		}
		if(value.equals("")) //$NON-NLS-1$
		{
			throw new IllegalArgumentException("value should not be empty String"); //$NON-NLS-1$
		}
		
		return new ClassValueImpl(value);
	}
	
	/**
	 * Creates {@link IValue} instance out of <code>value</code>.
	 * 
	 * @param value
	 * 
	 * @return instance of {@link IValue}
	 */
	public static IValue createIntegerValue(String value)
	{
		return new IntegerValueImpl(value);
	}

	/**
	 * Creates {@link IValue} instance using provided <code>qualifiedName</code> fully qualified name.
	 * 
	 * @param qualifiedName
	 *
	 * @return instance of {@link IValue}
	 * 
	 * @throws NullPointerException in case <tt>qualifiedName</tt> is null.
	 * @throws IllegalArgumentException in case <code>qualifiedName</code> is not in correct form e.g. could not be empty String, shold be qualified.
	 */
	public static IValue createQualifiedNameValue(String qualifiedName)
	{
		if (qualifiedName == null)
		{
			throw new NullPointerException("qualifiedName should not be null!"); //$NON-NLS-1$
		}

		if (qualifiedName.trim().length() == 0 || qualifiedName.indexOf('.') == -1)
		{
			throw new IllegalArgumentException("qualifiedName is not in correct form!"); //$NON-NLS-1$
		}

		return new QualifiedNameValueImpl(qualifiedName);
	}
	
	/**
	 * Creates {@link IValue} instance out of <code>value</code> content.
	 * 
	 * @param value
	 *
	 * @return instance of {@link IValue}
	 * @throws NullPointerException in case <tt>value</tt> is null.
	 */
	public static IValue createStringValue(String value)
	{
		if (value == null)
		{
			throw new NullPointerException("value should not be null!"); //$NON-NLS-1$
		}

		return new StringValueImpl(value);
	}
	
	
//	/**
//	 * Retrieves all Annotations from class.
//	 * 
//	 * @param javaElement
//	 *
//	 * @return contained annotations in <code>javaElement</code>
//	 * 
//	 * @throws JavaModelException if exception occurs
//	 * @throws NullPointerException if <tt>javaElement</tt> is null.
//	 * @throws IllegalArgumentException in case <code>javaElement</code> is not of the correct type. Supported types are: Itype, IMethod, IField, ITypeParameter
//	 */
//	public static Set<IAnnotation> getAnnotationsFromJavaElement(IJavaElement javaElement) throws JavaModelException
//	{
//		if (javaElement == null)
//		{
//			throw new NullPointerException("javaElement should not be null!");
//		}
//		if(!(javaElement instanceof IType) || !(javaElement instanceof IMethod) || !(javaElement instanceof IField) || !(javaElement instanceof ITypeParameter))
//		{
//			throw new IllegalArgumentException("javaElement is not of correct type!");
//		}
//		pppppp
//	}
	
	/**
	 * Removes all Annotations from <code>javaElement</code>.
	 * 
	 * @param javaElement
	 *
	 * @throws NullPointerException if <tt>javaElement</tt> is null.
	 * @throws IllegalArgumentException in case <code>javaElement</code> is not of the correct type. Supported types are: Itype, IMethod, IField, ITypeParameter
	 * @throws AnnotationGeneratorException
	 */
	public static void removeAnnotationsFromJavaElement(IJavaElement javaElement) throws AnnotationGeneratorException
	{
		if (javaElement == null)
		{
			throw new NullPointerException("javaElement should not be null!"); //$NON-NLS-1$
		}
		if(!(javaElement instanceof IType) && !(javaElement instanceof org.eclipse.jdt.core.IMethod) && !(javaElement instanceof IField) && !(javaElement instanceof ITypeParameter))
		{
			throw new IllegalArgumentException("javaElement is not of correct type!"); //$NON-NLS-1$
		}
		removeAnnotations(javaElement, null);
	}
	
	/**
	 * Removes Annotations with names contained in <code>annotations</code> from <code>javaElement</code> and its children, if such exist.
	 * 
	 * @param javaElement
	 * @param annotations
	 * 
	 * @throws NullPointerException if <tt>javaElement</tt> or <tt>annotations</tt> is null.
	 * @throws IllegalArgumentException in case <code>javaElement</code> is not of the correct type. Supported types are: Itype, IMethod, IField, ITypeParameter
	 * @throws AnnotationGeneratorException
	 */
	public static void removeAnnotations(IJavaElement javaElement, Set<String> annotations) throws AnnotationGeneratorException
	{
		if (javaElement == null)
		{
			throw new NullPointerException("javaElement should not be null!"); //$NON-NLS-1$
		}
		if(!(javaElement instanceof IType) && !(javaElement instanceof org.eclipse.jdt.core.IMethod) && !(javaElement instanceof IField) && !(javaElement instanceof ITypeParameter))
		{
			throw new IllegalArgumentException("javaElement is not of correct type!"); //$NON-NLS-1$
		}

		try 
		{
			AnnotationUtils.getInstance().removeAnnotations(javaElement, annotations, true);
		} 
		catch (JavaModelException e) 
		{
			throw new AnnotationGeneratorException(e.getMessage(), e.getStatus().getMessage(), e);
		} 
		catch (MalformedTreeException e) 
		{
			throw new AnnotationGeneratorException(e.getMessage(), JaxWsUtilMessages.InvalidTreeStateMsg, e);
		} 
		catch (FileNotFoundException e) 
		{
			throw new AnnotationGeneratorException(e.getMessage(), JaxWsUtilMessages.CompUnitMissingMsg, e);
		} 
		catch (CoreException e) 
		{
			throw new AnnotationGeneratorException(e.getMessage(), e.getStatus().getMessage(), e);
		}
		catch (BadLocationException e)
		{
			throw new AnnotationGeneratorException(e.getMessage(), JaxWsUtilMessages.CannotPerformEditMsg, e);
		}
	}
	
	/**
	 * Create instance of IAnnotationInspector for a specific IType.
	 * 
	 * @param type - IType, which will be inspected.
	 *  
	 * @return IAnnotationInspector
	 */
	public static IAnnotationInspector createAnnotationInspector(IType type)
	{
		return new AnnotationInspectorImpl(type);
	}
}
