package org.eclipse.basyx.submodel.metamodel.map.dataspecification;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

import org.eclipse.basyx.submodel.metamodel.api.dataspecification.IDataSpecificationIEC61360Content;
import org.eclipse.basyx.submodel.metamodel.api.dataspecification.IValueReferencePair;
import org.eclipse.basyx.submodel.metamodel.api.dataspecification.enums.DataTypeIEC61360;
import org.eclipse.basyx.submodel.metamodel.api.dataspecification.enums.LevelType;
import org.eclipse.basyx.submodel.metamodel.api.reference.IReference;
import org.eclipse.basyx.submodel.metamodel.map.qualifier.LangStrings;
import org.eclipse.basyx.submodel.metamodel.map.reference.Reference;
import org.eclipse.basyx.vab.model.VABModelMap;

/**
 * DataSpecification class
 * 
 * @author elsheikh
 *
 */
public class DataSpecificationIEC61360Content extends VABModelMap<Object> implements IDataSpecificationIEC61360Content {
	public static final String PREFERREDNAME = "preferredName";
	public static final String SHORTNAME = "shortName";
	public static final String UNIT = "unit";
	public static final String UNITID = "unitId";
	public static final String SOURCEOFDEFINITION = "sourceOfDefinition";
	public static final String SYMBOL = "symbol";
	public static final String DATATYPE = "dataType";
	public static final String DEFINITION = "definition";
	public static final String VALUEFORMAT = "valueFormat";
	public static final String VALUELIST = "valueList";
	public static final String VALUE = "value";
	public static final String VALUEID = "valueId";
	public static final String LEVELTYPE = "levelType";

	/**
	 * Constructor
	 */
	public DataSpecificationIEC61360Content() {
		// Default values
		put(PREFERREDNAME, null);
		put(SHORTNAME, null);
		put(UNIT, null);
		put(UNITID, null);
		put(SOURCEOFDEFINITION, null);
		put(SYMBOL, null);
		put(DATATYPE, null);
		put(DEFINITION, null);
		put(VALUEFORMAT, null);
		put(VALUELIST, null);
		put(VALUE, null);
		put(VALUEID, null);
		put(LEVELTYPE, null);
	}

	/**
	 * Constructor
	 */
	public DataSpecificationIEC61360Content(LangStrings preferredName, LangStrings shortName, String unit,
			IReference unitId, String sourceOfDefinition, String symbol, DataTypeIEC61360 dataType,
			LangStrings definition, String valueFormat, Collection<IValueReferencePair> valueList, String value,
			IReference valueId, LevelType levelType) {
		// Default values
		put(PREFERREDNAME, preferredName);
		put(SHORTNAME, shortName);
		put(UNIT, unit);
		put(UNITID, unitId);
		put(SOURCEOFDEFINITION, sourceOfDefinition);
		put(SYMBOL, symbol);
		put(DATATYPE, dataType.toString());
		put(DEFINITION, definition);
		put(VALUEFORMAT, valueFormat);
		put(VALUELIST, valueList);
		put(VALUE, value);
		put(VALUEID, valueId);
		put(LEVELTYPE, levelType.toString());
	}

	/**
	 * Creates a DataSpecificationIEC61360 object from a map
	 * 
	 * @param obj
	 *            a DataSpecificationIEC61360 object as raw map
	 * @return a DataSpecificationIEC61360 object, that behaves like a facade for
	 *         the given map
	 */
	public static DataSpecificationIEC61360Content createAsFacade(Map<String, Object> map) {
		if (map == null) {
			return null;
		}

		DataSpecificationIEC61360Content ret = new DataSpecificationIEC61360Content();
		ret.putAll(map);
		return ret;
	}

	/**
	 * @return A Set of Strings containing all languages for the preferredName
	 */
	@SuppressWarnings("unchecked")
	@Override
	public LangStrings getPreferredName() {
		return LangStrings.createAsFacade((Collection<Map<String, Object>>) get(DataSpecificationIEC61360Content.PREFERREDNAME));
	}

	/**
	 * @return A Set of Strings containing all languages for the shortName
	 */
	@SuppressWarnings("unchecked")
	@Override
	public LangStrings getShortName() {
		return LangStrings.createAsFacade((Collection<Map<String, Object>>) get(DataSpecificationIEC61360Content.SHORTNAME));
	}

	/**
	 * @return The unit string
	 */
	@Override
	public String getUnit() {
		return (String) get(DataSpecificationIEC61360Content.UNIT);
	}

	/**
	 * @return The reference to the unit id
	 */
	@SuppressWarnings("unchecked")
	@Override
	public IReference getUnitId() {
		return Reference.createAsFacade((Map<String, Object>) get(DataSpecificationIEC61360Content.UNITID));
	}

	/**
	 * @return The source of definition
	 */
	@Override
	public String getSourceOfDefinition() {
		return (String) get(DataSpecificationIEC61360Content.SOURCEOFDEFINITION);
	}

	/**
	 * @return The symbol string
	 */
	@Override
	public String getSymbol() {
		return (String) get(DataSpecificationIEC61360Content.SYMBOL);
	}

	/**
	 * @return The data type
	 */
	@Override
	public DataTypeIEC61360 getDataType() {
		return DataTypeIEC61360.fromString((String) get(DataSpecificationIEC61360Content.DATATYPE));
	}

	/**
	 * @return A Set of Strings containing all languages for the definition
	 */
	@SuppressWarnings("unchecked")
	@Override
	public LangStrings getDefinition() {
		return LangStrings.createAsFacade((Collection<Map<String, Object>>) get(DataSpecificationIEC61360Content.DEFINITION));
	}

	/**
	 * @return The value format
	 */
	@Override
	public String getValueFormat() {
		return (String) get(DataSpecificationIEC61360Content.VALUEFORMAT);
	}

	/**
	 * @return The value list (contains pairs of values and value ids)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public Collection<IValueReferencePair> getValueList() {
		ArrayList<IValueReferencePair> result = new ArrayList<>();
		Object list = get(DataSpecificationIEC61360Content.VALUELIST);
		if ( !(list instanceof Collection<?>) ) {
			return result;
		}
		for (Map<String, Object> pair : (Collection<Map<String, Object>>) list) {
			result.add(ValueReferencePair.createAsFacade(pair));
		}
		return result;
	}

	/**
	 * @return The value string
	 */
	@Override
	public String getValue() {
		return (String) get(DataSpecificationIEC61360Content.VALUE);
	}

	/**
	 * @return The valueId reference
	 */
	@SuppressWarnings("unchecked")
	@Override
	public IReference getValueId() {
		return Reference.createAsFacade((Map<String, Object>) get(DataSpecificationIEC61360Content.VALUEID));
	}
	
	/**
	 * @return The level types
	 */
	@Override
	public LevelType getLevelType() {
		return LevelType.fromString((String) get(DataSpecificationIEC61360Content.LEVELTYPE));
	}

	public void setPreferredName(LangStrings preferredName) {
		if (preferredName != null)
			put(DataSpecificationIEC61360Content.PREFERREDNAME, preferredName);
	}

	public void setShortName(LangStrings shortName) {
		if (shortName != null)
			put(DataSpecificationIEC61360Content.SHORTNAME, shortName);
	}

	public void setUnit(String unit) {
		if (unit != null)
			put(DataSpecificationIEC61360Content.UNIT, unit);
	}

	public void setUnitId(IReference unitId) {
		if (unitId != null)
			put(DataSpecificationIEC61360Content.UNITID, unitId);
	}

	public void setSourceOfDefinition(String sourceOfDefinition) {
		if (sourceOfDefinition != null)
			put(DataSpecificationIEC61360Content.SOURCEOFDEFINITION, sourceOfDefinition);
	}

	public void setSymbol(String symbol) {
		if (symbol != null)
			put(DataSpecificationIEC61360Content.SYMBOL, symbol);
	}

	public void setDataType(DataTypeIEC61360 dataType) {
		if (dataType != null)
			put(DataSpecificationIEC61360Content.DATATYPE, dataType.toString());
	}

	public void setDefinition(LangStrings definition) {
		if (definition != null)
			put(DataSpecificationIEC61360Content.DEFINITION, definition);
	}

	public void setValueFormat(String valueFormat) {
		if (valueFormat != null)
			put(DataSpecificationIEC61360Content.VALUEFORMAT, valueFormat);
	}

	public void setValueList(Collection<IValueReferencePair> pairList) {
		if (pairList != null && !pairList.isEmpty())
			put(DataSpecificationIEC61360Content.VALUELIST, pairList);
	}

	public void setValue(String value) {
		if (value != null)
			put(DataSpecificationIEC61360Content.VALUE, value);
	}

	public void setValueId(IReference valueId) {
		if (valueId != null)
			put(DataSpecificationIEC61360Content.VALUEID, valueId);
	}

	public void setLevelType(LevelType levelType) {
		if (levelType != null)
			put(DataSpecificationIEC61360Content.LEVELTYPE, levelType.toString());
	}

}
