<?php

declare(strict_types=1);

namespace App\Support;

use App\Services\LotterySettings;

/**
 * 将「最小货币单位」整数格式化为展示用字符串（不改变业务数字，仅格式化）。
 *
 * 展示格式固定为 2 位小数、`.` 小数点、`,` 千分位；不从后台设置或环境变量读取。
 */
final class CurrencyFormatter
{
    public static function fromMinor(int|string|null $minor): string
    {
        if ($minor === null || $minor === '') {
            return self::formatMinorInt(0);
        }

        return self::formatMinorInt((int) $minor);
    }

    private static function formatMinorInt(int $minorUnits): string
    {
        $decimals = LotterySettings::currencyDisplayDecimals();
        $decSep = LotterySettings::currencyDecimalSeparator();
        $thousandsSep = LotterySettings::currencyThousandsSeparator();

        $divisor = (int) max(1, 10 ** $decimals);
        $negative = $minorUnits < 0;
        $abs = abs($minorUnits);

        $integerPart = intdiv($abs, $divisor);
        $fractionRaw = $abs % $divisor;
        $fractionPadded = str_pad((string) $fractionRaw, $decimals, '0', STR_PAD_LEFT);

        $integerPartFormatted = number_format((float) $integerPart, 0, $decSep, $thousandsSep);

        if ($decimals === 0) {
            return ($negative ? '-' : '').$integerPartFormatted;
        }

        return ($negative ? '-' : '').$integerPartFormatted.$decSep.$fractionPadded;
    }
}
