
    sojd3                     x   d dl Z d dlZd dlmZ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 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# d dl$m%Z%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z: d dl;m<Z<m=Z= d dl>m?Z? dedej@        dede(dededed dfd!ZA	 	 d.dedej@        d"ed#eded$ed eBfd%ZCdedej@        d"ed#ededed dfd&ZDd$ed'eEd(eEd eFfd)ZG	 d.d*ed+eded$ed eHeEeEeEeEeEeEf         f
d,ZIdedej@        de(ded df
d-ZJdS )/    N)UpdateMessage)TelegramError)ContextTypes)
BountyLoan)	GroupChat)User)BountyLoanSource)BountyLoanStatus)Command)Emoji)ReservedKeyboardKeys)Screen)DevilFruitAbilityType)IncomeTaxEventType)GroupChatExceptionGroupChatError)Keyboard)add_loan)get_amount_from_stringvalidate_amountget_transaction_taxadd_or_remove_bounty)validate_durationget_duration_from_stringconvert_seconds_to_durationdatetime_is_beforeget_datetime_in_future_hours)get_ability_value)full_message_sendget_yes_no_keyboard)get_value_from_percentage"get_interest_percentage_from_value)get_belly_formattedupdatecontextuserinbound_keyboardtarget_usercommand
group_chatreturnc                 v   K   |t          | |||||           d{V  dS t          | |||           d{V  dS )aX  
    Manage the Bounty loan screen
    :param update: The update object
    :param context: The context object
    :param user: The user object
    :param inbound_keyboard: The keyboard object
    :param target_user: The target user in case of a reply
    :param command: The command
    :param group_chat: The group chat
    :return: None
    N)send_requestkeyboard_interaction)r%   r&   r'   r(   r)   r*   r+   s          1/app/src/chat/group/screens/screen_bounty_loan.pymanager1   +   sj      , 67D+w
SSSSSSSSS
vw0@$
G
GGGGGGGGGG    loanerborrowerloanc           
        K   |t          |j                  dk    r%t          |t          j        | d           d{V  dS t          | |||j        d         t          j                                                   d{V sdS t          | |||j        d         d           d{V sdS t          | ||j        d	                    d{V sdS t          ||||           d{V \  }}}}	}
}|j        |	k     rt          |j        d|d
z  z   z            }t          j                            t          |j                  t          |          t          |          |t          |	          t          |                    }t          ||| d           d{V  dS t!          |j                  s}t%          |j        t&          j                                        z
                                            }t          |t          j                            |          | d           d{V  dS t          |dz            }|t          j                                        k    r%t          |t          j        | d           d{V  dS |@|                                t5          j                    vrt9          t:          j                  dS )a[  
    Validate the bounty loan request
    :param update: The update object
    :param context: The context object
    :param loaner: The user that wants to loan
    :param borrower: The user that wants to borrow
    :param command: The command
    :param loan: The bounty loan object
    :return: True if the request is valid, False otherwise
    N   Tr%   add_delete_buttonFr      )should_validate_user_has_amount   d   iQ )len
parametersr    phrasesBOUNTY_LOAN_INVALID_COMMANDr   EnvBOUNTY_LOAN_MIN_AMOUNTget_intr   get_amountsbountyintBOUNTY_LOAN_NOT_ENOUGH_BOUNTYformatr$   r   $bounty_loan_issue_cool_down_end_dater   datetimenowtotal_seconds!BOUNTY_LOAN_ISSUE_COOLDOWN_ACTIVEBOUNTY_LOAN_MAX_DURATION_DAYS!BOUNTY_LOAN_MAX_DURATION_EXCEEDED
get_statusr   get_not_confirmed_statusesr   r   ITEM_IN_WRONG_STATUS)r%   r&   r3   r4   r*   r5   amounttax_percentage
tax_amounttotal_amountrepay_amountduration
max_amountot_textremaining_timeduration_dayss                   r0   validater^   H   s     ( |w!""a''#<V_c          5 %GVW%7%:C<V<^<^<`<`
 
 
 
 
 
 
 
 	 5 %GVW%7%:\a
 
 
 
 
 
 
 
 
 	 5 'vw8J18MNNNNNNNN 	5 Va'4V V P P P P P PLFNJlH
 }|##!~/C*DEFF
7>>..''
++--
++
 
  SWXXXXXXXXXXu fIJJ 
488;L;P;P;R;RRaacc
 
  5<<^LL"	
 
 
 	
 	
 	
 	
 	
 	
 	
 u 5())Ms8@@BBBB5"	
 
 
 	
 	
 	
 	
 	
 	
 	
 u DOO--5E5`5b5bbb !DEEE4r2   c                 .  K   t          | ||||           d{V sdS t          |||           d{V \  }}}}	}
}t          ||||t          j        ||
|t
          j        	  	        }t          |t          j	        |j
                  g}t          |||	          }	 t          ||| |d           d{V }|j        |_        |                                 dS # t          $ r2}|                                 t#          j        d|            |d}~ww xY w)a0  
    Send request to initiate a loan
    :param update: The update object
    :param context: The context object
    :param loaner: The user that wants to loan
    :param borrower: The user  that wants to borrow
    :param command: The command
    :param group_chat: The group chat
    :return: None
    N)sourcerU   rX   rY   statusscreenprimary_keyTr%   keyboardr9   z+Error sending bounty loan request message: )r^   rE   r   r
   USERr   AWAITING_LOANER_CONFIRMATIONr!   r   GRP_BOUNTY_LOANidget_textr    
message_idsaver   delete_instanceloggingerror)r%   r&   r3   r4   r*   r+   rT   rU   rV   rW   rX   rY   r5   inline_keyboardr[   messagees                    r0   r.   r.      s     & &'68WEEEEEEEE  Va'V V P P P P P PLFNJlH
  $%!<
 
 
D 	F6+AtwWWW-O tZ66G	!2WVoY]"
 "
 "
 
 
 
 
 
 
 ",		   GAGGHHHs   :C 
D"-DDrV   rW   c                 N   | j         }| j        }|                                 xt          j        k    r t
          j        }n)t          j        k    rt
          j        }n	 t
          j	        }t          j                            |                                |                                t          | j                  t          | j                  t#          | j                  t          |          | j        t          |          ||                                                                 t*          j                                        |                                |                                          }t1          | j        | j        d          }|t*          j                                        k    r"|t          j                            |          z  }|                                 t          j        u r4|t          j                            |                                           z  }|S )z
    Get the text for a bounty loan
    :param loan: The bounty loan
    :param tax_amount: The tax amount
    :param total_amount: The total amount
    :return: The text for the bounty loan
    F)add_decimal)r3   r4   rQ   r   rh   r   REDAWAITING_BORROWER_CONFIRMATIONYELLOWGREENr@   BOUNTY_LOAN_REQUESTrI   get_markdown_mentionr$   rT   rX   r   rY   rU   get_descriptionrB   BOUNTY_LOAN_GARNISH_PERCENTAGEgetr#   (BOUNTY_LOAN_PREDATORY_INTEREST_THRESHOLDrD   %BOUNTY_LOAN_REQUEST_PREDATORY_WARNINGACTIVEBOUNTY_LOAN_REQUEST_MANAGE_TEXTget_deeplink)r5   rV   rW   r3   r4   status_emojir[   loan_interests           r0   rk   rk      s    ;F]H
//

::::: 9LL<<< <LL ;L)00##%%%%''DK((D-..#DM22J''L))))++*..00%%''##%% G" 74;E  M sCKKMMMM7@GGVVV ,3337:AA$BSBSBUBUVVVNr2   senderreceiverc                   K   |Qt          |j        d         |           }t          |j        d         |           }t          |j        d                   }n|j        }|j        }|j        }t          | || j                  }|dk    rt          | t          j
        |          }t          |                                          rt          |          }t          t          ||                    }||z   }	||||	||fS )z
    Get the amounts for a bounty loan
    :param sender: The sender
    :param receiver: The receiver
    :param command: The command
    :param loan: The bounty loan object
    :return: The amount, tax percentage, tax amount, total amount
    Nr   r:   r<   )r   r?   r   rT   rX   rY   r   bounty_gift_taxr   r   GIFT_LOAN_TAXfloat
is_integerrG   r"   )
r   r   r*   r5   rT   rX   rY   rU   rV   rW   s
             r0   rE   rE     s      |'(:1(=vFF-g.@.CVLL+G,>q,ABB(=(6;QRRN *)7
 

 ^'')) -^,,.v~FFGGJJ&L>:|\8SSr2   c                   K   t          j        |                    t          j                            }|j        t          j                 s9|                                 t          |t          j
        | d           d{V  dS |j        }|j        }t          | ||||           d{V s|                                 dS t          |||           d{V \  }}}	}
}}||_        t!          |j                  t           j        u rtt           j        |_        |                                 t+          ||	|
          }t-          |t.          j        |j                  g}t          ||| |d           d{V  dS t           j        |_        t6          j                                        t7          j        |          z   |_        |                                 |xj        t@          j!        "                                z  c_        tG          t@          j$        "                                          |_%        tM          ||
d| d	           d{V  tM          ||| tN          j(        |j        d
           d{V  |dk    r|)                    d|            d{V  t+          ||	|
          }t          |||            d{V  dS )z
    Keyboard interaction
    :param update: The update object
    :param context: The context object
    :param inbound_keyboard: The inbound keyboard
    :param user: The user object
    :return: None
    Tr8   N)r5   rb   re   )secondsF)addr%   should_save)r%   tax_event_typeevent_idr   r   )r%   )*r   	get_by_idr~   r   DEFAULT_PRIMARY_KEYinfoCONFIRMrn   r    r@   BOUNTY_LOAN_CANCELLEDr3   r4   r^   rE   rU   r   ra   rh   rw   rm   rk   r!   r   ri   rj   r   rK   rL   	timedeltadeadline_dater   rB   BOUNTY_GIFT_TAX_INCREASErD   r   #BOUNTY_LOAN_ISSUE_COOLDOWN_DURATIONrJ   r   r   BOUNTY_LOANpay)r%   r&   r(   r'   r5   r3   r4   rT   rU   rV   rW   rX   rY   r[   rq   s                  r0   r/   r/   :  sw      "+1EFF D
  !5!=> W26UY
 
 
 	
 	
 	
 	
 	
 	
 	
 	;F]H&'68$GGGGGGGGG  VatV V V P P P P P PLFNJlH )D$$(8(UUU&E		4\::  1GUYU\]]]1
  WVoY]
 
 
 	
 	
 	
 	
 	
 	
 	
 	")DK!*..0083Eh3W3W3WWDIIKKK c:BBDDD2N/77993 3F/ v|v[_
`
`
```````` )5          qhhqh((((((((( tZ66G
GWV
<
<
<<<<<<<<<<r2   )NN)KrK   ro   src.tg_compatr   r   src.tg_compat.errorr   src.tg_compat.extr   resources.EnvironmentEnvironmentrB   resources.phrasesr@   src.model.BountyLoanr   src.model.GroupChatr   src.model.Userr	    src.model.enums.BountyLoanSourcer
    src.model.enums.BountyLoanStatusr   src.model.enums.Commandr   src.model.enums.Emojir   $src.model.enums.ReservedKeyboardKeysr   src.model.enums.Screenr   1src.model.enums.devil_fruit.DevilFruitAbilityTyper   -src.model.enums.income_tax.IncomeTaxEventTyper   src.model.error.GroupChatErrorr   r   src.model.pojo.Keyboardr   src.service.bounty_loan_servicer   src.service.bounty_servicer   r   r   r   src.service.date_servicer   r   r   r   r   src.service.devil_fruit_servicer   src.service.message_servicer    r!   src.utils.math_utilsr"   r#   src.utils.string_utilsr$   DEFAULT_TYPEr1   boolr^   r.   rG   strrk   tuplerE   r/    r2   r0   <module>r      sx     ) ) ) ) ) ) ) ) - - - - - - * * * * * * # # # # # # # # # # # # + + + + + + ) ) ) ) ) )       = = = = = = = = = = = = + + + + + + ' ' ' ' ' ' E E E E E E ) ) ) ) ) ) S S S S S S L L L L L L M M M M M M M M , , , , , , 4 4 4 4 4 4                         > = = = = = N N N N N N N N ^ ^ ^ ^ ^ ^ ^ ^ 6 6 6 6 6 6HH&H H 	H
 H H H 
H H H HD [ [[&[ [ 	[
 [ [ 
[ [ [ [|88&8 8 	8
 8 8 
8 8 8 8v/: /3 /c /c / / / /f OS$T $T$T $T+2$TAK$T
3S#sC'($T $T $T $TNM=M=)6M=JRM=Z^M=	M= M= M= M= M= M=r2   