"use strict";
var __spreadArrays = (this && this.__spreadArrays) || function () {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatAmountToString = exports.formatAmount = exports.AMOUNT_MAJOR_MINOR_PARTS_SEPARATOR = exports.THINSP = void 0;
var currency_codes_1 = require("./currency-codes");
exports.THINSP = String.fromCharCode(8201); // &thinsp;
exports.AMOUNT_MAJOR_MINOR_PARTS_SEPARATOR = ',';
var AMOUNT_MAJOR_PARTS_SPLITTER = exports.THINSP;
var AMOUNT_MAJOR_PART_SIZE = 3;
var AMOUNT_SPLIT_CODE_FROM = 4;
var NEGATIVE_AMOUNT_SYMBOL = '−';
/**
 * Дробит мажорную часть суммы на части по указанному символу.
 *
 * @param amount Сумма для разбивки на части
 * @param partSize Размер частей суммы
 * @param splitter Символ, разбивающий части суммы
 * @param splitFrom Длинна суммы, начиная с которой необходимо осуществлять разбивку. По-умолчанию длинна
 * равняется пяти по требованию гайдлайнов: https://design.alfabank.ru/patterns/amount. Пример: 2900 — не разбивается,
 * 29 000 — разбивается.
 */
function splitAmount(amount, partSize, splitter, splitFrom) {
    if (partSize === void 0) { partSize = 3; }
    if (splitter === void 0) { splitter = exports.THINSP; }
    if (splitFrom === void 0) { splitFrom = 5; }
    var len = amount.length;
    // Если длина суммы меньше требуемой, не форматируем сумму
    if (len < splitFrom) {
        return amount;
    }
    return amount
        .split('')
        .reduce(function (acc, item, i) {
        var isLastItem = i !== len - 1;
        // eslint-disable-next-line no-mixed-operators
        var isStartOfPart = (i - (len % partSize) + 1) % partSize === 0;
        return isLastItem && isStartOfPart ? __spreadArrays(acc, [item, splitter]) : __spreadArrays(acc, [item]);
    }, [])
        .join('');
}
/**
 * Форматирует значение суммы.
 */
function formatAmount(amount) {
    var value = amount.value, code = amount.currency.code;
    var minority = amount.currency.minority;
    minority = minority === 0 ? 1 : minority; // because Math.log(0) => -Infinity
    var fractionDigits = Math.log(minority) * Math.LOG10E;
    var valueAbsStr = (Math.abs(value) / minority).toFixed(fractionDigits);
    var _a = valueAbsStr.split('.'), majorPart = _a[0], minorPart = _a[1];
    var majorPartSplitted = splitAmount(majorPart, AMOUNT_MAJOR_PART_SIZE, AMOUNT_MAJOR_PARTS_SPLITTER, AMOUNT_SPLIT_CODE_FROM);
    var majorPartFormatted = value < 0 ? NEGATIVE_AMOUNT_SYMBOL + majorPartSplitted : majorPartSplitted;
    var formattedValueStr = minorPart
        ? majorPartFormatted + exports.AMOUNT_MAJOR_MINOR_PARTS_SEPARATOR + minorPart
        : majorPartFormatted;
    return {
        majorPart: majorPartFormatted,
        minorPart: minorPart,
        value: formattedValueStr,
        currencySymbol: currency_codes_1.getCurrencySymbol(code),
    };
}
exports.formatAmount = formatAmount;
/**
 * Форматирует значение суммы и возвращает в виде строки.
 * Использует функционал formatAmount
 */
function formatAmountToString(amount) {
    var _a = formatAmount(amount), value = _a.value, currencySymbol = _a.currencySymbol;
    return "" + value + exports.THINSP + currencySymbol;
}
exports.formatAmountToString = formatAmountToString;

//# sourceMappingURL=format-amount.js.map
