/*
 * 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
 */

const Utils = require("./../unisharp/Utils");
const RefOutArgWrapper = require("./../unisharp/RefOutArgWrapper");

const MiscHelper = require("./MiscHelper");

/**
 * Преобразователь единиц измерения размеров (Html, Css). 
 * Поддерживаются: pt, cm, mm, in, px
 */
class SizeunitConverter {
    
    /**
     * Конструктор
     * @param numWithUnit строковое представление значения и единицы измерения
     */
    constructor(numWithUnit = null) {
        this.val = 0;
        this.unit = null;
        if (Utils.isNullOrEmpty(numWithUnit)) 
            return;
        if (numWithUnit.length > 2 && Utils.isLetter(numWithUnit[numWithUnit.length - 1])) {
            this.unit = numWithUnit.substring(numWithUnit.length - 2);
            let d = 0;
            let wrapd664 = new RefOutArgWrapper();
            let inoutres665 = MiscHelper.tryParseDouble(numWithUnit.substring(0, 0 + numWithUnit.length - 2).trim(), wrapd664);
            d = wrapd664.value;
            if (inoutres665) 
                this.val = d;
        }
        else if (numWithUnit[numWithUnit.length - 1] === '%') {
            this.unit = numWithUnit.substring(numWithUnit.length - 1);
            let d = 0;
            let wrapd666 = new RefOutArgWrapper();
            let inoutres667 = MiscHelper.tryParseDouble(numWithUnit.substring(0, 0 + numWithUnit.length - 1).trim(), wrapd666);
            d = wrapd666.value;
            if (inoutres667) 
                this.val = d;
        }
        else {
            let d = 0;
            let wrapd668 = new RefOutArgWrapper();
            let inoutres669 = MiscHelper.tryParseDouble(numWithUnit, wrapd668);
            d = wrapd668.value;
            if (inoutres669) 
                this.val = d;
        }
    }
    
    toString() {
        return (MiscHelper.outDouble(this.val) + ((this.unit != null ? this.unit : "?")));
    }
    
    /**
     * Преобразовать в новую единицу измерения
     * @param _unit новая единица (pt, cm, mm, in, px)
     * @return результат или null
     */
    convertTo(_unit) {
        let pt = 0;
        if (this.unit === "pt" || Utils.isNullOrEmpty(this.unit)) 
            pt = this.val;
        else if (this.unit === "cm") 
            pt = (this.val * (72)) / 2.54;
        else if (this.unit === "mm") 
            pt = (this.val * (72)) / 0.254;
        else if (this.unit === "in") 
            pt = this.val * (72);
        else if (this.unit === "px") 
            pt = (this.val * (72)) / (96);
        else 
            return null;
        let _val = 0;
        if (_unit === "pt") 
            _val = pt;
        else if (_unit === "cm") 
            _val = (pt * 2.54) / (72);
        else if (_unit === "mm") 
            _val = (pt * 0.254) / (72);
        else if (_unit === "in") 
            _val = pt / (72);
        else if (_unit === "px") 
            _val = (pt * (96)) / (72);
        else if (Utils.isNullOrEmpty(_unit) && Utils.isNullOrEmpty(this.unit)) 
            _val = pt;
        else if (pt === 0) 
            _val = 0;
        else 
            return null;
        let res = new SizeunitConverter();
        res.unit = _unit;
        res.val = Utils.mathRound(_val, 2);
        return res;
    }
    
    /**
     * Преобразовать строку с числом и единицей измерения в другую единицу измерения
     * @param numWithUnit число с единицей измерения
     * @param newUnit новая единица изменения (pt, cm, mm, in, px)
     * @return результат или null
     */
    static convert(numWithUnit, newUnit) {
        let cnv = new SizeunitConverter(numWithUnit);
        let res = cnv.convertTo(newUnit);
        if (res === null) 
            return null;
        return res.val;
    }
}


module.exports = SizeunitConverter