/*******************************************************************************
 * Copyright (C) 2021 the Eclipse BaSyx Authors
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 ******************************************************************************/
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() {}

	/**
	 * 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());
	}

}
