/*******************************************************************************
 * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *    Kestral Computing P/L - initial implementation
 *    Werner Keil - Cleaning, unification with other UOMo parts and Unit-API
 *******************************************************************************/

package org.eclipse.uomo.ucum.model;

import java.math.BigDecimal;

import org.eclipse.uomo.core.IDescription;
import org.eclipse.uomo.core.IText;
import org.unitsofmeasurement.quantity.Quantity;
import org.unitsofmeasurement.unit.Unit;

public class Value<Q extends Quantity<Q>> implements Quantity<Q>, IDescription, IText {
	// TODO should use Quantity
	// TODO make this a "real" unit, should be at least UcumUnit
	private String unit;
	private Unit<Q> realUnit;
	private String unitUC;
	
	private BigDecimal value;
	
	private String text;

	/**
	 * @param unit
	 * @param unitUC
	 * @param value
	 */
	public Value(String unit, String unitUC, BigDecimal value) {
		super();
		this.unit = unit;
		this.unitUC = unitUC;
		this.value = value;
	}

	/**
	 * @return the unit
	 */
	public String getUnit() {
		return unit;
	}

	/**
	 * @param unit the unit to set
	 */
	public void setUnit(String unit) {
		this.unit = unit;
	}

	/**
	 * @return the unitUC
	 * @deprecated currently not used
	 */
	public String getUnitUC() {
		return unitUC;
	}

	/**
	 * @param unitUC the unitUC to set
	 * @deprecated currently not used
	 */
	public void setUnitUC(String unitUC) {
		this.unitUC = unitUC;
	}

	/**
	 * @param value the value to set
	 * @deprecated
	 */
	void setValue(BigDecimal value) {
		this.value = value;
	}

	/**
	 * @return the text
	 */
	public String getText() {
		return text;
	}

	/**
	 * @param text the text to set
	 */
	public void setText(String text) {
		this.text = text;
	}

	public String getDescription() {
		if (value == null)
			return unit;
		return value.toEngineeringString()+unit;
	}

	public Number value() {
		return value;
	}

	public Unit<Q> unit() {
		return realUnit;
	}		
}
