package org.molgenis.data.mapper.utils;
import org.apache.commons.lang3.StringUtils;
import org.jscience.physics.amount.Amount;
import javax.measure.quantity.Quantity;
import javax.measure.unit.Unit;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class MagmaUnitConverter
{
public String convertUnit(Unit<? extends Quantity> standardUnit, Unit<? extends Quantity> unit)
{
if (standardUnit != null && unit != null)
{
StringBuilder conversionScript = new StringBuilder();
for (String standardUnitName : findCompositeUnitNames(standardUnit.toString()))
{
for (String customeUnitName : findCompositeUnitNames(unit.toString()))
{
Unit<?> unit1 = Unit.valueOf(standardUnitName);
Unit<?> unit2 = Unit.valueOf(customeUnitName);
if (unit1 != null && unit2 != null && unit1.isCompatible(unit2) && !unit1.equals(unit2))
{
Amount<?> value2 = Amount.valueOf(1, unit2);
Amount<?> value1 = value2.to(unit1);
double estimatedValue1 = value1.getEstimatedValue();
double estimatedValue2 = value2.getEstimatedValue();
if (estimatedValue1 > estimatedValue2)
{
conversionScript.append(".times(").append(value1.divide(value2).getEstimatedValue())
.append(")");
}
else
{
conversionScript.append(".div(").append(value2.divide(value1).getEstimatedValue())
.append(")");
}
}
if (conversionScript.length() > 0)
{
return conversionScript.toString();
}
}
}
}
return StringUtils.EMPTY;
}
Set<String> findCompositeUnitNames(String unitName)
{
Set<String> newUnitNames = new HashSet<String>();
if (StringUtils.isNotBlank(unitName))
{
newUnitNames.add(unitName);
if (unitName.contains("/"))
{
newUnitNames.addAll(Arrays.asList(unitName.split("/")).stream().map(UnitHelper::superscriptToNumber)
.map(unit -> unit.replaceAll("\\d+", "")).collect(Collectors.toSet()));
}
}
return newUnitNames;
}
}