/*******************************************************************************
 * Copyright (c) 2005 BEA Systems, Inc.
 * 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:
 *    tyeung@bea.com - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.apt.tests.annotations.mirrortest;

import java.util.Collection;

import org.eclipse.jdt.apt.tests.annotations.BaseProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.apt.Messager;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.AnnotationTypeElementDeclaration;
import com.sun.mirror.declaration.Declaration;
import com.sun.mirror.declaration.FieldDeclaration;
import com.sun.mirror.declaration.MethodDeclaration;
import com.sun.mirror.declaration.TypeDeclaration;
import com.sun.mirror.type.DeclaredType;

public class DefaultConstantProcessor extends BaseProcessor {
	public DefaultConstantProcessor(AnnotationProcessorEnvironment env){
		super(env);
	}
	public void process() {
		final AnnotationTypeDeclaration trigger = (AnnotationTypeDeclaration)_env.getTypeDeclaration("test.Trigger");
		
		final Messager msger = _env.getMessager();
		if( trigger == null)
			msger.printError("cannot find test.Trigger");
		
		final Collection<Declaration> decls = _env.getDeclarationsAnnotatedWith(trigger);
		for(Declaration decl : decls ){
			if( decl instanceof TypeDeclaration ){
				final TypeDeclaration typeDecl = (TypeDeclaration)decl;
				if( "test.EntryPoint".equals(typeDecl.getQualifiedName()) ){
					final Collection<FieldDeclaration> fields = typeDecl.getFields();
					for( FieldDeclaration field : fields ){
						final String name = field.getSimpleName();
						if( "nestedAnno".equals(name)){
							final DeclaredType fieldType = (DeclaredType)field.getType();
							final Collection<TypeDeclaration> nestedTypes = fieldType.getDeclaration().getNestedTypes();
							for(TypeDeclaration nestedType : nestedTypes ){
								if( "NestedAnnotation".equals(nestedType.getSimpleName()) ){
									final Collection<? extends MethodDeclaration> annotationMethods = nestedType.getMethods();
									for( MethodDeclaration annotationMethod : annotationMethods ){
										if( "value".equals(annotationMethod.getSimpleName()) ){
											final AnnotationTypeElementDeclaration value = 
												(AnnotationTypeElementDeclaration)annotationMethod;
											final String defaultString = value.getDefaultValue() == null ? "" :
												value.getDefaultValue().toString();
											final String expected = "Eore";
											if(!defaultString.equals(expected) )
												msger.printError("expecting default=" + expected + " but got " +defaultString);
										}
									}
								}
							}
							
							final Collection<FieldDeclaration> nestedAnnoFields = fieldType.getDeclaration().getFields();
							for(FieldDeclaration nestedAnnoField : nestedAnnoFields ){
								if(nestedAnnoField.getSimpleName().equals("FOUR")){
									final Object constant = nestedAnnoField.getConstantValue();
									final String expected = "4";
									final String constantStr = constant == null ? "" : constant.toString();
									if(!constantStr.equals(expected) )
										msger.printError("expecting constant=" + expected + " but got " + constantStr);
								}
							}
							continue;
						}
						else{
							msger.printError("found unexpected field " + field );
						}
						
					}
					
					continue;
				}
			}
			msger.printError("found unexpected declaration " + decl );
		}
	}
}
