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   )weeksd   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 | }|sdd	dW W |r|  |r|  S |d
 rd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)
dictionaryzSELECT 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)zINSERT 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_gainedir   ir'   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(