from __future__ import annotations

from dataclasses import dataclass
from decimal import Decimal, ROUND_DOWN


@dataclass(frozen=True)
class PositionSizeDecision:
    size: Decimal
    notional_usd: Decimal
    margin_usd: Decimal
    risk_usd: Decimal
    capped_by: str


def calculate_risk_position_size(*, wallet_equity_usdc: Decimal, risk_per_trade_pct: Decimal, stop_distance_pct: Decimal, leverage: Decimal, price: Decimal, max_position_margin_pct: Decimal, max_position_notional_pct: Decimal) -> PositionSizeDecision:
    if min(wallet_equity_usdc, risk_per_trade_pct, stop_distance_pct, leverage, price) <= 0:
        raise ValueError("sizing inputs must be positive")
    risk_usd = wallet_equity_usdc * risk_per_trade_pct / Decimal("100")
    notional = risk_usd / (stop_distance_pct / Decimal("100"))
    capped_by = "risk"
    margin_cap_notional = wallet_equity_usdc * max_position_margin_pct / Decimal("100") * leverage
    if notional > margin_cap_notional:
        notional = margin_cap_notional
        capped_by = "margin_cap"
    notional_cap = wallet_equity_usdc * max_position_notional_pct / Decimal("100")
    if notional > notional_cap:
        notional = notional_cap
        capped_by = "notional_cap"
    margin = notional / leverage
    size = (notional / price).quantize(Decimal("0.00000001"), rounding=ROUND_DOWN)
    return PositionSizeDecision(size=size, notional_usd=notional, margin_usd=margin, risk_usd=risk_usd, capped_by=capped_by)
