/********************************************************************************
 * 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.adapter;

import java.lang.reflect.Field;

import org.eclipse.mdm.api.base.model.Enumeration;
import org.eclipse.mdm.api.base.model.Value;
import org.eclipse.mdm.api.base.model.ValueType;

/**
 * Represents a modeled attribute.
 *
 * @since 1.0.0
 * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 * @see EntityType
 * @see ValueType
 * @see Value
 */
public interface Attribute {

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

	/**
	 * Returns the {@link EntityType} this attribute belongs to.
	 *
	 * @return The owning {@code EntityType} is returned.
	 */
	EntityType getEntityType();

	/**
	 * Returns the name of this attribute.
	 *
	 * @return The name is returned.
	 */
	String getName();

	/**
	 * Returns the unit name of this attribute.
	 *
	 * @return The unit name is returned.
	 */
	String getUnit();

	/**
	 * Returns the {@link ValueType} of this attribute.
	 *
	 * @return The {@code ValueType} is returned.
	 */
	ValueType getValueType();

	/**
	 * Returns the enumeration {@code Class} associated with this {@code Attribute}.
	 *
	 * @return The enumeration {@code Class} associated with this {@code Attribute}
	 *         is returned.
	 * @throws IllegalStateException Thrown if the {@link ValueType} of this
	 *                               {@code Attribute} is neither
	 *                               {@link ValueType#ENUMERATION} nor
	 *                               {@link ValueType#ENUMERATION_SEQUENCE}.
	 */
	Enumeration<?> getEnumObj();

	/**
	 * Creates a new and empty {@link Value}.
	 *
	 * @return Created {@code Value} is returned.
	 */
	default Value createValue() {
		ValueType valueType = getValueType();
		if (valueType.isEnumerationType()) {
			return valueType.create(getEnumObj(), getName());
		} else {
			return valueType.create(getName());
		}
	}

	/**
	 * Creates a new {@link Value} with given initial value.
	 *
	 * @param input The initial value.
	 * @return Created {@code Value} is returned.
	 */
	default Value createValue(Object input) {
		return createValue("", input);
	}

	/**
	 * Creates a new {@link Value} with given unit name and initial value.
	 *
	 * @param unit  The name of unit.
	 * @param input The initial value.
	 * @return Created {@code Value} is returned.
	 */
	default Value createValue(String unit, Object input) {
		return createValue(unit, true, input);
	}

	/**
	 * Creates a new sequence {@link Value} with given unit name and initial value.
	 *
	 * @param unit  The name of unit.
	 * @param input The initial value.
	 * @return Created {@code Value} is returned.
	 */
	default Value createValueSeq(String unit, Object input) {
		if (getValueType().isEnumerationType()) {
			return createEnumerationSequence(unit, input);
		}
		return createValueSequence(unit, input);
	}

	default Value createValueSequence(String unit, Object input) {
		ValueType valueType = getValueType();
		try {
			Field field = valueType.getClass().getField(valueType.name() + "_SEQUENCE");
			ValueType<?> sequenceValueType = (ValueType<?>) field.get(valueType);
			return sequenceValueType.create(getName(), unit, true, input);

		} catch (NoSuchFieldException | ClassCastException | IllegalAccessException e) {
			throw new RuntimeException("Can't figure out sequence type for " + valueType.name());
		}
	}

	default Value createEnumerationSequence(String unit, Object input) {
		ValueType valueType = getValueType().toSequenceType();
		return valueType.create(getName(), unit, true, input, getEnumObj().getName());
	}

	/**
	 * Creates a new {@link Value} with given unit name, initial valid flag and
	 * value.
	 *
	 * @param unit  The name of unit.
	 * @param valid The initial valid flag.
	 * @param input The initial value.
	 * @return Created {@code Value} is returned.
	 */
	default Value createValue(String unit, boolean valid, Object input) {
		ValueType<?> valueType = getValueType();
		if (valueType.isEnumerationType()) {
			return valueType.create(getName(), unit, valid, input, getEnumObj().getName());
		} else {
			return valueType.create(getName(), unit, valid, input);
		}
	}

	/**
	 * Returns the name of this attribute.
	 *
	 * @return The name of this attribute is returned.
	 */
	@Override
	String toString();

}
