def calc_confidence_3way(top_prob: float) -> float:
    """Returns the true win probability percentage (e.g. 0.45 -> 45.0)."""
    return max(0, min(99.0, top_prob * 100))

def calc_confidence_2way(prob: float) -> float:
    """Returns the true win probability percentage for the favored side."""
    # Find the probability of the >0.5 side
    win_prob = prob if prob >= 0.5 else (1.0 - prob)
    return max(0, min(99.0, win_prob * 100))

def calc_confidence_dc(top_prob: float) -> float:
    """Returns the true win probability percentage for double chance."""
    return max(0, min(99.0, top_prob * 100))

def calc_confidence_3way_with_agreement(top_prob: float, agreement_ratio: float,
                                         boost: float = 1.05, penalty: float = 0.95) -> float:
    """
    Returns the true win probability percentage, slightly adjusted by engine consensus.
    
    Args:
        top_prob: highest probability among options
        agreement_ratio: 0.0 to 1.0 — how many engines agree on the pick
    """
    base = calc_confidence_3way(top_prob)
    
    # Slight nudge rather than massive swing, to keep it feeling like a true probability
    if agreement_ratio >= 0.75:
        return min(99.0, base * boost)
    elif agreement_ratio <= 0.25:
        return max(0.0, base * penalty)
    
    return base
