/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.xtext.functionlibrary.common.uomo;

import static org.eclipse.uomo.units.SI.SQUARE_METRE;

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeMap;

import org.eclipse.uomo.units.SI;
import org.eclipse.uomo.units.impl.BaseAmount;
import org.eclipse.uomo.units.impl.quantity.AreaAmount;
import org.unitsofmeasurement.quantity.Area;
import org.unitsofmeasurement.quantity.Length;
import org.unitsofmeasurement.unit.Unit;

/**
 * System of metric area units.<br>
 * @see {@link http://de.wikipedia.org/wiki/Quadratmeter}
 */
public class MetricAreaUnit extends ASystemOfQuantityUnits<SI,Area> implements ISystemOfQuantityUnits<SI,Area> {

	protected MetricAreaUnit() {
		super("Metric Area Units", SI.class, Area.class, AreaAmount.class);
	}
	
	protected final static TreeMap<Double,Unit<?>> sUnits = new TreeMap<Double,Unit<?>> ();
	protected static MetricAreaUnit INSTANCE = new MetricAreaUnit();

	public final static Unit<Area> CM2 = SI.addUnit(SQUARE_METRE.divide(10000.0), "cm²").asType(Area.class);
	public final static Unit<Area> DM2 = SI.addUnit(SQUARE_METRE.divide(100.0), "dm²").asType(Area.class);
	public final static Unit<Area> M2 = SI.addUnit(SQUARE_METRE, "m²").asType(Area.class);
	public final static Unit<Area> A = SI.addUnit(SQUARE_METRE.multiply(100.0), "a").asType(Area.class);
	public final static Unit<Area> HA = SI.addUnit(SQUARE_METRE.multiply(10000.0), "ha").asType(Area.class);
	
	static {
		addUnits(sUnits, CM2, DM2, M2, A, HA);
	}
	
	protected final static MetricAreaUnit getInstance() {
		if	(INSTANCE == null) {
			INSTANCE = new MetricAreaUnit();
		}
		return INSTANCE;
	}
	
	@Override
	public Set<Unit<?>> getUnits() {
		return units();
	}

	/**
	 * @see #getUnits()
	 */
	public static Set<Unit<?>> units() {
		return new LinkedHashSet<Unit<?>>(sUnits.values());
	}
	
	/**
	 * @see #createAmount(Number, Unit)
	 */
	public static BaseAmount<Area> amount(Number number, Unit<Area> unit) {
		return getInstance().createAmount(number, unit);
	}
	
	/**
	 * @param side
	 * @return calculate the area for a quadrat
	 */
	public static BaseAmount<Area> calculateQuadrat(BaseAmount<Length> side) {
		return calculateRectangle(side, side);
	}

	/**
	 * @param width
	 * @param height
	 * @return calculate the area for a rectangle
	 */
	@SuppressWarnings("unchecked")
	public static BaseAmount<Area> calculateRectangle(BaseAmount<Length> width, BaseAmount<Length> height) {
		return ((BaseAmount<Area>)((BaseAmount<?>)(width.multiply(height.to(width.unit()))))).to(M2);
	}
}
