/*
 * SDK Pullenti Unitext, version 4.33, fabruary 2026. Copyright (c) 2013-2026, Pullenti. All rights reserved. 
 * Non-Commercial Freeware and Commercial Software. 
 * This class is generated using the converter Unisharping (www.unisharping.ru) from Pullenti C# project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */

package com.pullenti.util;

/**
 * Преобразователь единиц измерения размеров (Html, Css). 
 * Поддерживаются: pt, cm, mm, in, px
 */
public class SizeunitConverter {

    /**
     * Конструктор
     * @param numWithUnit строковое представление значения и единицы измерения
     */
    public SizeunitConverter(String numWithUnit) {
        if (com.pullenti.unisharp.Utils.isNullOrEmpty(numWithUnit)) 
            return;
        if (numWithUnit.length() > 2 && Character.isLetter(numWithUnit.charAt(numWithUnit.length() - 1))) {
            unit = numWithUnit.substring(numWithUnit.length() - 2);
            double d;
            com.pullenti.unisharp.Outargwrapper<Double> wrapd666 = new com.pullenti.unisharp.Outargwrapper<Double>();
            boolean inoutres667 = MiscHelper.tryParseDouble(numWithUnit.substring(0, 0 + numWithUnit.length() - 2).trim(), wrapd666);
            d = (wrapd666.value != null ? wrapd666.value : 0);
            if (inoutres667) 
                val = d;
        }
        else if (numWithUnit.charAt(numWithUnit.length() - 1) == '%') {
            unit = numWithUnit.substring(numWithUnit.length() - 1);
            double d;
            com.pullenti.unisharp.Outargwrapper<Double> wrapd668 = new com.pullenti.unisharp.Outargwrapper<Double>();
            boolean inoutres669 = MiscHelper.tryParseDouble(numWithUnit.substring(0, 0 + numWithUnit.length() - 1).trim(), wrapd668);
            d = (wrapd668.value != null ? wrapd668.value : 0);
            if (inoutres669) 
                val = d;
        }
        else {
            double d;
            com.pullenti.unisharp.Outargwrapper<Double> wrapd670 = new com.pullenti.unisharp.Outargwrapper<Double>();
            boolean inoutres671 = MiscHelper.tryParseDouble(numWithUnit, wrapd670);
            d = (wrapd670.value != null ? wrapd670.value : 0);
            if (inoutres671) 
                val = d;
        }
    }

    /**
     * Значение
     */
    public double val;

    /**
     * Единица измерения (pt, cm, mm, in, px)
     */
    public String unit;

    @Override
    public String toString() {
        return (MiscHelper.outDouble(val) + ((unit != null ? unit : "?")));
    }

    /**
     * Преобразовать в новую единицу измерения
     * @param _unit новая единица (pt, cm, mm, in, px)
     * @return результат или null
     */
    public SizeunitConverter convertTo(String _unit) {
        double pt = 0.0;
        if (com.pullenti.unisharp.Utils.stringsEq(unit, "pt") || com.pullenti.unisharp.Utils.isNullOrEmpty(unit)) 
            pt = val;
        else if (com.pullenti.unisharp.Utils.stringsEq(unit, "cm")) 
            pt = (val * (72.0)) / 2.54;
        else if (com.pullenti.unisharp.Utils.stringsEq(unit, "mm")) 
            pt = (val * (72.0)) / 0.254;
        else if (com.pullenti.unisharp.Utils.stringsEq(unit, "in")) 
            pt = val * (72.0);
        else if (com.pullenti.unisharp.Utils.stringsEq(unit, "px")) 
            pt = (val * (72.0)) / (96.0);
        else 
            return null;
        double _val = 0.0;
        if (com.pullenti.unisharp.Utils.stringsEq(_unit, "pt")) 
            _val = pt;
        else if (com.pullenti.unisharp.Utils.stringsEq(_unit, "cm")) 
            _val = (pt * 2.54) / (72.0);
        else if (com.pullenti.unisharp.Utils.stringsEq(_unit, "mm")) 
            _val = (pt * 0.254) / (72.0);
        else if (com.pullenti.unisharp.Utils.stringsEq(_unit, "in")) 
            _val = pt / (72.0);
        else if (com.pullenti.unisharp.Utils.stringsEq(_unit, "px")) 
            _val = (pt * (96.0)) / (72.0);
        else if (com.pullenti.unisharp.Utils.isNullOrEmpty(_unit) && com.pullenti.unisharp.Utils.isNullOrEmpty(unit)) 
            _val = pt;
        else if (pt == 0) 
            _val = 0.0;
        else 
            return null;
        SizeunitConverter res = new SizeunitConverter(null);
        res.unit = _unit;
        res.val = com.pullenti.unisharp.Utils.mathRound(_val, 2);
        return res;
    }

    /**
     * Преобразовать строку с числом и единицей измерения в другую единицу измерения
     * @param numWithUnit число с единицей измерения
     * @param newUnit новая единица изменения (pt, cm, mm, in, px)
     * @return результат или null
     */
    public static Double convert(String numWithUnit, String newUnit) {
        SizeunitConverter cnv = new SizeunitConverter(numWithUnit);
        SizeunitConverter res = cnv.convertTo(newUnit);
        if (res == null) 
            return null;
        return res.val;
    }
    public SizeunitConverter() {
        this(null);
    }
}
