"""Pure sizing math shared by the D48 risk-cap forward candidate."""


def risk_capped_stake(
    *,
    wallet: float,
    risk_fraction: float,
    atr_loss_fraction: float,
    hard_stop_fraction: float,
    wallet_cap_fraction: float,
    max_stake: float,
) -> float:
    """Size against the larger of ATR risk and the actual hard-stop loss."""
    values = (
        wallet,
        risk_fraction,
        atr_loss_fraction,
        hard_stop_fraction,
        wallet_cap_fraction,
        max_stake,
    )
    if any(value <= 0 for value in values):
        raise ValueError("risk-cap inputs must be positive")

    effective_loss_fraction = max(atr_loss_fraction, hard_stop_fraction)
    risk_stake = wallet * risk_fraction / effective_loss_fraction
    wallet_cap = wallet * wallet_cap_fraction
    return min(risk_stake, wallet_cap, max_stake)
