/*******************************************************************************
 * 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.connected.submodelelement.dataelement;

import java.util.Map;

import org.eclipse.basyx.submodel.metamodel.api.reference.enums.KeyElements;
import org.eclipse.basyx.submodel.metamodel.api.submodelelement.dataelement.IRange;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDef;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDefHelper;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.range.Range;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.range.RangeValue;
import org.eclipse.basyx.submodel.restapi.MultiSubmodelElementProvider;
import org.eclipse.basyx.vab.modelprovider.VABElementProxy;

/**
 * "Connected" implementation of IRange
 * @author conradi
 *
 */
public class ConnectedRange extends ConnectedDataElement implements IRange {

	public ConnectedRange(VABElementProxy proxy) {
		super(proxy);
	}

	@Override
	public PropertyValueTypeDef getValueType() {
		return PropertyValueTypeDefHelper.readTypeDef(getElem().getPath(Range.VALUETYPE));
	}

	@Override
	public Object getMin() {
		Object min = getElem().getPath(Range.MIN);
		return PropertyValueTypeDefHelper.getJavaObject(min, getValueType());
	}

	@Override
	public Object getMax() {
		Object max = getElem().getPath(Range.MAX);
		return PropertyValueTypeDefHelper.getJavaObject(max, getValueType());
	}

	@Override
	protected KeyElements getKeyElement() {
		return KeyElements.RANGE;
	}

	@Override
	public RangeValue getValue() {
		return new RangeValue(getMin(), getMax());
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public void setValue(Object value) {
		if(RangeValue.isRangeValue(value)) {
			RangeValue rangeValue = RangeValue.createAsFacade((Map<String, Object>) value);
			setValue(rangeValue);
		} else {
			throw new IllegalArgumentException("Given object " + value + " is not a RangeValue");
		}
	}

	@Override
	public Range getLocalCopy() {
		return Range.createAsFacade(getElem()).getLocalCopy();
	}

	@Override
	public void setValue(RangeValue rangeValue) {
		Object minRaw = rangeValue.getMin();
		Object maxRaw = rangeValue.getMax();

		RangeValue prepared = new RangeValue(
				PropertyValueTypeDefHelper.prepareForSerialization(minRaw),
				PropertyValueTypeDefHelper.prepareForSerialization(maxRaw)
			);
				
		
		getProxy().setModelPropertyValue(MultiSubmodelElementProvider.VALUE, prepared);
	}
}
