/*******************************************************************************
 *  Copyright (c) 2011  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.jaxb.core.xsd;

import org.eclipse.jpt.common.utility.Filter;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable;
import org.eclipse.xsd.XSDTypeDefinition;

/**
 * Adds API to {@link XSDTypeDefinition}.
 * <p>
 * Provisional API: This interface is part of an interim API that is still
 * under development and expected to change significantly before reaching
 * stability. It is available at this early stage to solicit feedback from
 * pioneering adopters on the understanding that any code that uses this API
 * will almost certainly be broken (repeatedly) as the API evolves.
 * 
 * @version 3.2
 * @since 3.1
 */
public abstract class XsdTypeDefinition<A extends XSDTypeDefinition>
		extends XsdComponent<A> {
	
	protected XsdTypeDefinition(A xsdTypeDefinition) {
		super(xsdTypeDefinition);
	}
	
	
	// for some reason, the compiler is not recognizing the XSD component of this type as extending
	// XSDTypeDefinition without implementing this method.
	@Override
	public A getXSDComponent() {
		return super.getXSDComponent();
	}
	
	public abstract Kind getKind();
	
	public String getName() {
		return getXSDComponent().getName();
	}
	
	public boolean matches(String namespace, String name) {
		return XsdUtil.namespaceEquals(getXSDComponent(), namespace) && StringTools.stringsAreEqual(getName(), name); 
	}
	
	public boolean typeIsValid(XsdTypeDefinition xsdType, boolean isItemType) {
		return typeIsValid(xsdType, isItemType, true, true);
	}
	
	public boolean typeIsValid(XsdTypeDefinition xsdType, boolean isItemType, boolean allowExtension, boolean allowRestriction) {
		return getXSDComponent().getBadTypeDerivation(xsdType.getXSDComponent(), allowExtension, allowRestriction) == null;
	}
	
	public XsdTypeDefinition getBaseType() {
		XSDTypeDefinition xsdBaseType = getXSDComponent().getBaseType();
		return (xsdBaseType == null) ? null : (XsdTypeDefinition) XsdUtil.getAdapter(xsdBaseType);
	}
	
	public abstract XsdAttributeUse getAttribute(String namespace, String name);
	
	public Iterable<String> getAttributeNameProposals(String namespace, Filter<String> filter) {
		return StringTools.convertToJavaStringLiterals(
				new FilteringIterable<String>(getAttributeNames(namespace), filter));
	}
	
	public abstract Iterable<String> getAttributeNames(String namespace);
	
	public XsdElementDeclaration getElement(String namespace, String name) {
		return getElement(namespace, name, false);
	}
	
	public abstract XsdElementDeclaration getElement(String namespace, String name, boolean recurseChildren);
	
	public Iterable<String> getElementNameProposals(String namespace, Filter<String> filter) {
		return getElementNameProposals(namespace, filter, false);
	}
	
	public Iterable getElementNameProposals(String namespace, Filter<String> filter, boolean recurseChildren) {
		return StringTools.convertToJavaStringLiterals(
				new FilteringIterable<String>(getElementNames(namespace, recurseChildren), filter));
	}
	
	public abstract Iterable<String> getElementNames(String namespace, boolean recurseChildren);
	
	public enum Kind {
		
		/**
		 * An {@link XsdTypeDefinition} of SIMPLE {@link Kind} may safely be cast to an {@link XsdSimpleTypeDefinition}
		 */
		SIMPLE,
		
		/**
		 * An {@link XsdTypeDefinition} of COMPLEX {@link Kind} may safely be cast to an {@link XsdComplexTypeDefinition}
		 */
		COMPLEX;
	}
}
