a
    %ib                  	   @   s  d Z ddlmZmZmZmZ ddlmZ ddlZddlZddl	m
Z
 eedddZd+eeeed
ddZeeeedddZeeeedddZeeeef dddZd,eeeeeef ee ee ee dddZd-eeeeeeef  dddZeedddZeeeeeef  dddZeedd d!d"Zeedd d#d$Zeddd%d&Zeddd'd(Zeddd)d*ZdS ).z
Player Statistics and Photo Album System

Tracks lifetime statistics and captures memorable life moments.
Supports 15+ different statistics and integrates with achievement system.
    )DictAnyListOptional)datetimeN)get_database_connection)	player_idreturnc              
   C   s  d}d}zzTt  }| }|d| f |  td|   W W |rP|  |r\|  dS  ty } zN|rz|  tj	d|  d| dd W Y d}~W |r|  |r|  dS d}~0 0 W |r|  |r|  n|r|  | r|  0 dS )	z
    Create initial statistics record for new player.
    Called when player account is created.

    Args:
        player_id: The player's ID

    Returns:
        bool: True if successful, False otherwise
    NINSERT INTO player_statistics (player_id)
               VALUES (%s)
               ON DUPLICATE KEY UPDATE player_id = player_idz"Initialized statistics for player Tz)Error initializing statistics for player : exc_infoF)
r   cursorexecutecommitlogginginfoclose	Exceptionrollbackerror)r   connr   e r   5/var/www/lichun.app/lichun/ws/retention/statistics.pyinitialize_player_statistics   sF    	
r      )r   	stat_nameamountr	   c              
   C   s  |dkr$t d|  d| d dS d}d}g d}||vrPt d|  dS zzt }| }|d	| f d
| d| d}|||| f |  t d|  d| d|  W W |r|  |r|  dS  tyH } zX|r|	  t jd| d|  d| dd W Y d}~W |r.|  |r<|  dS d}~0 0 W |rZ|  |r|  n|rx|  |r|  0 dS )a  
    Increment a player statistic by a specified amount.

    Args:
        player_id: The player's ID
        stat_name: Name of the statistic column (e.g., 'total_relationships')
        amount: Amount to increment by (default: 1, must be positive)

    Returns:
        bool: True if successful, False otherwise

    Valid stat_name values:
        - lifetime_earnings, lifetime_spending
        - total_relationships, total_activities, total_conversations
        - total_years_lived, total_deaths
        - highest_job_level, max_affinity_reached
        - people_dated, times_fired, years_married
        - job_count, children_count, friends_count
    r   z$Invalid increment amount for player r   z (must be positive)FNlifetime_earningslifetime_spendingtotal_relationshipstotal_activitiestotal_conversationsZtotal_years_livedZtotal_deathsZhighest_job_levelZmax_affinity_reachedpeople_datedtimes_firedyears_married	job_countchildren_countfriends_countInvalid stat_name: r
   UPDATE player_statistics SET z = z + %s WHERE player_id = %sPlayer z incremented by TzError incrementing stat  for player r   
r   r   r   r   r   r   debugr   r   r   )r   r   r   r   r   valid_statsqueryr   r   r   r   increment_stat=   sX    		 
r3   )r   r   valuer	   c              
   C   sb  d}d}g d}||vr,t d|  dS zz|t }| }|d| f d| d}|||| f |  t d|  d	| d
|  W W |r|  |r|  dS  ty } zX|r|	  t jd| d|  d	| dd W Y d}~W |r|  |r|  dS d}~0 0 W |r0|  |r^|  n|rN|  |r\|  0 dS )a  
    Set a player statistic to a specific value.
    Used for 'highest' or 'max' type stats that track records.

    Args:
        player_id: The player's ID
        stat_name: Name of the statistic column
        value: Value to set

    Returns:
        bool: True if successful, False otherwise

    Example:
        # Update highest job level reached
        update_stat(player_id, 'highest_job_level', 5)
    Nr   r+   Fr
   r,    = %s WHERE player_id = %sr-   r    set to TzError updating stat r.   r   r/   )r   r   r4   r   r   r1   r2   r   r   r   r   update_stat   sR    		 
r7   c              
   C   s`  d}d}dg}||vr*t d|  dS zz|t }| }|d| f d| d}|||| f |  t d|  d	| d
|  W W |r|  |r|  dS  ty } zX|r|	  t jd| d|  d	| dd W Y d}~W |r|  |r|  dS d}~0 0 W |r.|  |r\|  n|rL|  |rZ|  0 dS )a  
    Set a boolean statistic (e.g., ever_married).

    Args:
        player_id: The player's ID
        stat_name: Name of the boolean statistic column
        value: Boolean value to set

    Returns:
        bool: True if successful, False otherwise
    Never_marriedzInvalid boolean stat_name: Fr
   r,   r5   r-   r   r6   TzError setting boolean stat r.   r   r/   )r   r   r4   r   r   Zvalid_bool_statsr2   r   r   r   r   set_boolean_stat   sR    	 
r9   c              
   C   s  d}d}zzrt  }|jdd}|d| f | }|sVt|  |d| f | }|r^|ni W W |rp|  |r||  S  ty } zDtjd|  d| dd i W  Y d}~W |r|  |r|  S d}~0 0 W |r|  |r|  n|r|  |r|  0 dS )z
    Get all statistics for a player.

    Args:
        player_id: The player's ID

    Returns:
        Dict with all statistic values, or empty dict if not found
    NT
dictionaryz4SELECT * FROM player_statistics WHERE player_id = %sz$Error getting statistics for player r   r   )	r   r   r   fetchoner   r   r   r   r   )r   r   r   statsr   r   r   r   get_player_statistics  sN    

r>   )r   
event_typedescriptionsnapshot_datacharacter_age	game_dater	   c                 C   st  d}d}zFzt  }|jdd}|du rN|d| f | }|rJ|d nd}|du r^t }|d| ||||t|f |j}	|	  t
d|  d	| d
|  |	W W |r|  |r|  S  ty0 }
 zR|r|  t
jd|  d	|
 dd W Y d}
~
W |r|  |r$|  dS d}
~
0 0 W |rB|  |rp|  n|r`|  |rn|  0 dS )a=  
    Capture a memorable life moment in the photo album.

    Args:
        player_id: The player's ID
        event_type: Type of event (e.g., 'graduation', 'marriage', 'birth')
        description: Human-readable description
        snapshot_data: Dictionary of relevant data to store
        character_age: Character's age at time of event (optional, will fetch from player if not provided)
        game_date: Game date/time (optional, will use current datetime if not provided)

    Returns:
        int: Photo album entry ID if successful, None otherwise

    Example:
        capture_photo_memory(
            player_id=1,
            event_type='graduation',
            description='Graduated from Harvard University',
            snapshot_data={'level': 'college', 'gpa': 3.8, 'major': 'Computer Science'}
        )
    NTr:   z%SELECT age FROM players WHERE id = %sager   zINSERT INTO player_photo_album
               (player_id, event_type, event_description, game_date, character_age, snapshot_data)
               VALUES (%s, %s, %s, %s, %s, %s)z!Captured photo memory for player r   z - z(Error capturing photo memory for player r   )r   r   r   r<   r   nowjsondumps	lastrowidr   r   r   r   r   r   r   )r   r?   r@   rA   rB   rC   r   r   playerZphoto_idr   r   r   r   capture_photo_memory3  sT    	
rJ   2   )r   limitoffsetr	   c              
   C   sz  d}d}zLzt  }|jdd}|d| ||f | }|D ]v}|drzt|d |d< W n tjy~   i |d< Y n0 |dr|d  |d< |dr>|d  |d< q>|W W |r|	  |r|	  S  t
y6 } zHtjd|  d	| dd
 g W  Y d}~W |r|	  |r,|	  S d}~0 0 W |rH|	  |rv|	  n|rf|	  |rt|	  0 dS )a7  
    Get photo memories for a player.

    Args:
        player_id: The player's ID
        limit: Maximum number of photos to return (default: 50)
        offset: Number of photos to skip (for pagination, default: 0)

    Returns:
        List of photo memory dictionaries, ordered by game_date descending
    NTr:   zSELECT id, event_type, event_description, game_date, character_age, snapshot_data, created_at
               FROM player_photo_album
               WHERE player_id = %s
               ORDER BY game_date DESC
               LIMIT %s OFFSET %srA   rC   
created_atz%Error getting photo album for player r   r   r   r   r   fetchallgetrF   loadsJSONDecodeError	isoformatr   r   r   r   )r   rL   rM   r   r   photosphotor   r   r   r   get_photo_album}  sT    



rW   c              
   C   s   d}d}zzTt  }|jdd}|d| f | }|r@|d ndW W |rR|  |r^|  S  ty } zBtjd|  d| dd	 W Y d}~W |r|  |r|  dS d}~0 0 W |r|  |r|  n|r|  |r|  0 dS )
z
    Get total count of photo memories for a player.

    Args:
        player_id: The player's ID

    Returns:
        int: Total number of photos
    NTr:   zESELECT COUNT(*) as count FROM player_photo_album WHERE player_id = %scountr   z+Error getting photo album count for player r   r   )r   r   r   r<   r   r   r   r   )r   r   r   resultr   r   r   r   get_photo_album_count  s@    

rZ   )r   r?   r	   c              
   C   sx  d}d}zJzt  }|jdd}|d| |f | }|D ]v}|dr~zt|d |d< W n tjy|   i |d< Y n0 |dr|d  |d< |dr<|d  |d< q<|W W |r|	  |r|	  S  t
y4 } zHtjd|  d	| dd
 g W  Y d}~W |r|	  |r*|	  S d}~0 0 W |rF|	  |rt|	  n|rd|	  |rr|	  0 dS )z
    Get all photo memories of a specific type for a player.

    Args:
        player_id: The player's ID
        event_type: Type of event to filter by

    Returns:
        List of photo memory dictionaries
    NTr:   zSELECT id, event_type, event_description, game_date, character_age, snapshot_data, created_at
               FROM player_photo_album
               WHERE player_id = %s AND event_type = %s
               ORDER BY game_date DESCrA   rC   rN   z(Error getting photos by type for player r   r   rO   )r   r?   r   r   rU   rV   r   r   r   r   get_photos_by_type  sT    



r[   )r   r   r	   c                 C   s   t | d| dS )z
    Track money earned by player.
    Call this whenever player receives money (salary, job, gifts, etc.)

    Args:
        player_id: The player's ID
        amount: Amount of money earned
    r    Nr3   r   r   r   r   r   track_money_earned  s    	r^   c                 C   s   t | d| dS )z
    Track money spent by player.
    Call this whenever player spends money (purchases, expenses, etc.)

    Args:
        player_id: The player's ID
        amount: Amount of money spent
    r!   Nr\   r]   r   r   r   track_money_spent  s    	r_   c                 C   s   t | dd dS )z
    Track new relationship formed.
    Call this when player forms a new relationship (friend, romantic, family).

    Args:
        player_id: The player's ID
    r"   r   Nr\   r   r   r   r   track_relationship_formed+  s    ra   c                 C   s   t | dd dS )z
    Track activity completion.
    Call this when player completes any activity.

    Args:
        player_id: The player's ID
    r#   r   Nr\   r`   r   r   r   track_activity_completed6  s    rb   c                 C   s   t | dd dS )z
    Track conversation with NPC.
    Call this when player has a conversation.

    Args:
        player_id: The player's ID
    r$   r   Nr\   r`   r   r   r   track_conversationA  s    rc   )r   )NN)rK   r   )__doc__typingr   r   r   r   r   rF   r   databaser   intboolr   strr3   r7   r9   r>   rJ   rW   rZ   r[   r^   r_   ra   rb   rc   r   r   r   r   <module>   s<   *KC76  
J"8$: