a
    %i%                     @   s   d Z ddlmZ ddlmZ ddlmZmZ ddlZddlZddl	Z	e
edddZeed	d
dZeee d	ddZeeedddZee
edddZeed	ddZeeeddddZeeddddZeeeddddZdS )zy
Tutorial State Tracking System

Manages tutorial progress, onboarding completion, and tooltip tracking for new players.
    )datetime)get_database_connection)CallableOptionalN)
tooltip_idreturnc                 C   s   t td| S )z1Validate tooltip ID contains only safe charactersz^[a-zA-Z0-9_-]+$)boolrematch)r    r   3/var/www/lichun.app/lichun/ws/retention/tutorial.pyvalidate_tooltip_id   s    r   )	player_idr   c              
   C   s  t | tr| dkrdddS d}d}zHzt }|jdd}|d| f | }|rd|d	 t|d
 dW W |r||  |r|  S |d| f |  t	
d|   ddddW W |r|  |r|  S  tyN } z^|r|  t	jd|  d| dd dt|dW  Y d}~W |r6|  |rD|  S d}~0 0 W |r`|  |r|  n|r~|  |r|  0 dS )z
    Initialize tutorial tracking for new player
    Returns: {'success': bool, 'tutorial_step': int, 'onboarding_complete': bool}
    r   F+Invalid player_id: must be positive integersuccesserrorNT
dictionary;SELECT * FROM player_tutorial_progress WHERE player_id = %stutorial_steponboarding_complete)r   r   r   zINSERT INTO player_tutorial_progress
               (player_id, tutorial_step, onboarding_complete, first_session_date, tooltips_seen)
               VALUES (%s, 0, FALSE, NOW(), '{}')z Initialized tutorial for player z'Error initializing tutorial for player : exc_info)
isinstanceintr   cursorexecutefetchoner   closecommitlogginginfo	Exceptionrollbackr   str)r   connr   existinger   r   r   initialize_tutorial   sn    


r*   c              
   C   sz  t | tr| dkr&td|   dS d}d}z&zt }|jdd}|d| f | }|sW W |rp|  |r||  dS |d rt	
|d ni }|d t|d	 |t|d
 dW W |r|  |r|  S  ty6 } zFtjd|  d| dd W Y d}~W |r|  |r*|  dS d}~0 0 W |rH|  |rv|  n|rf|  |rt|  0 dS )z(Get current tutorial progress for playerr   zInvalid player_id: NTr   r   tooltips_seenr   r   skip_tutorial)r   r   r+   r,   z+Error getting tutorial progress for player r   r   )r   r   r"   r   r   r   r   r   r    jsonloadsr   r$   )r   r'   r   resultr+   r)   r   r   r   get_tutorial_progressN   s^    


r0   )r   new_stepr   c              
   C   s  t | tr| dkrdddS t |tr6|dk s6|dkr@dddS d}d}zz|t }| }|d|| f |d	| td
|if |  t	d|  d|  d|dW W |r|
  |r|
  S  ty@ } z^|r|  tjd|  d| dd dt|dW  Y d}~W |r(|
  |r6|
  S d}~0 0 W |rR|
  |r|
  n|rp|
  |r~|
  0 dS )z^
    Advance player to next tutorial step
    Returns: {'success': bool, 'new_step': int}
    r   Fr   r   d   z*Invalid new_step: must be between 0 and 99NzKUPDATE player_tutorial_progress SET tutorial_step = %s WHERE player_id = %szINSERT INTO tutorial_milestones
               (player_id, milestone_type, milestone_data)
               VALUES (%s, 'step_complete', %s)stepPlayer z advanced to tutorial step T)r   r1   z(Error updating tutorial step for player r   r   )r   r   r   r   r   r-   dumpsr!   r"   r#   r    r$   r%   r   r&   )r   r1   r'   r   r)   r   r   r   update_tutorial_stepy   sZ    


r6   )r   r   r   c              
   C   s  t | tr| dkrdddS t |tr.| s8dddS t|sPdd| dS d}d}zHzt }| }|d|| f |jdkrdd	dW W |r|	  |r|	  S |d
| t
d|if |  td|  d|  ddiW W |r|	  |r|	  S  ty } z`|r(|  tjd|  d| dd dt|dW  Y d}~W |rj|	  |rx|	  S d}~0 0 W |r|	  |r|	  n|r|	  |r|	  0 dS )zI
    Mark a tooltip as seen by player
    Returns: {'success': bool}
    r   Fr   r   z,Invalid tooltip_id: must be non-empty stringzInvalid tooltip_id format: NzUPDATE player_tutorial_progress
               SET tooltips_seen = JSON_SET(
                   COALESCE(tooltips_seen, '{}'),
                   CONCAT('$.', %s),
                   TRUE
               )
               WHERE player_id = %szPlayer tutorial not initializedzINSERT INTO tutorial_milestones
               (player_id, milestone_type, milestone_data)
               VALUES (%s, 'tooltip_seen', %s)r   r4   z saw tooltip: r   Tz!Error marking tooltip for player r   r   )r   r   r&   stripr   r   r   r   rowcountr    r-   r5   r!   r"   r#   r$   r%   r   )r   r   r'   r   r)   r   r   r   mark_tooltip_seen   sh    



	
r9   c              
   C   sZ  t | tr| dkrdddS d}d}zzvt }| }|d| f ddlm} || d||}|  t	d	|  d
 dddW W |r|
  |r|
  S  ty } z^|r|  tjd|  d| dd dt|dW  Y d}~W | r|
  |r|
  S d}~0 0 W |r(|
  |rV|
  n|rF|
  |rT|
  0 dS )zr
    Mark onboarding as complete and award achievement
    Returns: {'success': bool, 'reward_diamonds': int}
    r   Fr   r   NzUPDATE player_tutorial_progress
               SET onboarding_complete = TRUE, onboarding_completed_date = NOW()
               WHERE player_id = %s)check_and_unlockfirst_stepsr4   z completed onboardingT   )r   reward_diamondsz'Error completing onboarding for player r   r   )r   r   r   r   r   Zretention.achievementsr:   r!   r"   r#   r    r$   r%   r   r&   )r   r'   r   r:   Zachievement_resultr)   r   r   r   complete_onboarding   sR    
	
r>   )r   message_datasend_to_clientr   c                 C   s0   | d}t| |}|d r,|| d|d dS )z/Handle tutorialStepComplete message from clientr3   r   ZtutorialStepUpdated)typer3   N)getr6   )r   r?   r@   r3   r/   r   r   r   handle_tutorial_step_complete!  s    

rC   )r   r?   r   c                 C   s   | d}t| | dS )z&Handle tooltipSeen message from clientZ	tooltipIdN)rB   r9   )r   r?   r   r   r   r   handle_tooltip_seen,  s    
rD   c                 C   s(   t | }|d r$|| d|d d dS )z-Handle completeOnboarding message from clientr   ZonboardingCompleter=   )rA   rewardN)r>   )r   r?   r@   r/   r   r   r   handle_complete_onboarding1  s    rF   )__doc__r   	functionsr   typingr   r   r-   r"   r	   r&   r   r   r   dictr*   r0   r6   r9   r>   rC   rD   rF   r   r   r   r   <module>   s   ;+4@4