/*******************************************************************************
 * Copyright (c) 2013 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0, which accompanies this distribution
 * and is available at https://www.eclipse.org/legal/epl-2.0/.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.core.tests.internal.jpa2_1.resource.java;

import java.util.Iterator;
import java.util.ListIterator;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
import org.eclipse.jpt.common.core.resource.java.NestableAnnotation;
import org.eclipse.jpt.common.utility.internal.iterator.IteratorTools;
import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.JPA2_1;
import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.NamedStoredProcedureQueryAnnotation2_1;
import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.StoredProcedureParameterAnnotation2_1;
import org.eclipse.jpt.jpa.core.resource.java.JPA;
import org.eclipse.jpt.jpa.core.resource.java.QueryHintAnnotation;

@SuppressWarnings("nls")
public class NamedStoredProcedureQueries2_1AnnotationTests
	extends JavaResourceModel2_1TestCase
{

	private static final String QUERY_NAME = "myQuery";
	private static final String QUERY_PROCEDURE_NAME = "myProcedure";
	
	public NamedStoredProcedureQueries2_1AnnotationTests(String name) {
		super(name);
	}
	
	private ICompilationUnit createTestNamedStoredProcedureQueries() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery)");
			}
		});
	}
	
	private ICompilationUnit createTestNamedStoredProcedureQueryWithName() throws Exception {
		return createTestQueryWithStringElement("name", QUERY_NAME);
	}
	
	private ICompilationUnit createTestNamedStoredProcedureQueryWithProcedureName() throws Exception {
		return createTestQueryWithStringElement("procedureName", QUERY_PROCEDURE_NAME);
	}
	
	private ICompilationUnit createTestQueryWithStringElement(final String elementName, final String value) throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(" + elementName + " = \"" + value + "\"))");
			}
		});
	}

	private ICompilationUnit createTestNamedStoredProcedureQueryWithParameters() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY, JPA2_1.NAMED_STORED_PROCEDURE_PARAMETER, JPA2_1.PARAMETER_MODE);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(parameters = {@StoredProcedureParameter(name = \"BAR\", " +
						"mode=ParameterMode.IN, type=Integer.class), @StoredProcedureParameter}))");
			}
		});
	}
	
	private ICompilationUnit createTestNamedStoredProcedureQueryWithResultClasses() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(resultClasses={Employee.class, Address.class})");
			}
		});
	}
	
	private ICompilationUnit createTestNamedStoredProcedureQueryWithResultSetMappings() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(resultSetMappings={\"EmployeeResultSetMapping\", \"AddressResultSetMapping\"})");
			}
		});
	}
	
	private ICompilationUnit createTestNamedStoredProcedureQueryWithHints() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY, JPA.QUERY_HINT);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(hints = {@QueryHint(name = \"BAR\", value = \"FOO\"), @QueryHint}))");
			}
		});
	}

	private ICompilationUnit createTestNamedStoredProcedureQuery() throws Exception {
		return this.createTestType(new DefaultAnnotationWriter() {
			@Override
			public Iterator<String> imports() {
				return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERY, JPA.QUERY_HINT);
			}
			@Override
			public void appendTypeAnnotationTo(StringBuilder sb) {
				sb.append("@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\"))");
			}
		});
	}

	public void testNamedStoredProcedureQuery() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		assertNotNull(namedQuery);
	}

	// ******** name *********
	
	public void testGetName() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithName();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		assertEquals(QUERY_NAME, namedQuery.getName());
	}

	public void testSetName() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithName();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		assertEquals(QUERY_NAME, namedQuery.getName());
		
		namedQuery.setName("foo");
		assertEquals("foo", namedQuery.getName());
		
		assertSourceContains("@NamedStoredProcedureQuery(name = \"foo\")", cu);
		
		namedQuery.setName(null);
		assertNull(namedQuery.getName());
		
		assertSourceDoesNotContain("@NamedStoredProcedureQuery(", cu);
	}

	// ********** procedure name ************
	
	public void testGetProcedureName() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithProcedureName();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		assertEquals(QUERY_PROCEDURE_NAME, namedQuery.getProcedureName());
	}

	public void testSetProcedureName() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithProcedureName();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		assertEquals(QUERY_PROCEDURE_NAME, namedQuery.getProcedureName());
		
		namedQuery.setProcedureName("foo");
		assertEquals("foo", namedQuery.getProcedureName());
		
		assertSourceContains("@NamedStoredProcedureQuery(procedureName = \"foo\")", cu);
		
		namedQuery.setProcedureName(null);
		assertNull(namedQuery.getProcedureName());
		
		assertSourceDoesNotContain("@NamedStoredProcedureQuery(", cu);
	}

	// *********** parameters *********
	
	public void testParameters1() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(0, namedQuery.getParametersSize());
	}
	
	public void testParameters2() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithParameters();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(2, namedQuery.getParametersSize());
		
		ListIterator<StoredProcedureParameterAnnotation2_1> iterator = namedQuery.getParameters().iterator();
		assertEquals("BAR", iterator.next().getName());
		assertNull(iterator.next().getName());
	}

	// *********** result classes *******
	
	public void testResultClasses1() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(0, namedQuery.getResultClassesSize());
	}
	
	public void testResultClasses2() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithResultClasses();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(2, namedQuery.getResultClassesSize());
		
		ListIterator<String> iterator = namedQuery.getResultClasses().iterator();
		assertEquals("Employee", iterator.next());
		assertEquals("Address", iterator.next());
	
	}
	
	// ********** result set mappings ********
	
	public void testResultSetMappings1() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(0, namedQuery.getResultSetMappingsSize());
	}
	
	public void testResultSetMappings2() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithResultSetMappings();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(2, namedQuery.getResultSetMappingsSize());
		
		ListIterator<String> iterator = namedQuery.getResultSetMappings().iterator();
		assertEquals("EmployeeResultSetMapping", iterator.next());
		assertEquals("AddressResultSetMapping", iterator.next());
	
	}

	// *********** hints ********
	
	public void testHints1() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(0, namedQuery.getHintsSize());
	}
	
	public void testHints2() throws Exception {
		ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithHints();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		
		assertEquals(2, namedQuery.getHintsSize());
		
		ListIterator<QueryHintAnnotation> iterator = namedQuery.getHints().iterator();
		assertEquals("BAR", iterator.next().getName());
		assertNull(iterator.next().getName());
	}
	
	// ********** other tests ********
	
	public void testAddNamedQueryCopyExisting() throws Exception {
		ICompilationUnit cu = createTestNamedStoredProcedureQuery();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		String expected1 = "@NamedStoredProcedureQueries({";
		String expected2 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")),";
		String expected3 = "@NamedStoredProcedureQuery(name = \"BAR\") })";
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		namedQuery.setName("BAR");
		assertSourceContains(expected1, cu);
		assertSourceContains(expected2, cu);
		assertSourceContains(expected3, cu);
		
		assertNull(resourceType.getAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
		assertNotNull(resourceType.getContainerAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES));
		assertNotNull(resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
		assertEquals(2, resourceType.getAnnotationsSize(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
	}
	
	public void testAddNamedQueryToBeginningOfList() throws Exception {
		ICompilationUnit cu = createTestNamedStoredProcedureQuery();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		String expected1 = "@NamedStoredProcedureQueries({";
		String expected2 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")),";
		String expected3 = "@NamedStoredProcedureQuery(name = \"BAR\") })";
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		namedQuery.setName("BAR");
		assertSourceContains(expected1, cu);
		assertSourceContains(expected2, cu);
		assertSourceContains(expected3, cu);
		
		expected2 = "@NamedStoredProcedureQuery(name = \"BAZ\"),";
		expected3 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")), @NamedStoredProcedureQuery(name = \"BAR\") })";
		namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		namedQuery.setName("BAZ");
		assertSourceContains(expected1, cu);
		assertSourceContains(expected2, cu);
		assertSourceContains(expected3, cu);

		Iterator<NestableAnnotation> namedQueries = resourceType.getAnnotations(JPA2_1.NAMED_STORED_PROCEDURE_QUERY).iterator();
		assertEquals("BAZ", ((NamedStoredProcedureQueryAnnotation2_1) namedQueries.next()).getName());
		assertEquals("foo", ((NamedStoredProcedureQueryAnnotation2_1) namedQueries.next()).getName());
		assertEquals("BAR", ((NamedStoredProcedureQueryAnnotation2_1) namedQueries.next()).getName());

		assertNull(resourceType.getAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
		assertNotNull(resourceType.getContainerAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES));
		assertNotNull(resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
		assertEquals(3, resourceType.getAnnotationsSize(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
	}

	public void testRemoveNamedQueryCopyExisting() throws Exception {
		ICompilationUnit cu = createTestNamedStoredProcedureQuery();
		JavaResourceType resourceType = buildJavaResourceType(cu);
		
		String expected1 = "@NamedStoredProcedureQueries({";
		String expected2 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")),";
		String expected3 = "@NamedStoredProcedureQuery(name = \"BAR\") })";
		NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		namedQuery.setName("BAR");
		assertSourceContains(expected1, cu);
		assertSourceContains(expected2, cu);
		assertSourceContains(expected3, cu);
		
		expected1 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\"))";
		resourceType.removeAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
		assertSourceContains(expected1, cu);
		assertSourceDoesNotContain("@NamedStoredProcedureQueries", cu);
	}

}
