/*******************************************************************************
 * Copyright (c) 2007, 2010 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:
 *    Oracle - initial API and implementation
 *    
 ********************************************************************************/
package org.eclipse.jst.jsf.common.metadata.internal;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.BasicEObjectImpl;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.xml.type.AnyType;
import org.eclipse.emf.ecore.xml.type.SimpleAnyType;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.BooleanValue;
import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.StringValue;
import org.eclipse.osgi.util.NLS;

/**
 * Experimental/prototype class to assist with decoding trait values.
 * This could/should be made API at some point after "hardening". (https://bugs.eclipse.org/bugs/show_bug.cgi?id=192052)
 * <p>
 * May be subclassed
 * <p>
 * Note: non-static copy of TraitValueHelper
 */
public class TraitValueHelper2 {
	private static final String KEY_NOT_FOUND = Messages.Key_not_found;

	/**
	 * @param trait
	 * @return EClass of trait value
	 */
	public EClass getValueType(final Trait trait){
		if (trait == null)
			return null;
		if (trait.getValue() != null)
			return trait.getValue().eClass();
		return null;
	}
	
	/**
	 * @param trait
	 * @return value of trait as String Object.  
	 */
	public Object getValue(final Trait trait){
		if (trait == null)
			return null;
		
		if (trait.getValue() == null)
			return null;
		
		if (trait.getValue() instanceof StringValue) {
			return ((StringValue)trait.getValue()).getValue();
		}
		else if (trait.getValue() instanceof SimpleAnyType){
			return ((SimpleAnyType)trait.getValue()).getRawValue();
		}
		else if (trait.getValue() instanceof AnyType){
			AnyType any = (AnyType)trait.getValue();
			FeatureMap map = any.getMixed();			
			return getTextValueFromFeatureMap(map);
		}
		else if ( trait.getValue().eIsProxy() && trait.getValue() instanceof BasicEObjectImpl){
			BasicEObjectImpl o = (BasicEObjectImpl)trait.getValue();
			return o.eProxyURI().toString();
		}
		return trait.getValue();
	}
	
	/**
	 * @param map
	 * @return String
	 */
	protected String getTextValueFromFeatureMap(final FeatureMap map) {
		for (final Iterator it=map.iterator();it.hasNext();){
			final FeatureMap.Entry entry = (FeatureMap.Entry)it.next();
			if (entry.getEStructuralFeature().getName().equals("text"))		 //$NON-NLS-1$
				return (String)entry.getValue();
		}
		return null;
	}

	/**
	 * @param trait
	 * @return value of trait as String.  If externalized, will resolve from resource bundle.
	 */
	public String getValueAsString(final Trait trait){
		final Object val = getValue(trait);
		if (val instanceof String){			
			return getNLSValue(trait, (String)val);			
		}
		else if (val instanceof BooleanValue)
			return String.valueOf(((BooleanValue)val).isTrue());
		
		return null;
	}
	
	/**
	 * @param trait whose value a {@link ListOfValues} or is a single string
	 * @return List of Strings.  If externalized, will resolve from resource bundle 
	 * using getNLSValue(Trait trait, String rawValue)
	 */
	public synchronized List getValueAsListOfStrings(final Trait trait){
		//PROTO ONLY!!! Need to make WAY more robust!
		final List ret = new ArrayList();
		if (trait.getValue() instanceof ListOfValues) {
			for(final Iterator it=trait.getValue().eContents().iterator();it.hasNext();){
				final Object o = it.next();				
				if (o instanceof SimpleAnyType){
					final SimpleAnyType sat = (SimpleAnyType)o;
					final String rawValue = getTextValueFromFeatureMap(sat.getMixed());
					final String nlsValue = getNLSValue(trait, rawValue);
					
					ret.add(nlsValue);
				}	
			}
		} 
		else {
			//may be single value
			String o = getValueAsString(trait);
			if (o != null)
				ret.add(o);
		}
		return ret;
	}
	
	/**
	 * Looks for '%' (and not '%%') at beginning of rawValue.   If found, looks to the
	 * traits sourceModelProvider for resource bundle to resolve the key after 
	 * stripping the '%' sign.
	 * @param trait
	 * @param rawValue of string in from metadata
	 * @return the NLS Value or rawValue if it cannot be located
	 */
	public String getNLSValue(final Trait trait, final String rawValue) {
		String result = rawValue;
		if (rawValue.startsWith("%") && !rawValue.startsWith("%%")){   //$NON-NLS-1$//$NON-NLS-2$
			final String key = rawValue.substring(1);
			result = getNLSPropertyValue(trait, key);	
			if (result == null){
				result = rawValue;
			}
		}
		return result == null ? null : result.trim();
	}

	/**
	 * @param trait
	 * @param key
	 * @return String
	 */
	//will return null if there is an IOException with ResourceBundle
	protected String getNLSPropertyValue(final Trait trait, final String key){
		try{			
			IMetaDataSourceModelProvider provider = trait.getSourceModelProvider();
			IResourceBundleProvider resourceBundleProvider = (IResourceBundleProvider)provider.getAdapter(IResourceBundleProvider.class);		
			if (resourceBundleProvider != null){
				ResourceBundle resourceBundle_ = resourceBundleProvider.getResourceBundle();				
				if (resourceBundle_ != null){
					String replVal = resourceBundle_.getString(key);
					return replVal;
				}				
			}
			//return original string 
			return key; 

		} catch (MissingResourceException e){
			//fall thru
			JSFCommonPlugin.log(e,  NLS.bind(Messages.MissingResource_exception, new String[]{key}));
		}
		return key + KEY_NOT_FOUND;
	}

	/**
	 * If trait type is {@link BooleanValue} returns value, otherwise
	 * it will get the value as a String and attempt to coerce to boolean.
	 * Will return 'false' if coercion fails, or value was null.
	 * @param trait
	 * @return true or false 
	 */
	public boolean getValueAsBoolean(final Trait trait) {
		if (trait != null && trait.getValue() instanceof BooleanValue) {
			return ((BooleanValue)trait.getValue()).isTrue();
		}
		final String val = getValueAsString(trait);
		if (val == null)
			return false;
		
		return Boolean.valueOf(val).booleanValue();
	}
	
//	/**
//	 * @param trait
//	 * @return name of class or primitive datatype that the value is defined as.   
//	 * For SimpleAnyTypes, the getInstanceType().getInstanceClassName() is returned.
//	 * For AnyType, java.lang.String is always returned.
//	 * For all others, the class.getName() is returned.
//	 */
//	public String getValueInstanceClassName(Trait trait) {String.class.getName();
//		if (trait.getValue() instanceof SimpleAnyType) {
//			return ((SimpleAnyType)trait.getValue()).getInstanceType().getInstanceClassName();
//		}
//		else if (trait.getValue() instanceof AnyType) {
//			return String.class.getName();
//		}
//		else {
//			return trait.getValue().getClass().getName();
//		}
//		
//	}

}
