/********************************************************************************
 * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.api.base.model;

import org.eclipse.mdm.api.base.adapter.Core;

/**
 * Implementation of the channel entity type. Entities of this type are based on
 * {@link Quantity}s.
 *
 * @since 1.0.0
 * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 * @see Measurement
 * @see ChannelGroup
 * @see ContextSensor
 * @see ParameterSet
 */
public class Channel extends BaseEntity implements Deletable, Describable {

	// TODO Channel may have a relation to a sensor!

	// ======================================================================
	// Class variables
	// ======================================================================

	/**
	 * The {@link Measurement} parent type.
	 */
	public static final Class<Measurement> PARENT_TYPE_MEASUREMENT = Measurement.class;

	/**
	 * The {@link ChannelGroup} parent type.
	 */
	public static final Class<ChannelGroup> PARENT_TYPE_CHANNELGROUP = ChannelGroup.class;

	/**
	 * The {@link ParameterSet} child type.
	 */
	public static final Class<ParameterSet> CHILD_TYPE_PARAMETERSET = ParameterSet.class;

	/**
	 * The 'Minimum' attribute name.
	 */
	public static final String ATTR_MINIMUM = "Minimum";

	/**
	 * The 'Maximum' attribute name.
	 */
	public static final String ATTR_MAXIMUM = "Maximum";

	/**
	 * The 'Average' attribute name.
	 */
	public static final String ATTR_AVERAGE = "Average";

	/**
	 * The 'Deviation' attribute name.
	 */
	public static final String ATTR_DEVIATION = "Deviation";

	/**
	 * The 'ScalarType' attribute name.
	 */
	public static final String ATTR_SCALAR_TYPE = "DataType";

	/**
	 * The 'Interpolation' attribute name.
	 */
	public static final String ATTR_INTERPOLATION = "Interpolation";

	/**
	 * The 'Rank' attribute name.
	 */
	public static final String ATTR_RANK = "Rank";

	/**
	 * The 'TypeSize' attribute name.
	 */
	public static final String ATTR_TYPE_SIZE = "TypeSize";

	// ======================================================================
	// Constructors
	// ======================================================================

	/**
	 * Constructor.
	 *
	 * @param core The {@link Core}.
	 */
	Channel(Core core) {
		super(core);
	}

	// ======================================================================
	// Public methods
	// ======================================================================

	/**
	 * Returns the minimum value of this channel.
	 *
	 * @return The minimum value is returned.
	 */
	public Double getMinimum() {
		return getValue(ATTR_MINIMUM).extract();
	}

	/**
	 * Sets new minimum value for this channel.
	 *
	 * @param minimum The new minimum value.
	 */
	public void setMinimum(Double minimum) {
		getValue(ATTR_MINIMUM).set(minimum);
	}

	/**
	 * Returns the maximum value of this channel.
	 *
	 * @return The maximum value is returned.
	 */
	public Double getMaximum() {
		return getValue(ATTR_MAXIMUM).extract();
	}

	/**
	 * Sets new maximum value for this channel.
	 *
	 * @param maximum The new maximum value.
	 */
	public void setMaximum(Double maximum) {
		getValue(ATTR_MAXIMUM).set(maximum);
	}

	/**
	 * Returns the average value of this channel.
	 *
	 * @return The average value is returned.
	 */
	public Double getAverage() {
		return getValue(ATTR_AVERAGE).extract();
	}

	/**
	 * Sets new average value for this channel.
	 *
	 * @param average The new average value.
	 */
	public void setAverage(Double average) {
		getValue(ATTR_AVERAGE).set(average);
	}

	/**
	 * Returns the deviation value of this channel.
	 *
	 * @return The deviation value is returned.
	 */
	public Double getDeviation() {
		return getValue(ATTR_DEVIATION).extract();
	}

	/**
	 * Sets new deviation value for this channel.
	 *
	 * @param deviation The new deviation value.
	 */
	public void setDeviation(Double deviation) {
		getValue(ATTR_DEVIATION).set(deviation);
	}

	/**
	 * Returns the {@link ScalarType} of this channel.
	 *
	 * @return The {@code ScalarType} is returned.
	 */
	public ScalarType getScalarType() {
		return getValue(ATTR_SCALAR_TYPE).extract();
	}

	/**
	 * Sets new {@link ScalarType} for this channel.
	 *
	 * @param scalarType The new {@code ScalarType}.
	 * @throws IllegalArgumentException Thrown if given {@code ScalarType} is
	 *                                  {@link ScalarType#UNKNOWN}.
	 */
	public void setScalarType(ScalarType scalarType) {
		if (scalarType.isUnknown()) {
			throw new IllegalArgumentException("Scalar type constant is not allowed to be '" + scalarType + "'.");
		}

		getValue(ATTR_SCALAR_TYPE).set(scalarType);
	}

	/**
	 * Returns the {@link Interpolation} of this channel.
	 *
	 * @return The {@code Interpolation} is returned.
	 */
	public Interpolation getInterpolation() {
		return getValue(ATTR_INTERPOLATION).extract();
	}

	/**
	 * Sets new interpolation for this channel.
	 *
	 * @param interpolation The new {@code Interpolation}.
	 */
	public void setInterpolation(Interpolation interpolation) {
		getValue(ATTR_INTERPOLATION).set(interpolation);
	}

	/**
	 * Returns the rank of this channel.
	 *
	 * @return The rank is returned.
	 */
	public Integer getRank() {
		return getValue(ATTR_RANK).extract();
	}

	/**
	 * Sets new rank for this channel.
	 *
	 * @param rank The new rank.
	 */
	public void setRank(Integer rank) {
		getValue(ATTR_RANK).set(rank);
	}

	/**
	 * Returns the type size of this channel.
	 *
	 * @return The type size is returned.
	 */
	public Integer getTypeSize() {
		return getValue(ATTR_TYPE_SIZE).extract();
	}

	/**
	 * Sets new type size for this channel.
	 *
	 * @param typeSize The new type size.
	 */
	public void setTypeSize(Integer typeSize) {
		getValue(ATTR_TYPE_SIZE).set(typeSize);
	}

	/**
	 * Returns the related {@link Unit}.
	 *
	 * @return Related {@code Unit} is returned.
	 */
	public Unit getUnit() {
		return getCore().getMutableStore().get(Unit.class);
	}

	/**
	 * Returns the related {@link Quantity}.
	 *
	 * @return Related {@code Quantity} is returned.
	 */
	public Quantity getQuantity() {
		return getCore().getMutableStore().get(Quantity.class);
	}

}
