
    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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)	GroupChat)User)DailyRewardBonusDailyRewardBonusType)DailyRewardLimitation)DailyRewardPrizeSource)DailyRewardPrizeType)get_day_in_pastis_same_day)get_value_from_percentagec                   T   e Zd ZU dZ e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z  ed<    e            Ze
ez  ed<    ed	
          Zeez  ed<    ed	d          Zeez  ed<    edd          Zeez  ed<    ed	d          Zeez  ed<    eedd          Zeez  ed<    ed          Ze
ez  ed<    ed          Ze
ez  ed<    G d d          Zed             Zed             Z ede!j!        fd            Z"edefd            Z#ededd fd            Z$edede
fd             Z%edede
de&e'         fd!            Z(de
fd"Z)de
fd#Z*ede
fd$            Z+de
fd%Z,edede
fd&            Z-de.fd'Z/d(S ))DailyRewardz
    DailyReward class
    daily_bonuses)backrefuserbase_amount
bonus_listtotal_amountstreak_count   )
max_length
limitationT)r   null
prize_type2   prize_valueprize_sourcedaily_rewards)r   r   
group_chat)r   
message_idmessage_id_prizec                       e Zd ZdZdS )DailyReward.Metadaily_rewardN)__name__
__module____qualname__db_table     /app/src/model/DailyReward.pyMetar%   %   s        !r,   r.   c                  ,    t          j                     dS )z)
        Reset the daily rewards
        N)r   reset_daily_rewardr+   r,   r-   resetzDailyReward.reset(   s     	!!!!!r,   c                      t           j                                        } |                                 }|d         dk    rdS d|d         v r1dt	          |d                             d          d                   z  S dS )zI
        Get how many times daily reward is reset during the day
           r      z*//)EnvCRON_DAILY_REWARDgetsplitint)cron_expression
cron_partss     r-   get_daily_reward_reset_timesz(DailyReward.get_daily_reward_reset_times0   s    
 /3355$**,,
 a=C2 :a=  Z]0055a89999 qr,   returnc                  \    ddl m}   | t          j                                                  S )Nr   get_next_run)src.service.date_servicerA   r6   r7   r8   r@   s    r-   get_next_reward_timez DailyReward.get_next_reward_timeC   s3    999999|C15577888r,   c                  R    ddl m}   | t                                                    S )Nr   get_remaining_duration)rB   rF   r   rC   rE   s    r-   !get_remaining_time_to_next_rewardz-DailyReward.get_remaining_time_to_next_rewardI   s1    CCCCCC%%k&F&F&H&HIIIr,   c                 4   t                                                               t           j        | k    t           j        t          d          k    z                                t           j                                                                                  S )z
        Get the last streak reward for the user
        :param user: The user
        :return: The last streak reward
        r3   )	r   selectwherer   dater   order_bydescfirstr   s    r-   get_last_streak_rewardz"DailyReward.get_last_streak_rewardO   sh       UK$,1A_UVEWEW1WXYYXk&++--..UWW		
r,   c                     t                               |           }|dS |j        }t          |j        t          d                    r|dz   S |j        S )zm
        Get the user's streak count
        :param user: The user
        :return: The streak count
        Nr3   )r   rP   r   r   rK   r   )r   last_streak_rewardr   s      r-   get_user_streak_countz!DailyReward.get_user_streak_count^   s_     )??EE%1)6 ).0B0BCC 	$!##!..r,   c           	         g }|}t          t                    D ]}d}|xt          j        k    rk t          j                                        }t          t                              |           t          j	                                                  }|}||z  }nxt          j
        k    r* | j        }t          j                                        |z  }nxt          j        k    rD |                                 s| j        j        }t          j                                        |z  }nWt          j        k    r5|                                 s4t          j                                        }n	 t+          d|           t-          t/          ||                    }||z  }|                    t3          ||||                     |S )z
        Get the bonus_list for the user
        :param user: The user
        :param base_amount: The base amount
        :return: The bonus_list
        NzInvalid bonus type: )listr   STREAKr6   DAILY_REWARD_BONUS_BASE_STREAKget_intminr   rS   DAILY_REWARD_BONUS_MAX_STREAKLOCATIONlocation_level DAILY_REWARD_BONUS_BASE_LOCATION
CREW_LEVELis_crew_membercrewlevel"DAILY_REWARD_BONUS_BASE_CREW_LEVELCREW_MVPhas_crew_mvp_bonusDAILY_REWARD_BONUS_CREW_MVP
ValueErrorr:   r   appendr   )	r   r   r   r   
bonus_type
multipliervaluer   amounts	            r-   get_bonuses_for_userz DailyReward.get_bonuses_for_usert   s    .0
"344 $	W $	WJJ0)0000>FFHHE#&#99$??9AACC$ $L ".JZ'EE 3)2222!%!4J@HHJJZWEE 5)4444..00 ! !%JBJJLLzYEE *2222244 ! ;CCEEEE$%HJ%H%HIII2<GGHHFF"L.z5&*UUVVVVr,   c                     t           j                                        }|                     | j                  }|j        |k     r
||j        z
  S ||j        |z  z
  S )zT
        Get the days to next prize
        :return: The days to next prize
        )r6   DAILY_REWARD_STREAK_DAYSrX   rP   r   r   )self
prize_daysrR   s      r-   get_days_to_next_prizez"DailyReward.get_days_to_next_prize   sc     199;;
!88CC *Z77 2 ??? /<zIJJr,   c                     | j         S )zV
        Get the base belly prize
        :return: The base belly prize offer
        r   ro   s    r-   get_base_belly_prize_offerz&DailyReward.get_base_belly_prize_offer   s       r,   c                      dS )zV
        Get the minimum belly prize
        :return: The minimum belly prize
        r3   r+   r+   r,   r-   get_minimum_belly_prizez#DailyReward.get_minimum_belly_prize   s	     qr,   c                     | j         dz  S )zV
        Get the maximum belly prize
        :return: The maximum belly prize
           rs   rt   s    r-   get_maximum_belly_prizez#DailyReward.get_maximum_belly_prize   s      1$$r,   c                     t                                                               t           j        | k                                              S )z
        Get the reward count for the user
        :param user: The user
        :return: The reward count for the user
        )r   rI   rJ   r   countrO   s    r-   get_reward_count_for_userz%DailyReward.get_reward_count_for_user   s8     !!##))+*:d*BCCIIKKKr,   c                    t                               | j                  dk    rdS |                                 t          j                                        k    rdS t                                                               t           j        | j        k    t           j	        t                      k    z                                            }|dk    S )zH
        Should award prize
        :return: Should award prize
        r3   TF)r   r}   r   rq   r6   rn   rX   rI   rJ   rK   r   r|   )ro   rewards_todays     r-   should_award_prizezDailyReward.should_award_prize   s     00;;q@@4 &&((C,H,P,P,R,RRR5   UK$	1k6F/J[J[6[\]]UWW 	 !!r,   N)0r'   r(   r)   __doc__ForeignKeyFieldr   r   __annotations__BigIntegerFieldr   r:   	TextFieldr   strr   IntegerFieldr   	CharFieldr   r	   r   r   r   r   r
   r   r!   r"   r#   r.   staticmethodr1   r=   datetimerC   rG   rP   rS   rU   r   rl   rq   ru   rw   rz   r}   boolr   r+   r,   r-   r   r      s          $3?4#Q#Q#QD$
 QQQ)8):):K&:::"+)++Ji---*9/*;*;L#';;;'3|~~L#$555.7i2.F.F.FJ++FFF3<9QU3V3V3VJ$y0VVV#,9#F#F#FKyFFF7@yBUY7Z7Z7ZL(94ZZZ.=o?/ / /J	O+    &2\t%<%<%<Jl"<<<+7<T+B+B+BcL(BBB" " " " " " " " " " \"   \$ 9("3 9 9 9 \9
 Js J J J \J
 
T 
m 
 
 
 \
 /D /S / / / \/* 14 1c 1dCS>T 1 1 1 \1fK K K K K"!C ! ! ! ! S    \% % % % % L L L L L \L"D " " " " " "r,   r   )r   peeweeresources.EnvironmentEnvironmentr6   src.model.BaseModelr   src.model.GroupChatr   src.model.Userr   -src.model.enums.daily_reward.DailyRewardBonusr   r   2src.model.enums.daily_reward.DailyRewardLimitationr	   3src.model.enums.daily_reward.DailyRewardPrizeSourcer
   1src.model.enums.daily_reward.DailyRewardPrizeTyper   rB   r   r   src.utils.math_utilsr   r   create_tabler+   r,   r-   <module>r      s'        # # # # # # ) ) ) ) ) ) ) ) ) ) ) )       ` ` ` ` ` ` ` ` T T T T T T V V V V V V R R R R R R A A A A A A A A : : : : : :_" _" _" _" _") _" _" _"D        r,   