<?php

declare(strict_types=1);

/**
 * 本文件属于 DBErp 进销存系统。
 *
 * 版权所有 © 2026 北京珑大钜商科技有限公司。保留所有权利。
 *
 * 未经官方授权，不得删除、篡改或隐藏本文件中的版权声明、产品标识与来源信息。
 * 商业授权、官方更新与技术支持服务，请以珑大官方支持中心记录为准。
 *
 * @link https://support.loongdom.cn
 * @see  https://www.dberp.com.cn
 */

namespace App\Tools\Support;

use App\Tools\Exceptions\ToolInvalidInputException;

/**
 * Tool 金额区间。两端均为闭区间，不做汇率换算，拒绝负数与倒置区间。
 */
final class ToolAmountRange
{
    /**
     * @return array{min: ?string, max: ?string}
     */
    public static function parseOptional(
        mixed $min,
        mixed $max,
        string $minField,
        string $maxField,
    ): array {
        $minAmount = self::optionalAmount($min, $minField);
        $maxAmount = self::optionalAmount($max, $maxField);

        if ($minAmount !== null && $maxAmount !== null && bccomp($minAmount, $maxAmount, 4) === 1) {
            throw ToolInvalidInputException::forField($minField, 'min must not be greater than max.');
        }

        return [
            'min' => $minAmount,
            'max' => $maxAmount,
        ];
    }

    private static function optionalAmount(mixed $value, string $field): ?string
    {
        if ($value === null) {
            return null;
        }

        if (is_string($value) && trim($value) === '') {
            return null;
        }

        if (is_bool($value) || is_array($value) || ! is_numeric($value)) {
            throw ToolInvalidInputException::forField($field, 'Amount must be numeric.');
        }

        if ((float) $value < 0) {
            throw ToolInvalidInputException::forField($field, 'Amount must not be negative.');
        }

        return number_format((float) $value, 4, '.', '');
    }
}
