/*******************************************************************************
 * Copyright (c) 2005, 2008 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.core.internal.utility.jdt;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jpt.core.utility.TextRange;
import org.eclipse.jpt.core.utility.jdt.AnnotationEditFormatter;
import org.eclipse.jpt.core.utility.jdt.Type;
import org.eclipse.jpt.utility.CommandExecutorProvider;

public class JDTType
	extends JDTMember
	implements Type
{

	public JDTType(IType type, CommandExecutorProvider modifySharedDocumentCommandExecutorProvider) {
		super(type, modifySharedDocumentCommandExecutorProvider);
	}

	public JDTType(IType type, CommandExecutorProvider modifySharedDocumentCommandExecutorProvider, AnnotationEditFormatter annotationEditFormatter) {
		super(type, modifySharedDocumentCommandExecutorProvider, annotationEditFormatter);
	}

	@Override
	public IType getJdtMember() {
		return (IType) super.getJdtMember();
	}

	public IType[] jdtTypes() {
		try {
			return getJdtMember().getTypes();
		}
		catch(JavaModelException e) {
			throw new RuntimeException(e);
		}
	}
	
	public IField[] jdtFields() {
		try {
			return getJdtMember().getFields();
		}
		catch(JavaModelException e) {
			throw new RuntimeException(e);
		}
	}
	
	public IMethod[] jdtMethods() {
		try {
			return getJdtMember().getMethods();
		}
		catch(JavaModelException e) {
			throw new RuntimeException(e);
		}
	}
	
	// ********** Member implementation **********

	public AbstractTypeDeclaration getBodyDeclaration(CompilationUnit astRoot) {
		Type declaringType = this.declaringType();
		if (declaringType != null) {
			return this.getTypeDeclaration(declaringType.getBodyDeclaration(astRoot));
		}
		return this.getTypeDeclaration(this.types(astRoot));
	}
	
	public AbstractTypeDeclaration getTypeDeclaration(AbstractTypeDeclaration declaringTypeDeclaration) {
		return getTypeDeclaration(this.types(declaringTypeDeclaration));
	}
	
	private AbstractTypeDeclaration getTypeDeclaration(List<AbstractTypeDeclaration> typeDeclarations) {
		String name = this.getName();
		for (AbstractTypeDeclaration typeDeclaration : typeDeclarations) {
			if (typeDeclaration.getName().getFullyQualifiedName().equals(name)) {
				return typeDeclaration;
			}
		}
		return null;
	}

	public ITypeBinding getBinding(CompilationUnit astRoot) {
		return getBodyDeclaration(astRoot).resolveBinding();
	}

	public TextRange getNameTextRange(CompilationUnit astRoot) {
		return new ASTNodeTextRange(getBodyDeclaration(astRoot).getName());
	}

	// ********** miscellaneous **********

	@SuppressWarnings("unchecked")
	protected List<AbstractTypeDeclaration> types(CompilationUnit astRoot) {
		return astRoot.types();
	}
	
	protected List<AbstractTypeDeclaration> types(AbstractTypeDeclaration typeDeclaration) {
		List<AbstractTypeDeclaration> typeDeclarations = new ArrayList<AbstractTypeDeclaration>();
		for (BodyDeclaration bodyDeclaration : bodyDeclarations(typeDeclaration))
			if (bodyDeclaration.getNodeType() == ASTNode.TYPE_DECLARATION ||
				bodyDeclaration.getNodeType() == ASTNode.ANNOTATION_TYPE_DECLARATION  ||
				bodyDeclaration.getNodeType() == ASTNode.ENUM_DECLARATION) {
				typeDeclarations.add((AbstractTypeDeclaration) bodyDeclaration);
			}
		return typeDeclarations;
	}
	
	@SuppressWarnings("unchecked")
	protected List<BodyDeclaration> bodyDeclarations(AbstractTypeDeclaration typeDeclaration) {
		return typeDeclaration.bodyDeclarations();
	}
	

}
