/********************************************************************************
 * Copyright (c) 2015-2019 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 java.lang.reflect.Array;
import java.time.LocalDateTime;

/**
 * Scalar type enumeration is a {@link MeasuredValues} factory. Another context
 * where this enumeration is used is the storage of values, represented by the
 * constants of this enumeration, in their {@code String} representation (see:
 * {@link BaseParameter}).
 *
 * @since 1.0.0
 * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 */

public final class ScalarType extends EnumerationValue {

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code String} values.
	 */
	public static final ScalarType STRING = new ScalarType(0, "STRING", ValueType.STRING_SEQUENCE, String.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code LocalDateTime} values.
	 */
	public static final ScalarType DATE = new ScalarType(1, "DATE", ValueType.DATE_SEQUENCE, LocalDateTime.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code boolean} values.
	 */
	public static final ScalarType BOOLEAN = new ScalarType(2, "BOOLEAN", ValueType.BOOLEAN_SEQUENCE, boolean.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code byte} values.
	 */
	public static final ScalarType BYTE = new ScalarType(3, "BYTE", ValueType.BYTE_SEQUENCE, byte.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code short} values.
	 */
	public static final ScalarType SHORT = new ScalarType(4, "SHORT", ValueType.SHORT_SEQUENCE, short.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code int} values.
	 */
	public static final ScalarType INTEGER = new ScalarType(5, "INTEGER", ValueType.INTEGER_SEQUENCE, int.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code long} values.
	 */
	public static final ScalarType LONG = new ScalarType(6, "LONG", ValueType.LONG_SEQUENCE, long.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code float} values.
	 */
	public static final ScalarType FLOAT = new ScalarType(7, "FLOAT", ValueType.FLOAT_SEQUENCE, float.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code double} values.
	 */
	public static final ScalarType DOUBLE = new ScalarType(8, "DOUBLE", ValueType.DOUBLE_SEQUENCE, double.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code byte[]} values.
	 */
	public static final ScalarType BYTE_STREAM = new ScalarType(9, "BYTE_STREAM", ValueType.BYTE_STREAM_SEQUENCE,
			byte[].class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code FloatComplex} values.
	 */
	public static final ScalarType FLOAT_COMPLEX = new ScalarType(10, "FLOAT_COMPLEX", ValueType.FLOAT_COMPLEX_SEQUENCE,
			FloatComplex.class);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code DoubleComplex} values.
	 */
	public static final ScalarType DOUBLE_COMPLEX = new ScalarType(11, "DOUBLE_COMPLEX",
			ValueType.DOUBLE_COMPLEX_SEQUENCE, DoubleComplex.class);

	/**
	 * {@link MeasuredValues} are not allowed to be of this type. This constant may
	 * be used in other contexts.
	 */
	public static final ScalarType ENUMERATION = new ScalarType(12, "ENUMERATION", ValueType.ENUMERATION_SEQUENCE);

	/**
	 * A {@link MeasuredValues} with this type contains an array sequence of
	 * {@code FileLink} values.
	 */
	public static final ScalarType FILE_LINK = new ScalarType(13, "FILE_LINK", ValueType.FILE_LINK_SEQUENCE,
			FileLink.class);

	/**
	 * TODO ...
	 */
	public static final ScalarType BLOB = new ScalarType(14, "BLOB", ValueType.BLOB, Object.class);

	/**
	 * {@link MeasuredValues} are not allowed to be of this type. This constant may
	 * be used in other contexts.
	 */
	public static final ScalarType UNKNOWN = new ScalarType(15, "UNKNOWN", ValueType.UNKNOWN);

	private final ValueType valueType;
	private final Class<?> arrayType;

	/**
	 * Constructor.
	 * 
	 * @param ord       ordinal number of the enum value
	 * @param name      name of the enum value
	 * @param valueType The associated {@link ValueType}.
	 */
	private ScalarType(int ord, String name, ValueType valueType) {
		super(name, ord);
		this.valueType = valueType;
		arrayType = null;
	}

	/**
	 * Constructor.
	 *
	 * @param ord           ordinal number of the enum value
	 * @param name          name of the enum value
	 * @param valueType     The associated {@link ValueType}.
	 * @param componentType The component type of the array held by instances of
	 *                      {@link MeasuredValues}.
	 */
	private ScalarType(int ord, String name, ValueType valueType, Class<?> componentType) {
		super(name, ord);
		this.valueType = valueType;
		arrayType = Array.newInstance(componentType, 0).getClass();
	}

	/**
	 * Creates a new {@link MeasuredValues} initialized with given name, unit and
	 * values including the related validity flags.
	 *
	 * @param name                   This is the name of the corresponding
	 *                               {@link Channel}.
	 * @param unit                   Name of the unit the contained values are of.
	 * @param sequenceRepresentation The {@link SequenceRepresentation} of the
	 *                               measured values.
	 * @param independent            The independent flag of the measured values.
	 * @param axisType               The {@link AxisType} of the measured values.
	 * @param input                  The measured values.
	 * @param flags                  The validity flags of the measured values.
	 * @return The created {@code MeasuredValues} is returned.
	 * @throws IllegalStateException    Thrown if {@link #isEnumeration()} or
	 *                                  {@link #isUnknown()} returns {@code true}.
	 * @throws IllegalArgumentException Thrown if given values are not assignment
	 *                                  compatible.
	 */
	public MeasuredValues createMeasuredValues(String name, String unit, SequenceRepresentation sequenceRepresentation,
			double[] generationParameters, boolean independent, AxisType axisType, Object input, boolean[] flags) {
		if (isEnumeration() || isUnknown()) {
			throw new IllegalStateException("It is not allowed to create measured values of type '" + this + "'.");
		} else if (!arrayType.isInstance(input)) {
			throw new IllegalArgumentException("Given values of type '" + input.getClass() + "'.");
		}

		return new MeasuredValues(this, name, unit, sequenceRepresentation, generationParameters, independent, axisType,
				input, flags);
	}

	/**
	 * Returns true if this scalar type is {@link #STRING}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isString() {
		return STRING == this;
	}

	/**
	 * Returns true if this scalar type is {@link #DATE}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isDate() {
		return DATE == this;
	}

	/**
	 * Returns true if this scalar type is {@link #BOOLEAN}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isBoolean() {
		return BOOLEAN == this;
	}

	/**
	 * Returns true if this scalar type on of the following:
	 *
	 * <ul>
	 * <li>{@link #BYTE}</li>
	 * <li>{@link #SHORT}</li>
	 * <li>{@link #INTEGER}</li>
	 * <li>{@link #LONG}</li>
	 * <li>{@link #FLOAT}</li>
	 * <li>{@link #DOUBLE}</li>
	 * </ul>
	 *
	 * @return Returns {@code true} in the cases listed above.
	 */
	public boolean isNumericalType() {
		return isIntegerType() || isFloatType();
	}

	/**
	 * Returns true if this scalar type on of the following:
	 *
	 * <ul>
	 * <li>{@link #BYTE}</li>
	 * <li>{@link #SHORT}</li>
	 * <li>{@link #INTEGER}</li>
	 * <li>{@link #LONG}</li>
	 * </ul>
	 *
	 * @return Returns {@code true} in the cases listed above.
	 */
	public boolean isIntegerType() {
		return isByte() || isShort() || isInteger() || isLong();
	}

	/**
	 * Returns true if this scalar type is {@link #BYTE}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isByte() {
		return BYTE == this;
	}

	/**
	 * Returns true if this scalar type is {@link #SHORT}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isShort() {
		return SHORT == this;
	}

	/**
	 * Returns true if this scalar type is {@link #INTEGER}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isInteger() {
		return INTEGER == this;
	}

	/**
	 * Returns true if this scalar type is {@link #LONG}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isLong() {
		return LONG == this;
	}

	/**
	 * Returns true if this scalar type on of the following:
	 *
	 * <ul>
	 * <li>{@link #FLOAT}</li>
	 * <li>{@link #DOUBLE}</li>
	 * </ul>
	 *
	 * @return Returns {@code true} in the cases listed above.
	 */
	public boolean isFloatType() {
		return isFloat() || isDouble();
	}

	/**
	 * Returns true if this scalar type is {@link #FLOAT}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isFloat() {
		return FLOAT == this;
	}

	/**
	 * Returns true if this scalar type is {@link #DOUBLE}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isDouble() {
		return DOUBLE == this;
	}

	/**
	 * Returns true if this scalar type is {@link #BYTE_STREAM}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isByteStream() {
		return BYTE_STREAM == this;
	}

	/**
	 * Returns true if this scalar type on of the following:
	 *
	 * <ul>
	 * <li>{@link #FLOAT_COMPLEX}</li>
	 * <li>{@link #DOUBLE_COMPLEX}</li>
	 * </ul>
	 *
	 * @return Returns {@code true} in the cases listed above.
	 */
	public boolean isComplexType() {
		return isFloatComplex() || isDoubleComplex();
	}

	/**
	 * Returns true if this scalar type is {@link #FLOAT_COMPLEX}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isFloatComplex() {
		return FLOAT_COMPLEX == this;
	}

	/**
	 * Returns true if this scalar type is {@link #DOUBLE_COMPLEX}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isDoubleComplex() {
		return DOUBLE_COMPLEX == this;
	}

	/**
	 * Returns true if this scalar type is {@link #ENUMERATION}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isEnumeration() {
		return ENUMERATION == this;
	}

	/**
	 * Returns true if this scalar type is {@link #FILE_LINK}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isFileLink() {
		return FILE_LINK == this;
	}

	/**
	 * Returns true if this scalar type is {@link #BLOB}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isBlob() {
		return BLOB == this;
	}

	/**
	 * Returns true if this scalar type is {@link #UNKNOWN}.
	 *
	 * @return Returns {@code true} if this constant is the constant described
	 *         above.
	 */
	public boolean isUnknown() {
		return UNKNOWN == this;
	}

	/**
	 * Returns the associated {@link ValueType}.
	 *
	 * @return The associated {@code ValueType} is returned.
	 */
	public ValueType toValueType() {
		return valueType;
	}

	/**
	 * Returns the non sequence {@link ValueType} of the associated {@code
	 * ValueType}.
	 *
	 * @return The non sequence {@code ValueType} is returned.
	 */
	public ValueType toSingleValueType() {
		return valueType.toSingleType();
	}
}
