a
    iZB                     @   sH  d Z ddlmZmZmZ ddlmZmZ ddlZddl	Z	ddl
Z
ddlmZ dddd	d
ddddd
ddddd
ddddd
ddddd
ddddd
ddddd
gZdd Zeeeef ddd Zeeeeef  d!d"d#Zeeeef dd$d%Zeeeef dd&d'Zed(d)d*Zeeeef dd+d,Zed-d.d/ZdS )0z
Daily Login Reward System

Tracks 7-day login streaks and awards diamonds, energy, items, or prestige.
Streak resets if player misses a day.
    )DictAnyOptional)date	timedeltaN)get_database_connection   diamonds   z
5 Diamonds)daytypeamountname   
   z10 Diamonds   energy2   z	50 Energy      z15 Diamonds   z20 Diamonds + Item      z25 Diamonds   z50 Diamonds Bonusc               
      s   ddl m}  zLtD ],}| d|d |d |d |d fI dH  qtd	tt d
 W n8 ty } z tjd| dd W Y d}~n
d}~0 0 dS )z
    Insert reward definitions into database.
    Called during server startup.
    Uses async database pool for proper connection management.
    r   )execute_querya@  INSERT INTO daily_login_rewards
                   (day_number, reward_type, reward_amount, display_name)
                   VALUES (%s, %s, %s, %s) AS new_reward
                   ON DUPLICATE KEY UPDATE
                   reward_amount=new_reward.reward_amount,
                   display_name=new_reward.display_namer   r   r   r   NzInitialized z daily login rewardsz"Error initializing daily rewards: Texc_info)database_asyncr   DAILY_REWARDSlogginginfolen	Exceptionerror)r   rewarde r&   8/var/www/lichun.app/lichun/ws/retention/daily_rewards.pyinitialize_daily_rewards   s    
r(   )	player_idreturnc              
   C   s\  d}d}t  }z&zt }|jdd}|d| f | }|s|d| |f |  td}t	d|  d dd|d	d
W W |r|
  |r|
  S |d }||krd	|d dd	d
W W |r|
  |r|
  S || j}d	}|dkr|d d }	|d d d }
n$d}	d}
d}t	d|  d| d |d|	||
| f |  t|d }t	d|  d|	 d|d   d|	||d
W W |r|
  |r|
  S  ty } zRtjd|  d| dd d	ddd	d
W  Y d}~W |r |
  |r|
  S d}~0 0 W |r*|
  |rX|
  n|rH|
  |rV|
  0 dS )a  
    Check and update daily login streak.
    Called when player connects to server.

    Args:
        player_id: The player's ID

    Returns:
        dict with keys:
        - reward_available: bool, whether reward can be claimed
        - streak: int, current streak count
        - reward: dict or None, today's reward details
        - streak_broken: bool, whether streak was broken today
    NT
dictionary6SELECT * FROM player_login_streak WHERE player_id = %szINSERT INTO player_login_streak
                   (player_id, current_streak, last_login_date, total_logins, next_reward_day)
                   VALUES (%s, 1, %s, 1, 1)r   Player z first login - starting streakF)Zreward_availableZstreakr$   streak_brokenlast_login_datecurrent_streaknext_reward_dayr   z streak broken after z dayszUPDATE player_login_streak
               SET current_streak = %s, last_login_date = %s,
                   total_logins = total_logins + 1, next_reward_day = %s
               WHERE player_id = %sz daily login - streak: z, day: z&Error checking daily login for player : r   r   )r   todayr   cursorexecutefetchonecommitget_daily_rewardr   r    closedaysr"   r#   )r)   connr5   r4   streak_datar$   
last_loginZdays_since_loginr/   Z
new_streakZnext_dayr%   r&   r&   r'   check_daily_login6   s    A6


 
r?   )
day_numberr*   c              
   C   sJ  d}d}zzt  }|jdd}|d| f | }|sjtd|   W W |rZ|  |rf|  dS |d |d |d |d	|d
 dW W |r|  |r|  S  ty } zBtj	d|  d| dd W Y d}~W |r|  |r|  dS d}~0 0 W |r|  |rF|  n|r6|  |rD|  0 dS )z
    Get reward for specific day.

    Args:
        day_number: Day number (1-7)

    Returns:
        Dict with reward details or None if not found
    NTr+   z7SELECT * FROM daily_login_rewards WHERE day_number = %szDaily reward not found for day r@   reward_typereward_amountZreward_item_iddisplay_name)r   r   r   Zitem_idr   z#Error getting daily reward for day r3   r   )
r   r5   r6   r7   r   warningr:   getr"   r#   )r@   r<   r5   r$   r%   r&   r&   r'   r9      sZ    

r9   c           
   
   C   s  d}d}z~zt  }|jdd}|d| f | }|sdddddW W |rV|  |rb|  S |d t krt|d	 d
kr|d	 nd}t|}|sddddW W |r|  |r|  S |d dkrd
dlm	} || d| |d  n|d dkr|d|d | f |
  n|d dkrH|d|d | f |
  nh|d dkr|d | }|r|d
 }|d| |d f |
  td|  d|dd  td|  d|  d|ddW W |r|  |r|  S  tyh }	 z^|r|  tjd |  d!|	 dd" ddd#dW  Y d}	~	W |rP|  |r^|  S d}	~	0 0 W |rz|  |r|  n|r|  |r|  0 dS )$z
    Claim today's reward.
    Awards the reward to player and marks as claimed.

    Args:
        player_id: The player's ID

    Returns:
        dict with keys:
        - success: bool
        - reward: dict or None
        - message: str
    NTr+   r-   FzNo login streak found)Zsuccessr$   messager0   r2   r   r   zReward not foundr   r	   )award_diamondsZdaily_reward_dayr   r   zHUPDATE players SET energy = LEAST(energy + %s, max_energy) WHERE id = %sprestigez9UPDATE players SET prestige = prestige + %s WHERE id = %sitemzKSELECT * FROM store_items WHERE category = 'luxury' ORDER BY RAND() LIMIT 1zINSERT INTO player_inventory (player_id, item_id, quantity)
                       VALUES (%s, %s, 1)
                       ON DUPLICATE KEY UPDATE quantity = quantity + 1idr.   z received luxury item: r   unknownz claimed daily reward: Day zReward claimed successfullyz'Error claiming daily reward for player r3   r   zServer error)r   r5   r6   r7   r:   r   r4   r9   monetization.diamond_economyrG   r8   fetchallr   r    rE   r"   rollbackr#   )
r)   r<   r5   r=   Z
reward_dayr$   rG   Zluxury_itemsrI   r%   r&   r&   r'   claim_daily_reward   s    U	?





rO   c              
   C   st  d}d}t  }z>zzt }|jdd}|d| f | }|sRd}d}d}n|d }|d }|d }|rv||knd	}| }	|d
 | }
g }|
D ]~}|d }|d }|d }||k p||ko|}||dkr|nd|dkr|nd|dkr|nd|dkrdnd|d}|| q|tdd }ddl	m	} |
||j  }|rX| n| }||||	||dW W |r|  |r|  S  ty0 } ztjd|  d| dd ddl	m	} |tdd }d| |
||j  dd	g dW  Y d}~W |r|  |r&|  S d}~0 0 W |rB|  |rp|  n|r`|  |rn|  0 dS )z
    Get complete daily reward state for iOS DailyRewardState model.

    Args:
        player_id: The player's ID

    Returns:
        Dictionary matching iOS DailyRewardState structure
    NTr+   zSELECT current_streak, last_login_date, next_reward_day
               FROM player_login_streak
               WHERE player_id = %sr   r1   r0   r2   FzSELECT day_number, reward_type, reward_amount, display_name
               FROM daily_login_rewards
               ORDER BY day_numberr@   rA   rB   r	   r   r   moneyr
   zLuxury Item)rJ   r	   r   rP   Z	bonusItemclaimed)r;   )datetime)ZcurrentStreakZlastLoginDateZnextResetDateZcanClaimZtodaysClaimedrewardsz,Error getting daily reward state for player r3   r   )r   r4   r   r5   r6   r7   rM   appendr   rR   combinemintime	isoformatr:   r"   r   r#   )r)   r<   r5   r4   Zstreak_infor1   r>   r2   Ztodays_claimedZ	can_claimZreward_definitionsrS   Z
reward_defZday_numrA   r   rQ   Z
day_rewardZtomorrowrR   Z
next_resetZlast_login_strr%   r&   r&   r'   get_daily_reward_stateO  s    
	


rY   )r)   c              
   C   sz   z6t |  t| }|| ddi| td|   W n> tyt } z&tjd|  d| dd W Y d}~n
d}~0 0 dS )	z
    WebSocket handler for daily login check.
    Called when player connects to server.

    Args:
        player_id: The player's ID
        send_to_client: Function to send messages to client (player_id, message_dict)
    r   ZdailyRewardStatusz"Sent daily reward state to player z,Error handling daily login check for player r3   Tr   N)r?   rY   r   r    r"   r#   )r)   Zsend_to_clientstater%   r&   r&   r'   handle_daily_login_check  s    	r[   c              
   C   s\  d}d}z.zt  }|jdd}|d| f | }|sddddddW W |rV|  |rb|  S |d |d	 |d
 |d r|d  nddW W |r|  |r|  S  ty } zRtjd|  d| dd dddddW  Y d}~W |r |  |r|  S d}~0 0 W |r*|  |rX|  n|rH|  |rV|  0 dS )z
    Get player's login streak information.

    Args:
        player_id: The player's ID

    Returns:
        dict with streak info
    NTr+   r-   r   r   )r1   total_loginsr2   r0   r1   r\   r2   r0   z%Error getting streak info for player r3   r   )	r   r5   r6   r7   r:   rX   r"   r   r#   )r)   r<   r5   r=   r%   r&   r&   r'   get_login_streak_info  sf    

r]   )r*   c               
   C   s   d} d}zz@t  } | jdd}|d | W W |r>|  | rJ|   S  ty } z>tjd| dd g W  Y d}~W |r|  | r|   S d}~0 0 W |r|  | r|   n|r|  | r|   0 dS )z]
    Get all daily reward definitions.

    Returns:
        List of reward dictionaries
    NTr+   z5SELECT * FROM daily_login_rewards ORDER BY day_numberzError getting all rewards: r   )r   r5   r6   rM   r:   r"   r   r#   )r<   r5   r%   r&   r&   r'   get_all_rewards
  s<    

r^   )__doc__typingr   r   r   rR   r   r   r   randomasynciodatabase.db_operationsr   r   r(   intstrr?   r9   rO   rY   r[   r]   listr^   r&   r&   r&   r'   <module>   s,   s.xi6