
    Ii                        S r SSKJr  SSKJr  SSKJrJrJr  SSK	J
r
  SSKJr  \" S5      r\ " S	 S
5      5       r      SS jr S               SS jjr              SS jrg)z.Shared pot resolution helpers for poker games.    )annotations)	dataclass)CallableIterableTypeVar   )PokerPot)order_winners_by_buttonTPlayerc                  V    \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   Srg)PokerPotPayoutResult   z3Resolved payout data for a single main or side pot.int	pot_index
pot_amountzset[str]eligible_player_idslist[TPlayer]winnersztuple[int, tuple[int, ...]]
best_scorelist[tuple[TPlayer, int]]payouts N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r       =c:\Users\dbart\PlayPalace11\server\game_utils\poker_payout.pyr   r      s'    =NO!!++&&r    r   c                    U S::  d  U(       d  / $ U [        U5      -  nU [        U5      -  n/ n[        U5       H#  u  pVX%U:  a  SOS-   nUR                  Xg45        M%     U$ )a  Split a pot across already ordered winners.

Odd chips are awarded one at a time in the supplied order.

Args:
    pot_amount: Total chips in the pot.
    ordered_winners: Winners in odd-chip priority order.

Returns:
    List of ``(winner, payout)`` tuples in the same order.
r   r   )len	enumerateappend)r   ordered_winnersshare	remainderr   indexwinnerpayouts           r!   compute_ordered_payoutsr,      sm     Qo	#o..ES11I)+G"?3y0!a8'( 4 Nr    Nc                   / n[        U 5       H  u  pU	R                   V
s/ s H
  o" U
5      PM     nn
U Vs/ s H	  oc  M  UPM     nnU(       d  ME  [        U	R                  UUUUU5      u  pnnU(       a  U(       d  Ms  [	        U	R                  U5      nU(       a  U H  u  nnU" UU5        M     UR                  [        UU	R                  [        U	R                  5      UUUS95        M     U$ s  sn
f s  snf )a,  Resolve a sequence of pots and optionally apply payouts.

Args:
    pots: Main/side pots to resolve.
    get_player_by_id: Lookup from player id to player object.
    active_ids: Active player ids in current hand order.
    button_id: Current dealer/button player id.
    get_id: Callable to extract player id from player object.
    score_fn: Callable returning a comparable hand score tuple.
    award_fn: Optional callback to apply an awarded amount to a winner.

Returns:
    Resolved payout results for each pot that had at least one eligible winner.
)r   r   r   r   r   r   )r$   r   resolve_potamountr,   r%   r   set)potsget_player_by_id
active_ids	button_idget_idscore_fnaward_fnresultsr   potpideligible_playersplayerr   r   _share
_remainderr   r*   r+   s                       r!   resolve_pots_with_payoutsr?   4   s    . +-G#D/	=@=T=TU=Tc,S1=TU1AX1AvF1AX2=JJ3
/VZ j)#**g>")( #* #::$'(?(?$@%		
' *: N9 VXs   C3C8C8c                    Sn/ nU H2  nU" U5      n	Ub  X:  a  U	nU/nM  X:X  d  M!  UR                  U5        M4     U(       a  U(       d  / SSS4$ [        XrX45      n
U [        U5      -  nU [        U5      -  nXX4$ )a  Resolve a single pot and compute payouts.

Args:
    pot_amount: Total chips in this pot.
    eligible_players: Players eligible to win this pot.
    active_ids: Active player ids in current hand order.
    button_id: Current dealer/button player id.
    get_id: Callable to extract player id from player object.
    score_fn: Callable returning a comparable hand score tuple.

Returns:
    Tuple of (ordered_winners, best_score, share, remainder).
Nr   )r%   r
   r#   )r   r;   r3   r4   r5   r6   r   r   pscorer&   r'   r(   s                r!   r.   r.   l   s    * JG!3JcG NN1  WD!Q-g9UO#g,&ES\)I::r    )r   r   r&   r   returnr   )N)r1   zIterable[PokerPot]r2   zCallable[[str], TPlayer | None]r3   	list[str]r4   
str | Noner5   Callable[[TPlayer], str]r6   0Callable[[TPlayer], tuple[int, tuple[int, ...]]]r7   z%Callable[[TPlayer, int], None] | NonerC   zlist[PokerPotPayoutResult])r   r   r;   zIterable[TPlayer]r3   rD   r4   rE   r5   rF   r6   rG   rC   zBtuple[list[TPlayer], tuple[int, tuple[int, ...]] | None, int, int])r   
__future__r   dataclassesr   typingr   r   r   	poker_potr	   poker_showdownr
   r   r   r,   r?   r.   r   r    r!   <module>rM      s    4 " ! . .  3
)
 ' ' '" B 7;5
555 5 	5
 %5 ?5 45  5p#;#;'#; #; 	#;
 %#; ?#; H#;r    