
    soj-                         d dl Z d dlT d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ  G d de          Ze                                 dS )    N)*)	BaseModel)Crew)User)
GameStatus)IncomeTaxEventType)GameOutcome)datetime_is_afterget_remaining_duration)get_belly_formattedc                   h   e Zd ZU dZ eed          Zeez  ed<    eed          Zeez  ed<    e	d          Z
ee	z  ed	<    e	d          Zee	z  ed
<    e            Zeez  ed<    e            Zeez  ed<    e            Z eej                  Zeez  ed<    ed          Zej        ez  ed<    ed          Zej        ez  ed<    eedd          Zeez  ed<    ed          Zej        ez  ed<    ed          Zej        ez  ed<    e	d          Zee	z  ed<    ed          Ze ez  ed<   dZ! G d d          Z"e#d             Z$d?dede%e&         fd Z'd?dede%e         fd!Z(dede%e&         fd"Z)defd#Z*de fd$Z+de fd%Z,dedefd&Z-defd'Z.dedefd(Z/d)ede&fd*Z0d)ede fd+Z1e#de%e2         fd,            Z3dedefd-Z4dedefd.Z5dedz  fd/Z6dede fd0Z7de8fd1Z9de:fd2Z;d3 Z<d4 Z=de fd5Z>de8fd6Z?e#dededefd7            Z@e#de%e         fd8            ZAe#de%e         fd9            ZBe#de%d          fd:            ZCe#de%e         fd;            ZDe#de%e         fd<            ZEe#de%d          fd=            ZFe#de%e         fd>            ZGdS )@DavyBackFightz
    DavyBackFight class
    davy_back_fights_challengers)backrefchallenger_crewdavy_back_fights_opponentsopponent_crewr   )defaultchallenger_chestopponent_chestparticipants_countduration_hoursstatusT)null
start_dateend_datedavy_back_fights_conscripts)r   r   	conscriptconscript_datepenalty_end_datepenalty_payoutFis_auto_acceptedNc                       e Zd ZdZdS )DavyBackFight.Metadavy_back_fightN)__name__
__module____qualname__db_table     /app/src/model/DavyBackFight.pyMetar$   0   s        $r+   r-   c            	      p  K   t                                                               t           j        t          j        k    t           j        t          j                                        t          j	        t          j                                                  z
  k                                                dS )z
        Delete expire requests, so requests that are in AWAITING_OPPONENT_CONFIRMATION status and
        were created more than x minutes ago
        )minutesN)r   deletewherer   r   AWAITING_OPPONENT_CONFIRMATIONdatedatetimenow	timedeltaEnv'DAVY_BACK_FIGHT_REQUEST_EXPIRATION_TIMEget_intexecuter*   r+   r,   delete_expired_requestsz%DavyBackFight.delete_expired_requests3   s       	$$ J$MM!%%''$S-X-`-`-b-bcccd	
 	
 ')))))r+   crewreturnc                 <    | j         S fd| j         D             S )
        Get all the participants of a Davy Back Fight
        :param crew: The crew object
        :return: The list of participants
        Nc                 *    g | ]}|j         k    |S r*   r<   .0pr<   s     r,   
<listcomp>z2DavyBackFight.get_participants.<locals>.<listcomp>L   s     OOOa$r+   davy_back_fight_participantsselfr<   s    `r,   get_participantszDavyBackFight.get_participantsB   s0     <44OOOO4<OOOOr+   c                 P    d | j         D             S fd| j         D             S )r?   Nc                     g | ]	}|j         
S r*   )user)rC   rD   s     r,   rE   z8DavyBackFight.get_participants_users.<locals>.<listcomp>V   s    FFFqAFFFFr+   c                 4    g | ]}|j         k    |j        S r*   )r<   rM   rB   s     r,   rE   z8DavyBackFight.get_participants_users.<locals>.<listcomp>X   s"    TTT1QVt^^^^^r+   rF   rH   s    `r,   get_participants_usersz$DavyBackFight.get_participants_usersN   s>     <FFD$EFFFFTTTT ATTTTr+   c                 H      fd                                 D             S )z
        Get all the non-participants of a Davy Back Fight
        :param crew: The crew object
        :return: The list of non-participants
        c                 D    g | ]}|                                v|S )rA   )rO   )rC   mr<   rI   s     r,   rE   z<DavyBackFight.get_non_participants_users.<locals>.<listcomp>`   s5    aaaa$:U:U[_:U:`:`1`1`1`1`1`r+   )get_membersrH   s   ``r,   get_non_participants_usersz(DavyBackFight.get_non_participants_usersZ   s0     baaaa4++--aaaar+   c                 *    t          | j                  S )zS
        Get the status of the Davy Back Fight
        :return: The status
        )r   r   rI   s    r,   
get_statuszDavyBackFight.get_statusb   s     $+&&&r+   c                 B    |                                  t          j        u S )zt
        Check if the game is in progress
        :return: True if the game is in progress, False otherwise
        )rW   r   IN_PROGRESSrV   s    r,   in_progresszDavyBackFight.in_progressj   s    
   J$:::r+   c                 N    |                                                                  S )zj
        Check if the game has ended
        :return: True if the game has ended, False otherwise
        )rW   is_finishedrV   s    r,   	has_endedzDavyBackFight.has_endedq   s     
   ,,...r+   c                 D    t          fd| j        D                       S )zg
        Get the crew gain
        :param crew: The crew object
        :return: The crew gain
        c                 4    g | ]}|j         k    |j        S r*   )r<   contributionrB   s     r,   rE   z/DavyBackFight.get_crew_gain.<locals>.<listcomp>   s*    ```qQRQW[_Q_Q_ANQ_Q_Q_r+   )sumrG   rH   s    `r,   get_crew_gainzDavyBackFight.get_crew_gainx   s+     ````D,M```aaar+   c                 4    || j         k    r| j        S | j         S )zo
        Get the opponent crew
        :param crew: The crew object
        :return: The opponent crew
        r   r   rH   s     r,   get_opponent_crewzDavyBackFight.get_opponent_crew   s$     4'''%%##r+   c                     |                      |          }|                      |                     |                    }||k    rt          j        S ||k     rt          j        S t          j        S )z
        Get the in progress display status [WINNING, LOSING, DRAW]
        :param crew: The crew object
        :return: The in progress display status
        )rb   re   r   WINNINGLOSINGDRAW)rI   r<   
crew_totalopponent_totals       r,   get_in_progress_display_statusz,DavyBackFight.get_in_progress_display_status   sh     ''--
++D,B,B4,H,HII&&%%&&$$r+   rM   c                 x    ddl m} | j                            |j        |k                                              S )zk
        Get the participant
        :param user: The user object
        :return: The participant
        r   DavyBackFightParticipant)"src.model.DavyBackFightParticipantro   rG   r1   rM   get_or_none)rI   rM   ro   s      r,   get_participantzDavyBackFight.get_participant   sF     	POOOOO066$)T1
 

+--	r+   c                 0    |                      |          duS )z
        Check if the user is a participant
        :param user: The user object
        :return: True if the user is a participant, False otherwise
        N)rr   )rI   rM   s     r,   is_participantzDavyBackFight.is_participant   s     ##D))55r+   c                  H    t           j        t           j        t           j        gS )zn
        Get the tax events that generate a DBF contribution
        :return: The contribution events
        )r   GAMEFIGHTPLUNDERr*   r+   r,   get_contribution_eventsz%DavyBackFight.get_contribution_events   s     #');)ACUC]^^r+   c                 4    || j         k    r| j        S | j        S zm
        Get the chest amount
        :param crew: The crew object
        :return: The chest amount
        )r   r   r   rH   s     r,   get_chest_amountzDavyBackFight.get_chest_amount   s$     4'''((""r+   c                 R    |                      |                     |                    S r{   )r|   re   rH   s     r,   get_opponent_chest_amountz'DavyBackFight.get_opponent_chest_amount   s&     $$T%;%;D%A%ABBBr+   c                     |                                  t          j        t          j        fvrdS |                                  t          j        u r| j        S | j        S )z<
        Get the winner
        :return: The winner
        N)rW   r   WONLOSTr   r   rV   s    r,   get_winner_crewzDavyBackFight.get_winner_crew   sP    
 ??Z^Z_$EEE4??
..''!!r+   c                 2    |                                  |k    S )z
        Check if the crew is the winner
        :param crew: The crew object
        :return: True if the crew is the winner, False otherwise
        )r   rH   s     r,   is_winner_crewzDavyBackFight.is_winner_crew   s     ##%%--r+   c                 .    ddl m}  || j                  S )Nr   )r   )src.service.date_servicer   r   )rI   r   s     r,   get_remaining_timez DavyBackFight.get_remaining_time   s'    CCCCCC%%dm444r+   c                     ddl m} |                    | | j                  |                    | | j                  k    rt
          j        S t
          j        S )zJ
        Get the outcome of the game
        :return: The outcome
        r   rn   )rp   ro   get_total_contributionsr   r   r	   CHALLENGER_WONOPPONENT_WON)rI   ro   s     r,   get_outcomezDavyBackFight.get_outcome   sh    
 	POOOOO#;;$&
 
%==dDDVWWX X --''r+   c                 ~    |                                  t          j        u r| j        | j        z   S | j        | j        z   S )zL
        Get the penalty payout
        :return: The penalty payout
        )rW   r   r   r   r!   r   rV   s    r,   get_penalty_payoutz DavyBackFight.get_penalty_payout   s=    
 ??
..(4+>>>"T%888r+   c                 D    t          |                                           S )z`
        Get the penalty payout formatted
        :return: The penalty payout formatted
        )r   r   rV   s    r,   get_penalty_payout_formattedz*DavyBackFight.get_penalty_payout_formatted   s    
 #4#:#:#<#<===r+   c                 *    t          | j                  S )z
        Check if the game is in penalty period
        :return: True if the game is in penalty period, False otherwise
        )r
   r    rV   s    r,   in_penalty_periodzDavyBackFight.in_penalty_period  s    
 !!6777r+   c                 *    t          | j                  S )z\
        Get the penalty remaining time
        :return: The penalty remaining time
        )r   r    rV   s    r,   get_penalty_remaining_timez(DavyBackFight.get_penalty_remaining_time  s     &d&;<<<r+   c                 j    t          |                                 |                                          S )z
        Get the max participants
        :param challenger_crew: The challenger crew
        :param opponent_crew: The opponent crew
        :return: The max participants
        )minget_member_countrd   s     r,   get_max_participantsz"DavyBackFight.get_max_participants  s,     ?3355}7U7U7W7WXXXr+   c                  2    t           j        t           j        gS )zJ
        Get the active status
        :return: The active status
        )r   COUNTDOWN_TO_STARTrY   r*   r+   r,   get_active_statuszDavyBackFight.get_active_status  s     -z/EFFr+   c                  2    t           j        t           j        gS )zH
        Get the ended status
        :return: The ended status
        )r   r   r   r*   r+   r,   get_ended_statuszDavyBackFight.get_ended_status'  s     
00r+   c                      t                                                               t           j        t                                           z            S )z^
        Get the active Davy Back Fights
        :return: The active Davy Back Fights
        )r   selectr1   r   r   r*   r+   r,   
get_activezDavyBackFight.get_active/  s?     ##%%++ M$C$C$E$EE
 
 	
r+   c                  <    d t          j                    D             S )z
        Get the crews with enough members for Davy Back Fight
        :return: The crews with enough members for Davy Back Fight
        c                 z    g | ]8}|                                 t          j                                        k    6|9S r*   )r   r7    DAVY_BACK_FIGHT_MIN_PARTICIPANTSr9   )rC   cs     r,   rE   z>DavyBackFight.get_crew_with_enough_members.<locals>.<listcomp>?  sH     
 
 
!!##s'K'S'S'U'UUU UUUr+   )r   r   r*   r+   r,   get_crew_with_enough_membersz*DavyBackFight.get_crew_with_enough_members9  s)    
 
[]]
 
 
 	
r+   c                  f    t                                           } d | D             d | D             z   S )zp
        Returns the crew in active Davy Back Fight
        :return: The crew in active Davy Back Fight
        c                     g | ]	}|j         
S r*   r   rC   ds     r,   rE   z5DavyBackFight.get_crews_in_active.<locals>.<listcomp>M  s    222a!222r+   c                     g | ]	}|j         
S r*   r   r   s     r,   rE   z5DavyBackFight.get_crews_in_active.<locals>.<listcomp>M  s    5V5V5V!ao5V5V5Vr+   )r   r   )actives    r,   get_crews_in_activez!DavyBackFight.get_crews_in_activeE  s=     ))++2262225V5Vv5V5V5VVVr+   c                     t                                                               t           j                            t                                                     t           j        t          j                                        k              S )z
        Get the ended Davy Back Fights with penalty still active
        :return: The ended Davy Back Fights with penalty
        )	r   r   r1   r   in_r   r    r4   r5   r*   r+   r,   get_ended_with_penaltyz$DavyBackFight.get_ended_with_penaltyO  sb     ##%%++ $$]%C%C%E%EFF*X->-B-B-D-DD
 
 	
r+   c                  f    t                                           } d | D             d | D             z   S )zr
        Returns the crew in Davy Back Fight penalty
        :return: The crew in Davy Back Fight penalty
        c                     g | ]	}|j         
S r*   r   r   s     r,   rE   z6DavyBackFight.get_crews_in_penalty.<locals>.<listcomp>b  s    >>>a!>>>r+   c                     g | ]	}|j         
S r*   r   r   s     r,   rE   z6DavyBackFight.get_crews_in_penalty.<locals>.<listcomp>b  s-     B
 B
 B
 !AOB
 B
 B
r+   )r   r   )ended_with_penaltys    r,   get_crews_in_penaltyz"DavyBackFight.get_crews_in_penaltyZ  sS     +AACC>>+=>>> B
 B
%7B
 B
 B
 
 	
r+   )N)Hr&   r'   r(   __doc__ForeignKeyFieldr   r   __annotations__r   BigIntegerFieldr   intr   IntegerFieldr   r   penalty_daysSmallIntegerFieldr   r2   r   DateTimeFieldr   r4   r   r   r   r   r    r!   BooleanFieldr"   boolrG   r-   staticmethodr;   listanyrJ   rO   rT   rW   rZ   r]   rb   re   rl   rr   rt   r   ry   r|   r~   r   r   strr   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r+   r,   r   r      s          />o4/ / /OTO+    -<O2- - -M4/)    />oa.H.H.HcO+HHH,;OA,F,F,FNC/)FFF-9\^^l*;;;)5NC,&777<>>L&7&79' ' 'FC##    5BMt4L4L4LJ!M1LLL2?-T2J2J2JHh-/JJJ(73$) ) )Ito%    9F48P8P8PNH%5PPP:G-T:R:R:Rh'-7RRR,;OA,F,F,FNC/)FFF,8L,G,G,Gd\)GGG $( % % % % % % % %   \
P 
PT 
PT#Y 
P 
P 
P 
P
U 
U4 
U4: 
U 
U 
U 
Ubt bS	 b b b b'J ' ' ' ';T ; ; ; ;/4 / / / /b$ b3 b b b b	$d 	$ 	$ 	$ 	$4 J    $
D 
S 
 
 
 
64 6D 6 6 6 6 _T*<%= _ _ _ \_#T #c # # # #Cd Cs C C C C" " " " ".4 .D . . . .5C 5 5 5 5
([ ( ( ( (9 9 9> > >84 8 8 8 8=C = = = = Yd Y4 YC Y Y Y \Y GtJ/ G G G \G 1d:. 1 1 1 \1 
_- 
 
 
 \
 	
$t* 	
 	
 	
 \	
 Wd W W W \W 
D$9 
 
 
 \
 	
$t* 	
 	
 	
 \	
 	
 	
r+   r   )r4   peeweeresources.EnvironmentEnvironmentr7   src.model.BaseModelr   src.model.Crewr   src.model.Userr   src.model.enums.GameStatusr   -src.model.enums.income_tax.IncomeTaxEventTyper   src.model.game.GameOutcomer	   r   r
   r   src.utils.string_utilsr   r   create_tabler*   r+   r,   <module>r      s        # # # # # # ) ) ) ) ) )             1 1 1 1 1 1 L L L L L L 2 2 2 2 2 2 N N N N N N N N 6 6 6 6 6 6T
 T
 T
 T
 T
I T
 T
 T
n
        r+   