"""账本 → Product/ProductVariant 的只读投影。

语义（不可更改，否则锁定量会被重复扣减）：
- stock_qty    可售状态的实物在库量，含已锁定，不含在途/待检/不良
- reserved_qty 已锁定量
- available_qty 可下单量 = stock_qty - reserved_qty（沿用模型上的既有属性）
"""
from dataclasses import dataclass
from decimal import Decimal


@dataclass(frozen=True)
class Projection:
    stock_qty: Decimal
    reserved_qty: Decimal


def project(*, sellable_on_hand: Decimal, reserved: Decimal) -> Projection:
    # 负在库是 POS 离线追溯扣减的合法结果，必须原样投影
    return Projection(
        stock_qty=sellable_on_hand,
        reserved_qty=max(Decimal("0"), reserved),
    )
