/*******************************************************************************
 * Copyright (c) 2006, 2007 Oracle Corporation.
 * 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:
 *    Gerry Kessler/Oracle - initial API and implementation
 *    
 ********************************************************************************/

package org.eclipse.jst.jsf.metadataprocessors.internal.provisional;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.jsf.common.metadata.internal.DomainLoadingStrategyRegistry;
import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.Entity;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.query.IMetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.query.MetaDataQueryHelper;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IDOMContextResolver;
import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.provisional.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.structureddocument.internal.provisional.IStructuredDocumentContext;
import org.eclipse.jst.jsf.metadataprocessors.internal.provisional.features.IPossibleValues;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * Simple abstract class that implementers of {@link IMetaDataEnabledFeature} can subclass in the <b>TagLibDomain</b>
 * 
 * @author Gerry Kessler - Oracle
 *
 */
public abstract class AbstractMetaDataEnabledFeature implements IMetaDataEnabledFeature{
	
	private MetaDataContext mdContext;
	private IStructuredDocumentContext sdContext;
	private IProject _project;
	private static final List EMPTY_LIST = new ArrayList(0);
	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature#setMetaDataContext(org.eclipse.jst.jsf.metadataprocessors.internal.provisional.MetaDataContext)
	 */
	public void setMetaDataContext(final MetaDataContext context) {
		this.mdContext = context;		
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature#getMetaDataContext()
	 */
	public MetaDataContext getMetaDataContext() {
		return mdContext;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature#setStructuredDocumentContext(org.eclipse.wtp.jsf.context.structureddocument.IStructuredDocumentContext)
	 */
	public void setStructuredDocumentContext(final IStructuredDocumentContext context) {
		this.sdContext = context;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jst.jsf.metadataprocessors.internal.provisional.IMetaDataEnabledFeature#getStructuredDocumentContext()
	 */
	public IStructuredDocumentContext getStructuredDocumentContext() {
		return sdContext;
	}
	
	private IProject getProject(){
		if (_project == null){
			_project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(sdContext).getProject();
		}
		return _project;
	}

	
	//common metadata accessors
	/**
	 * Return the single expected String value for a given property.
	 * 
	 * Since the MetaDataContext, where the type-id was found, 
	 * may have come from a wild card, or the property being looked up now is,
	 * we should first look for the named property on the specific element and
	 * only if not found, look for it on the * element.
	 * 
	 * @param traitName property name
	 * @return String value
	 */
	protected String getTraitValueAsString(final String traitName){	
		//look for trait on given entity
		final TaglibMetadataContext context = (TaglibMetadataContext)getMetaDataContext();
		final IMetaDataModelContext modelContext = MetaDataQueryHelper.createMetaDataModelContext(getProject(), DomainLoadingStrategyRegistry.TAGLIB_DOMAIN, ((TaglibMetadataContext)getMetaDataContext()).getUri());
		
		final String entityKey = context.getTagName() +"/"+ context.getAttributeName();
		final Trait t = MetaDataQueryHelper.getTrait(modelContext, entityKey, traitName);
		if (t != null){
			return TraitValueHelper.getValueAsString(t);
		}
		
//		//if not present look on */attributeName 				
//		entityKey = "*/"+ ((TaglibMetadataContext)getMetaDataContext()).getAttributeName();
//		t = MetaDataQueryHelper.getTrait(modelContext, entityKey, traitName);
//
//		if (t!= null){
//			return TraitValueHelper.getValueAsString(t);
//		}
//		
//		//now look for the '*' entity
//		entityKey = "*";
//		t = MetaDataQueryHelper.getTrait(modelContext, entityKey, traitName);
//
//		if (t!= null){
//			return TraitValueHelper.getValueAsString(t);
//		}
				
		return null;

	}
	
	/**
	 * Return the List of values for a given property.
	 * 
	 * Since the MetaDataContext, where the type-id was found, 
	 * may have come from a wild card, or the property being looked up now is,
	 * we should first look for the named property on the specific element and
	 * only if not found, look for it on the * element.
	 * 
	 * @param traitName trait name
	 * @return List of String values
	 */
	protected List getTraitValueAsListOfStrings(final String traitName){
		//look for trait on given entity
		final TaglibMetadataContext context = (TaglibMetadataContext)getMetaDataContext();		
		final IMetaDataModelContext modelContext = MetaDataQueryHelper.createMetaDataModelContext(getProject(), DomainLoadingStrategyRegistry.TAGLIB_DOMAIN, ((TaglibMetadataContext)getMetaDataContext()).getUri());
		
		final String entityKey = context.getTagName() +"/"+ context.getAttributeName();
		final Entity entity = ((TaglibMetadataContext)getMetaDataContext()).getEntity();
		final Trait t = MetaDataQueryHelper.getTrait(entity, traitName);
		if (t != null){
			return TraitValueHelper.getValueAsListOfStrings(t);
		}
			
		return EMPTY_LIST;
	}

	private String getDocContextElementName() {
		final IDOMContextResolver dom = IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(getStructuredDocumentContext());
		if (dom == null)
			return null;
		
		if (dom.getNode().getNodeType() == Node.ATTRIBUTE_NODE){
			final Attr anode = (Attr)dom.getNode();
			final Element elem = anode.getOwnerElement();
			return elem.getLocalName();
		}
        return dom.getNode().getLocalName();
			
	}

	/**
	 * @return small-icon name 
	 */
	protected String getSmallIcon() {
		return getTraitValueAsString(IPossibleValues.POSSIBLE_VALUES_SMALL_ICON_PROP_NAME);
	}
	
	/**
	 * @return ImageDescriptor from the small-icon property for annotation from the same
	 * source model provider as the trait
	 */
	protected ImageDescriptor getImage() {
		final String smallIcon = getSmallIcon();
		if (smallIcon == null)
			return null;
		
		try {
			Trait t = getMetaDataContext().getTrait();
			IMetaDataSourceModelProvider provider = t.getSourceModelProvider();
			IImageDescriptorProvider ip = (IImageDescriptorProvider)provider.getAdapter(IImageDescriptorProvider.class);
			if (ip != null){
				return ip.getImageDescriptor(smallIcon);
			}
		} catch (RuntimeException e) {		
			//TODO: log error?

		}
		return null;
	}
}
