/*******************************************************************************
 * Copyright (c) 2010, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Fabien Giquel - initial API and implementation
 *******************************************************************************/
package org.eclipse.modisco.infra.discovery.core.tests;

import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Assert;

import org.eclipse.modisco.infra.discovery.core.annotations.Parameter;
import org.eclipse.modisco.infra.discovery.core.internal.annotations.DiscoveryAnnotationControls;
import org.eclipse.modisco.infra.discovery.core.internal.annotations.ParameterDeclarationException;
import org.eclipse.modisco.infra.discovery.core.tests.discoverers.WrongDiscoverer;
import org.junit.Test;

public class TestAnnotationsControls {

	@Test
	public void testControls() {

		Map<String, Map<Member, Parameter>> memberToAnnotationsMaps = retrieveParametersAnnotations(WrongDiscoverer.class);

		for (Map.Entry<String, Map<Member, Parameter>> entry : memberToAnnotationsMaps
				.entrySet()) {
			String paramName = entry.getKey();
			for (Map.Entry<Member, Parameter> memberToParameterMap : entry
					.getValue().entrySet()) {
				if (paramName.equals("PARAM1")) { //$NON-NLS-1$
					if (memberToParameterMap.getKey() instanceof Method) {
						try {
							DiscoveryAnnotationControls.checkAnnotation(
									memberToParameterMap.getValue(), null,
									memberToParameterMap.getKey());
							Assert.fail("Parameter rule violation not detected for PARAM1 : annotated method must be a getter or a setter"); //$NON-NLS-1$
						} catch (ParameterDeclarationException e) {
							// ok
						}
					}
				}
				if (paramName.equals("PARAM2")) { //$NON-NLS-1$
					if (memberToParameterMap.getKey() instanceof Method) {
						try {
							DiscoveryAnnotationControls.checkAnnotation(
									memberToParameterMap.getValue(), null,
									memberToParameterMap.getKey());
							Assert.fail("Parameter rule violation not detected for PARAM2 : annotated method must be a getter or a setter"); //$NON-NLS-1$
						} catch (ParameterDeclarationException e) {
							// ok
						}
					}
				}
			}
			if (paramName.equals("PARAM3")) { //$NON-NLS-1$
				try {
					DiscoveryAnnotationControls
							.checkAnnotationsForOneParameter(null,
									entry.getValue(), null, null);
					Assert.fail("Parameter rule violation not detected for PARAM3 : no more than one field annotated with same id"); //$NON-NLS-1$
				} catch (ParameterDeclarationException e) {
					// ok
				}
			}

			if (paramName.equals("PARAM4")) { //$NON-NLS-1$
				try {
					DiscoveryAnnotationControls
							.checkAnnotationsForOneParameter(null,
									entry.getValue(), null, null);
					Assert.fail("Parameter rule violation not detected for PARAM4 : no more than one getter annotated with same id"); //$NON-NLS-1$
				} catch (ParameterDeclarationException e) {
					// ok
				}
			}

			if (paramName.equals("PARAM5")) { //$NON-NLS-1$
				try {
					DiscoveryAnnotationControls
							.checkAnnotationsForOneParameter(null,
									entry.getValue(), null, null);
					Assert.fail("Parameter rule violation not detected for PARAM5 : not the same type on field and getter"); //$NON-NLS-1$
				} catch (ParameterDeclarationException e) {
					// ok
				}
			}

			if (paramName.equals("PARAM6")) { //$NON-NLS-1$
				try {
					DiscoveryAnnotationControls
							.checkAnnotationsForOneParameter(null,
									entry.getValue(), null, null);
					Assert.fail("Parameter rule violation not detected for PARAM6 : not the same type on field and setter"); //$NON-NLS-1$
				} catch (ParameterDeclarationException e) {
					// ok
				}
			}

			if (paramName.equals("PARAM7")) { //$NON-NLS-1$
				try {
					DiscoveryAnnotationControls
							.checkAnnotationsForOneParameter(null,
									entry.getValue(), null, null);
					Assert.fail("Parameter rule violation not detected for PARAM7 : not the same type on getter and setter"); //$NON-NLS-1$
				} catch (ParameterDeclarationException e) {
					// ok
				}
			}

		}
	}

	private Map<String, Map<Member, Parameter>> retrieveParametersAnnotations(
			final Class<?> aDiscovererClass) {
		Map<String, Map<Member, Parameter>> memberToAnnotationsMaps = new HashMap<String, Map<Member, Parameter>>();
		List<Member> members = new ArrayList<Member>();

		for (Field aField : aDiscovererClass.getFields()) {
			members.add(aField);
		}
		for (Method aMethod : aDiscovererClass.getMethods()) {
			members.add(aMethod);
		}

		for (Member aMember : members) {
			Parameter annotation = null;
			if (aMember instanceof Field) {
				annotation = ((Field) aMember).getAnnotation(Parameter.class);
			}
			if (aMember instanceof Method) {
				annotation = ((Method) aMember).getAnnotation(Parameter.class);
			}
			if (annotation != null) {
				Map<Member, Parameter> memberToParameterMap = memberToAnnotationsMaps
						.get(annotation.name());
				if (memberToParameterMap == null) {
					memberToParameterMap = new HashMap<Member, Parameter>();
					memberToAnnotationsMaps.put(annotation.name(),
							memberToParameterMap);
				}
				memberToParameterMap.put(aMember, annotation);
			}

		}
		return memberToAnnotationsMaps;
	}

}
