a
    %ßi`)  ã                   @   sü   d Z ddlmZmZ ddlmZmZmZ ddlZddlm	Z	 ddl
mZ edd�d	d
œedd�dd
œe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eeeef 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 )ze
Time Skip System

Handles time skip purchases and simulation of game events during skipped periods.
é    )ÚdatetimeÚ	timedelta)ÚDictÚAnyÚListN)Úget_database_connectioné   )Ú
rate_limit©Úhoursé   ©ÚdurationÚdiamonds©Údaysé   )Úweekséd   é2   )Z1hourZ1dayZ1weekÚ
next_eventé<   )Ú	max_callsÚtime_window)Ú	player_idÚ	skip_typeÚreturnc                 C   sT  d}d}�z&�zŒ|t vrDdd|› �dœW W |r6| ¡  |rB| ¡  S t | }|d }tƒ }|jdd�}| d| f¡ | ¡ }|s¦dd	dœW W |r˜| ¡  |r¤| ¡  S |d
 rÔdddœW W |rÆ| ¡  |rÒ| ¡  S |d |k �rdd|› d|d › �dœW W |�r| ¡  |�r| ¡  S |d }t|tƒ�r:t 	|¡}|dk�rT|t
dd� }n||d  }t| |||ƒ}	| d|||	d |	d |	d |	d | |f¡ |jdk�rØ| ¡  dddœW W |�rÈ| ¡  |�rÖ| ¡  S |d | }
| d| ||||t|	d ƒf¡ | ¡  t d| › d|› d|› d�¡ ||  ¡ d  }dd!|
| ¡ ||	d dd"… |	d |	d |	d |	d d#œd$œd%œW W |�rŒ| ¡  |�rš| ¡  S  t�y } z\|�rº| ¡  tjd&| › d'|› �dd(� dd)dœW  Y d}~W |�rø| ¡  |�r| ¡  S d}~0 0 W |�r"| ¡  |�rP| ¡  n|�r@| ¡  |�rN| ¡  0 dS )*a1  
    Handle time skip purchase and simulation.

    Rate limited to 5 purchases per minute to prevent abuse.

    Args:
        player_id: The player's ID
        skip_type: Type of skip ('1hour', '1day', '1week', 'next_event')

    Returns:
        dict with 'success', 'message', and 'summary' keys
    NFzInvalid skip type: )ÚsuccessÚmessager   T)Ú
dictionaryz”SELECT diamonds, date, hourOfDay, minuteOfHour,
                      energy, health, happiness, age, dead
               FROM players WHERE id = %szPlayer not foundÚdeadzCannot skip time after deathzNot enough diamonds. Need z, have Údater   r   r   r   aD  UPDATE players
               SET diamonds = diamonds - %s, date = %s,
                   energy = GREATEST(0, energy + %s),
                   health = GREATEST(0, health + %s),
                   happiness = GREATEST(0, happiness + %s),
                   money = money + %s
               WHERE id = %s AND diamonds >= %sÚenergy_changeÚhealth_changeÚhappiness_changeÚmoney_earnedr   z>Insufficient diamonds (concurrent purchase or balance changed)z­INSERT INTO time_skip_purchases
               (player_id, skip_type, diamond_cost, time_before, time_after, events_simulated)
               VALUES (%s, %s, %s, %s, %s, %s)ÚeventszPlayer z	 skipped z for z	 diamondsi  zTime skipped successfullyé
   )ÚmoneyÚenergyÚhealthÚ	happiness)r   Znew_timeÚduration_hoursr&   Ústat_changes)r   r   ÚsummaryzTime skip error for player z: )Úexc_infozServer error. Please try again.)Ú
SKIP_TIERSÚcloser   ÚcursorÚexecuteÚfetchoneÚ
isinstanceÚstrr   Úfromisoformatr   Úsimulate_time_periodÚrowcountÚrollbackÚlenÚcommitÚloggingÚinfoÚtotal_secondsÚ	isoformatÚ	ExceptionÚerror)r   r   Úconnr2   ÚtierÚdiamond_costÚplayerZtime_beforeZ
time_afterZevents_summaryÚnew_diamondsr,   Úe© rI   ú8/var/www/lichun.app/lichun/ws/monetization/time_skips.pyÚpurchase_time_skip   sî    þw†üaœ^ŸþZ£

ûøþ2Ë

ÿüüûýâþ÷
ýrK   )r   Ú
start_timeÚend_timer   c                 C   sö  g }d}d}d}d}|  d| f¡ | ¡ }	|	s>g dddddœS |}
tdd�}d}d}d}|
|k �r(|dk �r(|
j}|	d rº|dkrº|d	k rº|
 ¡ d
k rº|	d rº|	d d }||7 }|d7 }|	d ræ|dkræ|dk ræ|
 ¡ d
k ræ|d7 }|dksö|dk rþ|d7 }|d8 }|d8 }|d8 }|
|7 }
|d7 }qX|dk�rP| dd|› d�t|ƒdœ¡ |dk�rx| dd|› d�|d dœ¡ tdtd|ƒƒ}td td!|ƒƒ}td"td#|ƒƒ}| d$d%|› d�t|ƒt|ƒt|ƒd&œd'œ¡ |t|ƒt|ƒt|ƒt|ƒdœS )(a0  
    Simulate game events during time skip period.

    Args:
        player_id: The player's ID
        start_time: Start of simulation period
        end_time: End of simulation period
        cursor: Database cursor (for efficiency)

    Returns:
        Summary dict with events and stat changes
    r   zSELECT occupation, occupationSalary, educationLevel, age,
                  relationships
           FROM players WHERE id = %s)r&   r%   r"   r#   r$   r   r
   é¨   Ú
occupationé	   é   r   ZoccupationSalaryé    ÚeducationLevelé   é   é   é   é   g      à?gš™™™™™¹?gš™™™™™É?ÚworkzWorked z hours)ÚtypeÚdescriptionr%   Úschoolz	Attended z hours of classes)rZ   r[   Zsmarts_gainediÎÿÿÿr   iìÿÿÿr'   iâÿÿÿé   r.   zTime advanced )r)   r*   r+   )rZ   r[   r-   )	r3   r4   r   ÚhourÚweekdayÚappendÚintÚmaxÚmin)r   rL   rM   r2   r&   r%   r"   r#   r$   Zplayer_stateÚcurrent_timeZsimulation_stepZhours_elapsedÚ
work_hoursZschool_hoursZhour_of_dayZhourly_wagerI   rI   rJ   r8   §   sŠ    üû	



ý

ý
ýýûr8   )r   Úmessage_datac                 C   sv   |  d¡}|s$|| ddddœƒ dS t| |ƒ}|d r\|| dd	|d
 dœƒ || ddiƒ n|| dd|d dœƒ dS )zë
    WebSocket message handler for 'purchaseTimeSkip' messages.

    Args:
        player_id: The player's ID
        message_data: Message data containing 'skipType'
        send_to_client: Function to send message back to client
    ZskipTyperB   ÚINVALID_REQUESTzMissing skipType)rZ   Ú
error_coder   Nr   ZtimeSkipCompleteTr.   )rZ   r   r.   rZ   ZrequestFullUpdateZTIME_SKIP_FAILEDr   )ÚgetrK   )r   rf   Úsend_to_clientr   ÚresultrI   rI   rJ   Úhandle_purchase_time_skip  s.    	
ý
ýÿýrl   )r   c                   C   s   dd„ t  ¡ D ƒS )z[
    Get all available time skip tiers.

    Returns:
        Dictionary of skip tiers
    c                 S   s4   i | ],\}}||d  r"|d    ¡ nd|d dœ“qS )r   Nr   r   )r?   )Ú.0ÚkeyÚvaluerI   rI   rJ   Ú
<dictcomp>H  s
   üþz"get_skip_tiers.<locals>.<dictcomp>)r0   ÚitemsrI   rI   rI   rJ   Úget_skip_tiersA  s    ûrr   )Ú__doc__r   r   Útypingr   r   r   r=   Údatabaser   Ú
validationr	   r0   ra   r6   rK   r8   rl   rr   rI   rI   rI   rJ   Ú<module>   s$   ü
 ÿr(