a
    %ßiñ  ã                   @   sÚ   d Z ddlmZmZ ddlmZmZ ddlZddlmZ ddl	m
Z
 dd	d
œddd
œddd
œddd
œdœZe
d	dd�eeeeef dœdd„ƒZeedœdd„Zeeeef dœdd„Zeeeeef f dœdd„ZdS )zˆ
Energy Refill System

Handles energy refill purchases using diamonds.
Supports multiple tiers including unlimited energy for 24 hours.
é    )ÚdatetimeÚ	timedelta)ÚDictÚAnyN)Úget_database_connectioné   ©Ú
rate_limité   é
   )ÚenergyÚdiamondsé2   éd   é#   )ZsmallÚmediumÚfullÚunlimited_24hé<   )Z	max_callsZtime_window)Ú	player_idÚrefill_typeÚreturnc              
   C   sà  d}d}�z²�z|t vrDdd|› �dœW W |r6| ¡  |rB| ¡  S t | }|d }|d }tƒ }|jdd�}| d	| f¡ | ¡ }|s®dd
dœW W |r | ¡  |r¬| ¡  S |d |k rðdd|› d|d › �dœW W |râ| ¡  |rî| ¡  S d}|dk�r0t ¡ tdd� }|d }	| d||	|| |f¡ n*t	|d | |d ƒ}	| d||	| |f¡ |j
dk�r˜| ¡  dddœW W |�rˆ| ¡  |�r–| ¡  S |d | }
| d| ||||d |	f¡ | ¡  t d| › d|› d|› d�¡ dd|	|
|�rü| ¡ nddœdœW W |�r| ¡  |�r&| ¡  S  t�yœ } z\|�rF| ¡  tjd| › d|› �dd� dd dœW  Y d}~W |�r„| ¡  |�r’| ¡  S d}~0 0 W |�r®| ¡  |�rÜ| ¡  n|�rÌ| ¡  |�rÚ| ¡  0 dS )!a3  
    Handle energy refill purchase.

    Rate limited to 10 purchases per minute to prevent abuse.

    Args:
        player_id: The player's ID
        refill_type: Type of refill ('small', 'medium', 'full', 'unlimited_24h')

    Returns:
        dict with 'success', 'message', and 'new_balance' keys
    NFzInvalid refill type: )ÚsuccessÚmessager   r   T©Ú
dictionaryzVSELECT diamonds, energy, max_energy, unlimited_energy_until FROM players WHERE id = %szPlayer not foundzNot enough diamonds. Need z, have r   é   )ÚhoursZ
max_energyzœUPDATE players
                   SET diamonds = diamonds - %s, energy = %s, unlimited_energy_until = %s
                   WHERE id = %s AND diamonds >= %szUPDATE players
                   SET diamonds = diamonds - %s, energy = %s
                   WHERE id = %s AND diamonds >= %sr   z>Insufficient diamonds (concurrent purchase or balance changed)z´INSERT INTO energy_refill_purchases
               (player_id, refill_type, energy_amount, diamond_cost, energy_before, energy_after)
               VALUES (%s, %s, %s, %s, %s, %s)zPlayer z purchased z refill for z	 diamondszEnergy refilled successfully)r   r   Úunlimited_until)r   r   Únew_balancezEnergy refill error for player ú: )Úexc_infozServer error. Please try again.)ÚREFILL_TIERSÚcloser   ÚcursorÚexecuteÚfetchoner   Únowr   ÚminÚrowcountÚrollbackÚcommitÚloggingÚinfoÚ	isoformatÚ	ExceptionÚerror)r   r   Úconnr$   ZtierZdiamond_costZenergy_amountÚplayerr   Z
new_energyZnew_diamondsÚe© r4   ú</var/www/lichun.app/lichun/ws/monetization/energy_refills.pyÚpurchase_energy_refill   sÌ    þg–þþR«þK²
ü
üþ(Õüýýé
þ÷
ýr6   )r   r   c              
   C   sj  d}d}�z<z¾t ƒ }|jdd�}| d| f¡ | ¡ }|rB|d sbW W |rR| ¡  |r^| ¡  dS t ¡ |d k r’W W |r‚| ¡  |rŽ| ¡  dS | d| f¡ | ¡  W W |r¸| ¡  |rÄ| ¡  dS W n\ t�y& } zBt	 
d| › d	|› �¡ W Y d}~W |�r| ¡  |�r| ¡  dS d}~0 0 W |�r8| ¡  |�rf| ¡  n|�rV| ¡  |�rd| ¡  0 dS )
z¸
    Check if player currently has unlimited energy active.

    Args:
        player_id: The player's ID

    Returns:
        True if unlimited energy is active, False otherwise
    NTr   z8SELECT unlimited_energy_until FROM players WHERE id = %sÚunlimited_energy_untilFz>UPDATE players SET unlimited_energy_until = NULL WHERE id = %sz+Error checking unlimited energy for player r    )r   r$   r%   r&   r#   r   r'   r+   r/   r,   r0   )r   r1   r$   r2   r3   r4   r4   r5   Úcheck_unlimited_energy˜   sf    
þëîþöú
ýr8   )r   Úmessage_datac                 C   s¦   |  d¡}|s$|| ddddœƒ dS ddlm} t| |ƒ}|d	 rŒ|| d
dd|d dœƒ || d|d d |d d |d d dœdœƒ n|| dd|d dœƒ dS )zñ
    WebSocket message handler for 'purchaseEnergyRefill' messages.

    Args:
        player_id: The player's ID
        message_data: Message data containing 'refillType'
        send_to_client: Function to send message back to client
    Z
refillTyper0   ZINVALID_REQUESTzMissing refillType)ÚtypeÚ
error_coder   Nr   r   r   ZpurchaseCompleter   Tr   )r:   Úcategoryr   Z
newBalanceZplayerUpdater   r   )r   r   r7   )r:   ÚdataZPURCHASE_FAILEDr   )ÚgetÚ
validationr	   r6   )r   r9   Úsend_to_clientr   r	   Úresultr4   r4   r5   Úhandle_purchase_energy_refillÈ   s:    	
ý
ü


ýþ

ýrB   )r   c                   C   s   t  ¡ S )z~
    Get all available refill tiers.

    Returns:
        Dictionary of refill tiers with their energy and diamond costs
    )r"   Úcopyr4   r4   r4   r5   Úget_refill_tiersû   s    rD   )Ú__doc__r   r   Útypingr   r   r,   Údatabaser   r?   r	   r"   ÚintÚstrr6   Úboolr8   rB   rD   r4   r4   r4   r5   Ú<module>   s    ü
 03