a
    'Ni™  ã                   @   s*  d Z ddlZddlZddlZddlmZ dd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZdFd3d4„ZdGd5d6„Zd7d8„ Zd9d:„ Zd;d<„ ZdHd>d?„Z d@dA„ Z!dBdC„ Z"dDdE„ Z#dS )Ia­  
Character Manager Module

This module contains all character creation and management functions for BaoLife.
Extracted from functions.py to improve code organization and maintainability.

Functions in this module handle:
- Character creation (players, NPCs, family members, friends, classmates, coworkers)
- Character data retrieval and manipulation
- Relationship management
- Avatar generation
- Bio and description generation
é    N)Ú	timedeltac                 C   s¬  | j › d| j› d| j ¡ › d�}| jD ]}|d|› d�7 }q&| jdkrŒt| dƒrb|d| j› d	�7 }t| d
ƒrŒt| jdƒrŒ|d| jj	› d�7 }| jdkrât| dƒrâ|d| j
› d�7 }t| dƒrâ| jrât| jdƒrâ|d| jj	› d�7 }| jdk�rDt| dƒ�r| j�r|dd | j¡› �7 }t| dƒ�rD| j�rD|dd | j¡› d�7 }| jdk�r¨t| d
ƒ�r~t| jdƒ�r~|d| jj› d�7 }t| dƒ�r¨| jdk�r¨|d| j› d�7 }|S ) zÅ
    Generate a human-readable description of a person based on their attributes.

    Args:
        person: personClass instance

    Returns:
        str: Formatted description of the person
    ú z is a Ú.z They are your z. r   ÚageYearsz
 They are ú
 years oldÚjobÚtitlez, and work as a é   Ú	educationz They have a z level of educationÚcollegez, and graduated from é(   Úlikesz. Their interests include ú, Údislikesz, but they dislike éP   Úincomez. They earn approximately z per month from their jobÚmoneyz, and have about z in savings.)Ú	firstnameÚlastnameÚsexÚlowerÚrelationshipsÚfamiliarityÚhasattrr   r   r   r
   r   r   Újoinr   r   r   ©ÚpersonÚdescriptionÚi© r   ú</var/www/lichun.app/lichun/ws/character/character_manager.pyÚgetPersonDescription   s.    
 


r!   c                 C   s°  d| j › d| j› d| j ¡ › �}| jD ]&}|dkr<|d7 }q&|d|› d�7 }q&t| dƒrj|d	| j› d
�7 }t| dƒr”t| jdƒr”|d| jj› d�7 }t| dƒr´|d| j	 ¡ › d�7 }t| dƒrþ|d| j
› �7 }t| dƒrþ| jrþt| jdƒrþ|d| jj› d�7 }t| dƒ�r(| j�r(|dd | j¡› �7 }t| dƒ�rT| j�rT|dd | j¡› d�7 }t| dƒ�r‚t| jdƒ�r‚|d| jj› d�7 }t| dƒ�r¬| jdk�r¬|d| j› d�7 }|S ) z¿
    Generate an OpenAI-formatted description for AI conversation prompts.

    Args:
        person: personClass instance

    Returns:
        str: Formatted description for AI prompts
    zPretend you are r   z, a Zdating_matchzž. Pretend you're on a dating app. You just met your conversation partner on a dating app. Be tastefuly flirty! If they are rude, you can end the conversation.z. You are a z to the conversation partnerr   z You're r   r   r   r   Úmoodz and you are r
   z you studied r   z at r   z. you like r   r   z & dislike r   z. you earn z/mor   r   z & have z saved.)r   r   r   r   r   r   r   r   r   r"   r
   r   r   r   r   r   r   r   r   r   r    ÚgetOpenAIDescriptionC   s0    
 




r#   c                 C   sF  t | jdƒsd| j_t | jdƒs(d| j_t | jdƒs<d| j_ddg}ddg}g d	¢}d
}g d¢}g d¢}g d¢}d}g d¢}	d}
g d¢}g d¢}g d¢}g d¢}g d¢}g d¢}g d¢}g d¢}dddœdddœdddœdd dœd!d"dœd#d$dœd%d&dœd'd(dœd)d*dœd+d,dœg
}g d-¢}g d.¢}g d/¢}d0}| jjdk�rH|d17 }n|d2| jj› �7 }| jjdk�rr|d37 }n|d4| jj› �7 }t | jdƒ�rª| jjdk�rª|d57 }n|d6| jj› �7 }|d7| jj› �7 }|d8| jj› �7 }|d9t |¡› �7 }|d:t |¡› �7 }|d;| jj	› �7 }|d<| jj
› �7 }|d=7 }|d>7 }|| _|S )?zœ
    Generate and set avatar URL for a person using DiceBear API.

    Args:
        person: personClass instance

    Returns:
        str: Avatar URL
    ÚhairÚNONEÚfacial_hairÚ	accessoryÚtransparentZcircleÚincludeÚexclude)ZlongHairZ	shortHairZeyepatchZhatZhijabZturbanéd   )ÚblackZblueÚgrayZheatherÚpastelZpinkÚredZwhite)Úauburnr,   ÚblondeÚbrownr.   Úplatinumr/   r-   )ZkurtZprescription01Zprescription02ÚroundZ
sunglassesZ	wayfarersé
   )ÚmediumÚlightZmagesticZfancyZmagnum)r0   r,   r1   r2   r3   r/   )ZblazerZsweaterZshirtZhoodieZoverall)Z3c4f5cZ65c9ffZ262e33Z5199e4Z25557cZ929598Za7ffc4Zb1e2ffZe6e6e6Zff5c5cZff488eZffafb9Zffffb1Zffffff)
ZbatZbearZcumbiaZdeerZdiamondZholaZpizzaZresistZskullZskullOutline)ÚangryÚdefaultZflatZraisedÚsadZunibrowZup)ZtannedZyellowZpaler7   r2   Z	darkBrownr,   )Z	concernedr9   Z	disbeliefr:   ZseriousZsmileZtwinkle)Z614335Zae5d29Zd08b5bZedb98aZf8d25cZfd9841Zffdbb4ÚBlackÚ2c1b18©ÚnameÚhexú
Dark BrownÚ4a312cúChestnut BrownÚ724133ÚAuburnÚa55728úGolden BrownÚb58143ÚRedÚc93305ÚBlondeÚd6b370ú
Light GreyÚe8e1e1ú	Dark GreyÚecdcbfÚCopperÚf59797)r8   ZangryNaturalr9   ZdefaultNaturalZflatNaturalZfrownNaturalZraisedExcitedZraisedExcitedNaturalZsadConcernedZsadConcernedNaturalZunibrowNaturalZupDown)ÚclosedZcryr9   ZhappyZsideZsquintZ	surprised)Ú
beardLightZbeardMajesticÚbeardMediumZmoustacheFancyÚmoustacheMagnumz;https://api.dicebear.com/7.x/avataaars/svg?seed={person.id}z&topProbability=0z&top=z&facialHairProbability=0z&facialHair=z&accessoryProbability=0z&accessory=z&hairColor=z
&clothing=z&clothesColor=z&clothingGraphic=z&skinColor=z&mouth=z&eyes=defaultz&eyebrows=default)r   Úavatar_settingsr$   r&   r'   Ú
hair_colorZclothingÚrandomÚchoiceÚ
skin_colorZmouthZimageURL)r   ÚstyleÚmodeÚtopZ	topChanceZhatColorZ	hairColorÚaccessoriesZaccessoriesChanceZ
facialHairZfacialHairChanceZfacialHairColorZclothesZclothesColorZclothingGraphicZeyebrowZskinZmouthOptionsZ
skinColorsÚ
haircolorsZeyebrowsZeyesZfacial_hairsÚbase_urlr   r   r    Ú
set_avatars   st    
ö


ra   c                    sD  dddœdddœdddœdd	dœd
ddœdddœdddœdddœdddœdddœg
‰ ‡ fdd„}t | ƒ | jjdv r’|dƒ|dƒ|dƒ|dƒg}nX| jjdkr¶|dƒ|dƒ|dƒg}n4| jjdv rÔ|dƒ|dƒg}n|dƒ|d
ƒ|dƒg}| jdk�r:|dƒ|v �r| |dƒgd ¡ |dƒ|v �r:| |dƒgd ¡ t |¡S )z¬
    Get appropriate hair color based on person's age and skin tone.

    Args:
        person: personClass instance

    Returns:
        str: Hex color code for hair
    r;   r<   r=   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   c                    s&   ˆ D ]}|d | kr|d   S qd S )Nr>   r?   r   )Z
color_nameZcolor©r_   r   r    Úget_hexð   s    zget_hair_color.<locals>.get_hex)ZPALEZLIGHTZBROWN)Z
DARK_BROWNZBLACKé2   é   )ÚprintrV   rZ   r   ÚextendrX   rY   )r   rc   Zhair_colorsr   rb   r    Úget_hair_color×   s4    örh   c                 C   s^   dg}| j dk rd}n:| j dkr4| jdkr4ddg}n| jdkrHg d¢}ng d¢}t |¡}|S )z¢
    Get appropriate hair type based on person's age and sex.

    Args:
        person: personClass instance

    Returns:
        str: Hair type identifier
    r%   é   rd   ÚMaleÚsides)ZdreadsZdreads01Zdreads02ÚfroZshaggyZshaggyMulletZ	shortFlatZ	theCaesarZtheCaesarAndSidePartZshavedSidesrk   Z
shortWavedZfrizzleZ
shortRoundZ
shortCurly)ZbigHairZbobZbunZcurlyrl   ZcurvyZfroBandZlongButNotTooLongZ
miaWallaceZ
straight01Z
straight02ZstraightAndStrand)r   r   rX   rY   )r   Z
hair_typesZ	hair_typer   r   r    Úget_hair_type  s    





rm   c                 C   s6   | j dkr.| jdkr.| jdkr.t g d¢¡}nd}|S )z«
    Get appropriate facial hair based on person's age and sex.

    Args:
        person: personClass instance

    Returns:
        str: Facial hair type identifier
    rj   é   rd   )rS   rT   rU   r%   )r   r   rX   rY   )r   r&   r   r   r    Úget_facial_hair$  s    
ro   c                 C   s`   g d¢}| j dk rg d¢}n,d| j   kr2dkr@n n
g d¢}ng d¢}tj||dd�d	 }|S )
z©
    Get appropriate accessory (glasses) based on person's age.

    Args:
        person: personClass instance

    Returns:
        str: Accessory type identifier
    )r%   r4   r4   r4   rn   )gš™™™™™é?çôýÔxé&±?rp   rp   é'   )g333333ã?ç /Ý$Á?rr   rr   )gš™™™™™Ù?çš™™™™™É?rs   rs   ri   )ÚweightsÚkr   )r   rX   Úchoices)r   r^   Zprobsr'   r   r   r    Úget_accessory6  s    



rw   c                  C   s¨   ddl } | j dd¡ ¡ dkr0g d¢}t |¡S ddlm} |ƒ }zJ| ¡ }| 	d¡ | 
¡ }|d d  ¡ W |rz| ¡  | ¡  S | ¡  n|rš| ¡  | ¡  0 dS )	zd
    Get a random last name from the database.

    Returns:
        str: Capitalized last name
    r   NÚBAOLIFE_TEST_MODEÚfalseÚtrue)
ZSmithZJohnsonZWilliamsZBrownZJonesZGarciaZMillerZDavisZ	RodriguezZMartinez©Úget_database_connectionzWSELECT name FROM lastnames_race WHERE lastnames_race.rank < 500 order by RAND() limit 1©ÚosÚenvironÚgetr   rX   rY   Údatabase.db_operationsr|   ÚcursorZexecuteZfetchallÚ
capitalizeÚclose)r~   Ztest_lastnamesr|   ÚmydbÚmycursorÚmyresultr   r   r    Úget_lastnameV  s*    

ü  
þrˆ   c           	      C   sÒ   ddl }|j dd¡ ¡ dkrB| dkr0g d¢}ng d¢}t |¡S dd	lm} |ƒ }zb| ¡ }d
}| dkrnd}d}| 	||f¡ | 
¡ }|d d  ¡ W |r¤| ¡  | ¡  S | ¡  n|rÄ| ¡  | ¡  0 dS )z¤
    Get a random first name from the database based on gender.

    Args:
        gender: "Male" or "Female"

    Returns:
        str: Capitalized first name
    r   Nrx   ry   rz   ÚFemale)
ZEmmaZOliviaZAvaZIsabellaZSophiaZMiaZ	CharlotteZAmeliaZHarperZEvelyn)
ZLiamZNoahZOliverZElijahZJamesZWilliamZBenjaminZLucasZHenryZ	Alexanderr{   ÚMÚFzWSELECT Name FROM firstnames WHERE Cnt > 1000000 AND Gender = %s ORDER BY RAND() LIMIT 1r}   )	Zgenderr~   Z
test_namesr|   r…   r†   ZgenderSelectorZsqlr‡   r   r   r    Úget_firstnamer  s6    


ü  
þrŒ   c                 C   sD   | j r@ddlm}m} | |jd¡}||| j d� }| d¡| _dS )z£
    Set a person's birthday based on their age in days and current date.

    Args:
        person: personClass instance
        player: playerClass instance
    r   )Údatetimer   z%m-%d)ÚdaysN)ÚageDaysr�   r   ÚstrptimeÚdateÚstrftimeÚbirthday)r   Úplayerr�   r   Zcurrent_dater“   r   r   r    ÚsetBirthdayœ  s
    r•   c                 C   s0  ddl m} | j d|ƒ ¡ | jjdkrPd| jd _| jd  ¡  d| jd _n&d| jd _| jd  ¡  d| jd _| jd j 	d¡ t
| jd jƒ| jd _tƒ | jd _| jjt dd	¡ d
 | jd _| jd jd t dd¡ | jd _| jd j| jd _t| | jd ƒ| jd< | jd j| j_| S )z´
    Create a partner (boyfriend/girlfriend) for the player character.

    Args:
        player: playerClass instance

    Returns:
        playerClass: Updated player object
    r   ©ÚpersonClassrj   r‰   Z
GirlfriendZ	BoyfriendÚpartnerri   é   é   ém  )Úcore.modelsr—   ÚrÚinsertÚcr   Ú
setPronounr   r   ÚappendrŒ   r   rˆ   r   r   rX   Úrandintr�   r“   Ú	setValuesÚidr˜   ©r”   r—   r   r   r    Úget_partner¯  s$    
 $r¦   c                 C   sÖ   ddl m} | j d|ƒ ¡ | jd j d¡ | jd j d¡ | jd jdkr^d| jd _nd| jd _d| jd _t	| jd jƒ| jd _
| jj| jd _d| jd _d| jd _t| | jd ƒ| jd< | jd S )	z�
    Create a child for the player character.

    Args:
        player: playerClass instance

    Returns:
        personClass: The newly created child
    r   r–   ÚchildÚfamilyrj   ZSonZDaughterri   )rœ   r—   r�   rž   r   r¡   r   r   ÚfamilyLevelrŒ   r   rŸ   r   r   r�   r£   r¥   r   r   r    Ú	add_childÏ  s    
rª   c                 C   s<   d}| j D ],}d|jv r
|s"|}q
|r
|j|jk r
|}q
|S )zÄ
    Get the youngest child from player's relationships.

    Args:
        player: playerClass instance

    Returns:
        personClass or False: The youngest child or False if no children
    Fr§   )r�   r   r�   )r”   Zyoungestr�   r   r   r    Úget_youngestChildê  s    


r«   c                 C   sº  ddl m}m} ddlm}m} |ƒ }d|_| ¡  |j 	d¡ |j 	d¡ d|_
d|_t|jƒ|_| jj|_| jjt d	d
¡ |_|jd t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ |ƒ }d|_| ¡  |j 	d¡ |j 	d¡ d|_
d|_t|jƒ|_| jj|_| jjt d	d
¡ |_|jd t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ ||j|j|ƒ ddƒ}|j|_|j|_|ddƒd |_|ddƒd |_| j 	|¡ | S )z¥
    Create mother and father for the player character.

    Args:
        player: playerClass instance

    Returns:
        playerClass: Updated player object
    r   ©r—   ÚrelationshipClass)Úgenerate_random_dateÚrandrj   Úfatherr¨   ÚFatherri   rn   é"   r›   r‰   ÚmotherÚMotherÚMarriedúHappily married for years.rd   )rœ   r—   r­   Úutils.helpersr®   r¯   r   r    r   r¡   r   r©   rŒ   r   rŸ   r   r   rX   r¢   r�   rV   rZ   r£   r�   rž   r¤   ÚrelationshipÚaffinityÚrelData)r”   r—   r­   r®   r¯   r°   r³   Zparents_relationshipr   r   r    Úadd_parentsþ  sJ    




r»   c                 C   s¶  ddl m} tdƒ t dd¡dk�r²tdƒ |ƒ }|j d¡ |j d¡ |jdkr^d	|_nd
|_d|_	t
|jƒ|_| ¡  | jj|_| jjt dd¡ |_|jd d t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ t dd¡dk�r²tdƒ |ƒ }|j d¡ |j d¡ |jdk�r,d	|_nd
|_d|_	| ¡  t
|jƒ|_| jj|_| jd jt dd¡ |_|jd d t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ | S )z¹
    Create older siblings for the player character (with some randomness).

    Args:
        player: playerClass instance

    Returns:
        playerClass: Updated player object
    r   r–   zadding older siblingsri   zadding older siblingÚsiblingr¨   rj   ZBrotherZSisterrš   r›   é  é	   zadding another older sibling)rœ   r—   rf   rX   r¢   r   r¡   r   r   r©   rŒ   r   r    rŸ   r   r   r�   rV   rZ   r£   r�   rž   )r”   r—   r¼   r   r   r    Úadd_older_siblings4  sJ    





r¿   c           	      C   s  ddl m}m} ddlm} |ƒ }d|_| ¡  |j d¡ |j d¡ d|_	d|_
t|jƒ|_| jj|_t| d	ƒjt d
d¡ |_|jd t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ |ƒ }d|_| ¡  |j d¡ |j d¡ d|_	d|_
t|jƒ|_| jj|_t| d	ƒjt d
d¡ |_|jd t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ ||j|j|ƒ ddƒ}|j|_|j|_| j |¡ |ƒ }d|_| ¡  |j d¡ |j d¡ d|_	d|_
t|jƒ|_tƒ |_t| dƒjt d
d¡ |_|jd t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ |ƒ }d|_| ¡  |j d¡ |j d¡ d|_	d|_
t|jƒ|_| jd j|_t| dƒjt d
d¡ |_|jd t dd¡ |_| jjj|j_t| |ƒ}| j d|¡ ||j|j|ƒ ddƒ}|j|_|j|_| j |¡ | S )z©
    Create all four grandparents for the player character.

    Args:
        player: playerClass instance

    Returns:
        playerClass: Updated player object
    r   r¬   )r®   r‰   Zpaternal_grandmotherr¨   ZGrandmotherre   r°   rn   r²   r›   ri   rj   Zpaternal_grandfatherZGrandfatherrµ   r¶   Zmaternal_grandfatherr³   Zmaternal_grandmother)rœ   r—   r­   r·   r®   r   r    r   r¡   r   r©   rŒ   r   rŸ   r   Úget_relationshipr   rX   r¢   r�   rV   rZ   r£   r�   rž   r¤   r¸   rº   rˆ   )	r”   r—   r­   r®   Zgrandmother1Zgrandfather1Zg_relZgrandfather2Zgrandmother2r   r   r    Úadd_grandparentsl  s†    






rÁ   c                 C   sî   ddl m} |ƒ }||_| ¡  |j d¡ d|_t dd¡|_	t
|jƒ|_tƒ |_|dkrt| jjt dd	¡ |_n^|d
kr˜| jjt dd¡ d	 |_n:|dkr¼| jjt dd¡ d	 |_n| jjt dd¡ |_t| |ƒ}| j d|¡ | S )zñ
    Create a friend for the player character.

    Args:
        player: playerClass instance
        sex: "Male" or "Female"
        age: "similar", "younger", "older", or other

    Returns:
        playerClass: Updated player object
    r   r–   ÚfriendÚFriendéF   r+   Úsimilarri   rš   Zyoungerr™   Zolder)rœ   r—   r   r    r   r¡   r   rX   r¢   r¹   rŒ   r   rˆ   r   rŸ   r   r£   r�   rž   )r”   r   Úager—   rÂ   r   r   r    Ú
add_friendÇ  s&    
rÇ   c                 C   sœ   g }t dt| jƒƒD ]$}d| j| jv r| | j| ¡ qt|ƒdkr„t| ƒ t dt| jƒƒD ]$}d| j| jv r^| | j| ¡ q^|t dt|ƒd ¡ S )zÉ
    Get a random classmate from player's relationships.
    Creates classmates if none exist.

    Args:
        player: playerClass instance

    Returns:
        personClass: A random classmate
    r   Ú	classmateri   )ÚrangeÚlenr�   r   r¡   Úcreate_classmatesrX   r¢   )r”   Z
classmatesr   r   r   r    Úget_random_classmateî  s    rÌ   c                 C   sb   g }t dt| jƒƒD ]$}d| j| jv r| | j| ¡ qt|ƒdkrJdS |t dt|ƒd ¡ S )z½
    Get a random friend from player's relationships.

    Args:
        player: playerClass instance

    Returns:
        personClass or False: A random friend or False if no friends
    r   rÂ   Fri   )rÉ   rÊ   r�   r   r¡   rX   r¢   )r”   Úfriendsr   r   r   r    Úget_random_friend  s    
rÎ   c                 C   s   | j t dt| j ƒd ¡ S )z£
    Get a random character from player's relationships.

    Args:
        player: playerClass instance

    Returns:
        personClass: A random character
    r   ri   )r�   rX   r¢   rÊ   )r”   r   r   r    Úget_random_character  s    
rÏ   c                 C   sb   g }t dt| jƒƒD ]$}| j| jdkr| | j| ¡ qt|ƒdkrJdS |t dt|ƒd ¡ S )zÁ
    Get a random immediate family member (familyLevel == 1).

    Args:
        player: playerClass instance

    Returns:
        personClass: A random family member or None if no family
    r   ri   N)rÉ   rÊ   r�   r©   r¡   rX   r¢   ©r”   r¨   r   r   r   r    Úget_random_family%  s    
rÑ   c                 C   s>   g }t dt| jƒƒD ]$}| j| jdkr| | j| ¡ q|S )z¯
    Get all immediate family members (familyLevel == 1).

    Args:
        player: playerClass instance

    Returns:
        list: List of all immediate family members
    r   ri   )rÉ   rÊ   r�   r©   r¡   rÐ   r   r   r    Úget_allFamily8  s
    
rÒ   rX   rÅ   rÂ   c                 C   sú   ddl m} |ƒ }|dkr0|j |¡ | ¡ |_|dkr>||_| ¡  t|jƒ|_	t
ƒ |_|dkrz| jjt dd¡ |_n6|dkr–dt dd	¡ |_n|d
kr°dt dd¡ |_|jd t dd¡ |_t| |ƒ}|dkrÞ|S | j d|¡ | jd S dS )aW  
    Create a generic character with customizable attributes.

    Args:
        player: playerClass instance
        sex: "Male", "Female", or "random"
        age: "similar", "random_adults", "random_teens_adults", or other
        relationship: Relationship type or "none"

    Returns:
        personClass: The newly created character
    r   r–   ÚnonerX   rÅ   ri   Úrandom_adultsrn   r   Úrandom_teens_adultsé   é-   r›   r½   N)rœ   r—   r   r¡   rƒ   r   r   r    rŒ   r   rˆ   r   rŸ   r   rX   r¢   r�   r£   r�   rž   )r”   r   rÆ   r¸   r—   Znew_characterr   r   r    Úcreate_characterM  s,    

rØ   c                 C   s\   ddl m} |dkrXtddƒD ]}t| dd� qt| ddd	�}t|| jd
diƒƒd |_dS )z­
    Create 10 classmates and 1 teacher for the player.

    Args:
        player: playerClass instance
        activity: Optional activity parameter (unused currently)
    r   )Úfind_where_testNr5   rÈ   )r¸   ZteacherrÔ   ©r¸   rÆ   r   zElementary School Teacher)r·   rÙ   rÉ   rØ   ÚlistÚoccupationsr   )r”   ÚactivityrÙ   r   rŸ   r   r   r    rË   ~  s    rË   c                 C   sN   ddl m} td|ddƒƒD ]}t| ddd�}||_qt| dd	d�}||_d
S )z�
    Create coworkers and a boss for the player.

    Args:
        player: playerClass instance
        occupation: Job occupation object
    r   ©r¯   é   é   ZcoworkerrÕ   rÚ   ZbossrÔ   N)r·   r¯   rÉ   rØ   r   )r”   Ú
occupationr¯   r   rŸ   r   r   r    Úcreate_coworkers‘  s    râ   c                    s   t ‡ fdd„| jD ƒdƒS )zÖ
    Get a person by their ID from player's relationships.

    Args:
        player: playerClass instance
        id: Person's ID

    Returns:
        personClass or None: The person if found, None otherwise
    c                 3   s   | ]}|j ˆ kr|V  qd S ©N©r¤   ©Ú.0Úitemrä   r   r    Ú	<genexpr>³  ó    zget_person.<locals>.<genexpr>N©Únextr�   )r”   r¤   r   rä   r    Ú
get_person¨  s    rì   c                    s   t ‡ fdd„| jD ƒdƒS )zö
    Get a person by their relationship type.

    Args:
        player: playerClass instance
        type: Relationship type (e.g., "father", "mother", "friend")

    Returns:
        personClass or None: The person if found, None otherwise
    c                 3   s   | ]}ˆ |j v r|V  qd S rã   )r   rå   ©Útyper   r    rè   Á  ré   z#get_relationship.<locals>.<genexpr>Nrê   )r”   rî   r   rí   r    rÀ   ¶  s    rÀ   Fc                 C   sV   t | jƒD ]F\}}t|jv r
| j| j |¡ | j| j |¡ |r
|| j| _q
| S )aC  
    Update a relationship type for all matching characters.

    Args:
        player: playerClass instance
        oldRelationship: Current relationship type
        newRelationship: New relationship type
        title: Optional new title for the relationship

    Returns:
        playerClass: Updated player object
    )Ú	enumerater�   rî   r   Úremover¡   r   )r”   ZoldRelationshipZnewRelationshipr   Úindexrç   r   r   r    Úupdate_relationshipÈ  s    
rò   c                 C   s  ddl m}m}m}m} ddlm} d}d}| jjdkr<d}| jjdkrLd	}| jj	|||ƒ | j_	| jj
|||ƒ | j_
|| jƒ| _|| jjƒ| j_| jj	d
kr¨d
| j_	| jj
d
kr¼d
| j_
| jj	dk rØ| jjd | j_| jj	dkrô| jjd | j_|| | jƒ || jƒ | S )z·
    Update player character's biological stats (hunger, thirst, weight).

    Args:
        player: playerClass instance

    Returns:
        playerClass: Updated player object
    r   )ÚhandleHungerÚgetWeightTypeÚhandleHealthÚhandleWeightrÞ   re   éþÿÿÿZUnderweightéüÿÿÿZObeseé   r+   g      à?éb   )Úhealth.health_managerró   rô   rõ   rö   r·   r¯   rŸ   Z
weightTypeZhungerZthirstÚweight)r”   ró   rô   rõ   rö   r¯   r]   Zbottomr   r   r    Ú	updateBioâ  s.    

rý   c                 C   s´   ddl m} ddlm} ddlm} ddlm} || |ƒ ||ƒ ||ƒ || |ƒ t|| ƒ t	|ƒ|j
_t|ƒ|j
_t|ƒ|j
_t|ƒ|j
_t|ƒ|_|jdkr°t dd¡|_|S )	zÞ
    Set all default values for a character (education, job, avatar, etc.).

    Args:
        player: playerClass instance
        person: personClass instance

    Returns:
        personClass: Updated person object
    r   )ÚsetEducation)ÚsetLikesDislikes)Ú	setHabits)Ú	randomJobrn   r5   é$   )Zeducation.education_managerrþ   Zstats.stats_managerrÿ   rû   r   Zjobs.job_managerr  r•   rm   rV   r$   rh   rW   ro   r&   rw   r'   ra   Úimager   rX   r¢   ÚactScore)r”   r   rþ   rÿ   r   r  r   r   r    r£     s"    




r£   c                 C   s°  ddl m}m} ddlm} |d rZ|d  d¡}|d | j_t|ƒdkrR|d nd| j_	|d rtt
|d ƒ| j_nd	| j_| jjd
 | j_|d | j_d| j_| jjdkr¶d| j_nd| j_t| jƒ| j_| jjsät| jjƒ| j_| jj	sötƒ | j_	| j |d| jj ddƒ¡ t| ƒ} t| ƒ} t| ƒ} t| | jƒ| _d| _t| || jjƒdƒ | jd j d¡ || jj| jd j| jddƒ}|j| j_ |j| jd _ | j! |¡ d| _"| S )zõ
    Set up the main player character with initial family and relationships.

    Args:
        player: playerClass instance
        data: Dictionary with 'name', 'age', 'sex' keys

    Returns:
        playerClass: Configured player object
    r   )ÚlocationClassr­   )ÚgetOppositeSexr>   r   ri   Ú rÆ   é   r›   r   r+   rj   ZHeZSheÚhomezGhttps://cdn.midjourney.com/fe048fc6-f534-4ffe-9fb2-02297a3e1d2d/0_2.pngÚactiverÅ   r˜   ZDatingzYou are dating!ZsetupComplete)#rœ   r  r­   r·   r  ÚsplitrŸ   r   rÊ   r   Úintr   r�   r   r¹   Zpronounra   r  rŒ   rˆ   Úlr¡   r¤   r»   r¿   rÁ   r£   Ú
controllerrÇ   r�   r   r‘   r¸   rº   Ústatus)r”   Údatar  r­   r  Z
name_partsÚrelr   r   r    ÚcharacterSetup%  sD    


r  )rX   rÅ   rÂ   )N)F)$Ú__doc__r�   rX   Úuuidr   r!   r#   ra   rh   rm   ro   rw   rˆ   rŒ   r•   r¦   rª   r«   r»   r¿   rÁ   rÇ   rÌ   rÎ   rÏ   rÑ   rÒ   rØ   rË   râ   rì   rÀ   rò   rý   r£   r  r   r   r   r    Ú<module>   sF   )0d4 * 68['
1

$