from __future__ import annotations

from dataclasses import dataclass
from decimal import Decimal, ROUND_DOWN, localcontext


@dataclass(frozen=True)
class HyperliquidAssetMeta:
    coin: str
    asset_id: int
    sz_decimals: int


def round_hyperliquid_size(size: Decimal, meta: HyperliquidAssetMeta) -> Decimal:
    if size <= 0:
        raise ValueError("size must be positive")
    quantum = Decimal("1").scaleb(-meta.sz_decimals)
    return size.quantize(quantum, rounding=ROUND_DOWN)


def round_hyperliquid_price(price: Decimal, *, significant_figures: int = 5) -> Decimal:
    if price <= 0:
        raise ValueError("price must be positive")
    adjusted = price.adjusted()
    exponent = Decimal("1e{}".format(adjusted - significant_figures + 1))
    with localcontext() as ctx:
        ctx.prec = max(28, significant_figures + abs(adjusted) + 4)
        rounded = (price / exponent).to_integral_value(rounding=ROUND_DOWN) * exponent
    return rounded.normalize()


def validate_min_notional(size: Decimal, price: Decimal, min_notional_usd: Decimal) -> bool:
    return (size * price) >= min_notional_usd
