"""租户存储配额校验 — 纯函数，不触碰数据库"""
import math
from typing import Optional


def mb_from_bytes(size_bytes: int) -> int:
    """字节数向上取整为 MB，用于配额累加"""
    if size_bytes <= 0:
        return 0
    return math.ceil(size_bytes / (1024 * 1024))


def check_quota(used_mb: int, quota_mb: int, incoming_mb: int) -> tuple[bool, Optional[str]]:
    """校验加上 incoming_mb 后是否超出 quota_mb。

    Returns:
        (是否允许, 超额时的错误提示；允许时为 None)
    """
    if used_mb + incoming_mb > quota_mb:
        return False, f"存储空间不足：已用 {used_mb}MB / 配额 {quota_mb}MB，本次上传需要 {incoming_mb}MB"
    return True, None
