a
    %ßiïb  ã                	   @   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}zØzTt ƒ }| ¡ }| 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
    Nú�INSERT 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z‚tƒ }| ¡ }| 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}zîzrt ƒ }|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}�zFz¸t ƒ }|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   z°INSERT 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}�zLzÈt ƒ }|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
�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:   zñSELECT 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}zÌzTt ƒ }|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}�zJzÆt ƒ }|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:   zãSELECT 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$: