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diamonds2   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 | }|sdd
dW W |r|  |r|  S |d |k rd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_energyzUPDATE 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)zINSERT 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<zt  }|jdd}|d| f | }|rB|d sbW W |rR|  |r^|  dS t |d k rW 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