Ë
    IB™jI2  ã                   ó4  — d dl Zd dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ  edd	g¬
«      Zh d£Z G d„ de«      Zdededefd„Zdefd„Zdedededee   dee   dee   dedee   dee   fd„Zdefd„Zdefd„Zej?                  d«       e	e«      fd „«       Z ejC                  d«       e	e«      fdefd!„«       Z"ejG                  d"«       e	e«      fd#edefd$„«       Z$ejK                  d"«       e	e«      fd#efd%„«       Z&y)&é    N)ÚOptional)Ú	APIRouterÚHTTPExceptionÚDepends)Ú	BaseModelÚField)Úget_db_connection)Úget_current_user)Úcalculate_planetsz/user/personaszUser Personas)ÚprefixÚtags>   ÚChildÚOtherÚFriendÚParentÚPartnerÚCoworkerc                   ó  — e Zd ZU  edd¬«      Zeed<    edd¬«      Zee   ed<   eed<   e	ed<   e	ed	<   e	ed
<   dZ
ee	   ed<   dZee	   ed<   dZee   ed<   dZeed<    edd¬«      Zeed<   dZee   ed<   dZee   ed<   y)ÚPersonaRequest.é–   )Ú
max_lengthÚnameNÚnicknameÚrelationshipÚ
birth_yearÚbirth_monthÚ	birth_dayÚ
birth_hourÚbirth_minuteÚ
birth_ampmTÚexact_birth_timeéÿ   Úbirth_locationÚ	birth_latÚ	birth_lon)Ú__name__Ú
__module__Ú__qualname__r   r   ÚstrÚ__annotations__r   r   Úintr   r   r    r!   Úboolr#   r$   Úfloatr%   © ó    ú7/var/www/html/Astrologybackend/backend/user_personas.pyr   r      s    … Ù�c cÔ*€Dˆ#Ó*Ù# D°SÔ9€Hˆh�s‰mÓ9ØÓàƒOØÓØƒNà $€J�˜‘Ó$Ø"&€L�(˜3‘-Ó&Ø $€J�˜‘Ó$Ø!Ð�dÓ!á °Ô4€N�CÓ4Ø!%€Iˆx˜‰Ó%Ø!%€Iˆx˜‰Ô%r/   r   ÚhourÚminuteÚampmc                 ó¸   — t        | «      }t        |«      }|r|j                  «       j                  «       nd}|dk(  r|dk(  rd}||fS |dk(  r
|dk7  r|dz  }||fS )z‡
    Converts 12-hour AM/PM time to 24-hour time.

    Examples:
    12:00 AM -> 00:00
    12:00 PM -> 12:00
    02:30 PM -> 14:30
    Ú ÚAMé   r   ÚPM)r+   ÚupperÚstrip)r1   r2   r3   ÚhÚmÚ
ampm_uppers         r0   Úconvert_to_24_hourr>   &   sp   € ô 	ˆD‹	€AÜˆF‹€AÙ)-�—‘“×#Ñ#Ô%°2€Jà�TÒØ�Š7ØˆAð
 ˆaˆ4€Kð	 
�tÒ	Ø�Š7Ø�‰GˆAàˆaˆ4€Kr/   Úlocation_namec                 ó´  — | r| j                  «       sy	 dt        j                  j                  | «      › d�}t        j                  j                  |ddi¬«      }t        j                  j                  |d¬«      5 }t        j                  |j                  «       j                  «       «      }|j                  d	g «      }|r\|d
   j                  di «      j                  dg «      }t        |«      dk\  r)t        |d
   «      }t        |d   «      }||fcddd«       S ddd«       y# 1 sw Y   yxY w# t        $ r}	t        d| › d|	› �«       Y d}	~	yd}	~	ww xY w)zY
    Geocodes a location string using Photon API.
    Returns: (latitude, longitude)
    )NNz https://photon.komoot.io/api/?q=z&limit=1z
User-AgentzMozilla/5.0)Úheadersé   )ÚtimeoutÚfeaturesr   ÚgeometryÚcoordinatesé   é   NzError geocoding location 'z': )r:   ÚurllibÚparseÚquoteÚrequestÚRequestÚurlopenÚjsonÚloadsÚreadÚdecodeÚgetÚlenr-   Ú	ExceptionÚprint)
r?   ÚurlÚreqÚresponseÚdatarD   ÚcoordsÚlonÚlatÚes
             r0   Úgeocode_locationr_   =   sN  € ñ
  × 3Ñ 3Ô 5ØðBØ0´·±×1CÑ1CÀMÓ1RÐ0SÐS[Ð\ˆä�n‰n×$Ñ$ØØ! =Ð1ð %ó 
ˆô
 �^‰^×#Ñ# C°Ð#Ó3ð 	$°xÜ—:‘:˜hŸm™m›o×4Ñ4Ó6Ó7ˆDØ—x‘x 
¨BÓ/ˆHáØ! !™Ÿ™¨°RÓ8×<Ñ<¸]ÈBÓO�ô �v“; !Ò#Ü  q¡	Ó*�CÜ  q¡	Ó*�CØ ˜8÷	$÷ 	$ñ 	$ð  ÷!	$ð  ûô ò BÜÐ*¨=¨/¸¸Q¸CÐ@×AÐAàûðBús=   •A'D3 Á<BD'Ä	D3 ÄD3 Ä'D0Ä,D3 Ä0D3 Ä3	EÄ<EÅEÚyearÚmonthÚdayr!   r]   r\   c	                 ó(  — |�|€t        d«       yd}	d}
|�|�|rt        |||«      \  }	}
	 t        | |||	|
dt        |«      t        |«      d¬«	      }|j	                  di «      }|j	                  d	i «      }|j	                  d
i «      j	                  d«      }|j	                  di «      j	                  d«      }|j	                  d«      }t        d| › d|› d|› �|	› d|
› �||||||dœ«       |||fS # t
        $ r}t        d|› �«       Y d}~yd}~ww xY w)zî
    Calculates Sun, Moon, and Rising signs.

    Important:
    - If exact birth time is unknown, we still calculate using default 12:00 PM.
    - Rising sign needs time + location, so default noon is used instead of returning None.
    Nz5Cannot calculate signs: latitude or longitude missing)NNNr7   r   g        )	r`   ra   rb   r1   r2   ÚsecondÚlatitudeÚ	longitudeÚtzÚplanetsÚ	ascendantÚsunÚsignÚmoonzCalculated persona signs:ú-ú:)ÚdateÚtimer]   r\   rj   rl   Úrisingr!   zError calculating signs: )rV   r>   r   r-   rS   rU   )r`   ra   rb   r1   r2   r3   r!   r]   r\   Ú	calc_hourÚcalc_minuteÚresultrh   ri   Úsun_signÚ	moon_signÚrising_signr^   s                     r0   Úcalculate_astrological_signsrx   `   sU  € ð$ €{�c�kÜÐEÔFØð €IØ€Kð Ð˜FÐ.±4Ü!3°D¸&À$Ó!GÑˆ	�;ð# Ü"ØØØØØØÜ˜3“ZÜ˜C“jØô

ˆð —*‘*˜Y¨Ó+ˆØ—J‘J˜{¨BÓ/ˆ	à—;‘;˜u bÓ)×-Ñ-¨fÓ5ˆØ—K‘K ¨Ó+×/Ñ/°Ó7ˆ	Ø—m‘m FÓ+ˆäÐ)Ø�f˜A˜e˜W A c UÐ+Ø �k  ; -Ð0ØØØØØ!Ø 0ñ	,
ô 		ð ˜ KÐ/Ð/øäò  ÜÐ)¨!¨Ð-Ô.Üûð ús   ¬CC0 Ã0	DÃ9DÄDrX   c                 ó¨  — | j                   sd| _        d| _        d| _        y| j                  �| j                  �| j                  st	        dd¬«      ‚| j                  dk  s| j                  dkD  rt	        dd	¬«      ‚| j                  dk  s| j                  d
kD  rt	        dd¬«      ‚| j                  j                  «       dvrt	        dd¬«      ‚y)z|
    If exact birth time is unknown, save 12:00 PM.
    This keeps frontend display and backend calculation consistent.
    r7   r   r8   Né�  zIBirth hour, minute, and AM/PM are required when exact_birth_time is true.©Ústatus_codeÚdetailrH   z$Birth hour must be between 1 and 12.é;   z&Birth minute must be between 0 and 59.>   r6   r8   z!Birth AM/PM must be 'AM' or 'PM'.)r!   r   r   r    r   r9   )rX   s    r0   Únormalize_birth_timer   ¤   sÌ   € ð
 ×ÒØˆŒØˆÔØˆŒØà
‡~�~Ð ×!1Ñ!1Ð!9ÀÇÂÜØØ^ô
ð 	
ð
 ‡~�~˜Ò˜SŸ^™^¨bÒ0Ü¨Ð4ZÔ[Ð[à
×Ñ˜!Ò˜s×/Ñ/°"Ò4Ü¨Ð4\Ô]Ð]à
‡~�~×ÑÓ \Ñ1Ü¨Ð4WÔXÐXð 2r/   r   c                 óZ   — | t         vr#t        dddj                  t         «      › �¬«      ‚y )Nrz   z*Invalid relationship option. Choose from: z, r{   )ÚRELATIONSHIP_OPTIONSr   Újoin)r   s    r0   Úvalidate_relationshiprƒ   ¿   s5   € ØÔ/Ñ/ÜØØ?ÀÇ	Á	ÔJ^Ó@_Ð?`Ðaô
ð 	
ð 0r/   r5   c                 ó  — t        «       }|j                  d¬«      }	 |j                  d| d   f«       |j                  «       }||j	                  «        |j	                  «        S # |j	                  «        |j	                  «        w xY w)NT©Ú
dictionaryz…
            SELECT *
            FROM user_personas
            WHERE user_id = %s
            ORDER BY created_at DESC
            Úid)r	   ÚcursorÚexecuteÚfetchallÚclose)Úcurrent_userÚconnrˆ   Úpersonass       r0   Úget_personasr�   Ç   sx   € äÓ€DØ�[‰[ Dˆ[Ó)€FðØ�‰ðð ˜$ÑÐ!ô	
ð —?‘?Ó$ˆØð 	�‰ŒØ�
‰
�øð 	�‰ŒØ�
‰
�ús   ž'A& Á&"Bc                 ó�  — t        | j                  «       t        | «       | j                  �| j                  €"t        | j                  «      \  | _        | _        t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  ¬«	      \  }}}t        «       }|j!                  d¬«      }	 d}|j#                  ||d   | j$                  j'                  «       | j(                  r| j(                  j'                  «       nd | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  |||f«       |j+                  «        |j,                  }|j#                  d||d   f«       |j/                  «       }	|	|j1                  «        |j1                  «        S # |j1                  «        |j1                  «        w xY w)N©	r`   ra   rb   r1   r2   r3   r!   r]   r\   Tr…   aß  
            INSERT INTO user_personas (
                user_id,
                name,
                nickname,
                relationship,
                birth_year,
                birth_month,
                birth_day,
                birth_hour,
                birth_minute,
                birth_ampm,
                exact_birth_time,
                birth_location,
                birth_lat,
                birth_lon,
                sun_sign,
                moon_sign,
                rising_sign
            )
            VALUES (
                %s, %s, %s, %s,
                %s, %s, %s,
                %s, %s, %s,
                %s, %s,
                %s, %s,
                %s, %s, %s
            )
        r‡   z:SELECT * FROM user_personas WHERE id = %s AND user_id = %s)rƒ   r   r   r$   r%   r_   r#   rx   r   r   r   r   r   r    r!   r	   rˆ   r‰   r   r:   r   ÚcommitÚ	lastrowidÚfetchoner‹   )
rX   rŒ   ru   rv   rw   r�   rˆ   ÚqueryÚ
persona_idÚcreated_personas
             r0   Úadd_personar˜   ß   sÒ  € ä˜#×*Ñ*Ô+ô ˜Ôð ‡}�}Ð §¡Ð 5Ü'7¸×8JÑ8JÓ'KÑ$ˆŒ�s”}ä'CØ�^‰^Ø�o‰oØ�M‰MØ�^‰^Ø×ÑØ�^‰^Ø×-Ñ-Ø�M‰MØ�M‰Mô
(Ñ$€Hˆi˜ô Ó€DØ�[‰[ Dˆ[Ó)€FðCðˆð< 	�‰Øà˜TÑ"Ø—‘—‘Ó Ø(+¯ª�—‘×"Ñ"Ô$¸$Ø× Ñ Ø—‘Ø—‘Ø—‘Ø—‘Ø× Ñ Ø—‘Ø×$Ñ$Ø×"Ñ"Ø—‘Ø—‘ØØØð#ô	
ð. 	�‰ŒØ×%Ñ%ˆ
à�‰ØHØ˜ dÑ+Ð,ô	
ð
 !Ÿ/™/Ó+ˆØð 	�‰ŒØ�
‰
�øð 	�‰ŒØ�
‰
�ús   Ã*DH# È#"Iz/{persona_id}r–   c                 óæ  — t        |j                  «       t        «       }|j                  d¬«      }	 |j	                  d| |d   f«       |j                  «       }|st        dd¬«      ‚t        |«       |j                  �|j                  €"t        |j                  «      \  |_        |_	        t        |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j                  |j                  ¬«	      \  }}}d	}	|j	                  |	|j(                  j+                  «       |j,                  r|j,                  j+                  «       nd |j                  |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j                  |j                  |j                  |||| |d   f«       |j/                  «        |j	                  d
| |d   f«       |j                  «       }
|
|j1                  «        |j1                  «        S # |j1                  «        |j1                  «        w xY w)NTr…   úm
            SELECT id
            FROM user_personas
            WHERE id = %s AND user_id = %s
            r‡   é”  z;Persona not found or you do not have permission to edit it.r{   r‘   av  
            UPDATE user_personas
            SET
                name = %s,
                nickname = %s,
                relationship = %s,
                birth_year = %s,
                birth_month = %s,
                birth_day = %s,
                birth_hour = %s,
                birth_minute = %s,
                birth_ampm = %s,
                exact_birth_time = %s,
                birth_location = %s,
                birth_lat = %s,
                birth_lon = %s,
                sun_sign = %s,
                moon_sign = %s,
                rising_sign = %s
            WHERE id = %s AND user_id = %s
        zl
            SELECT *
            FROM user_personas
            WHERE id = %s AND user_id = %s
            )rƒ   r   r	   rˆ   r‰   r”   r   r   r$   r%   r_   r#   rx   r   r   r   r   r   r    r!   r   r:   r   r’   r‹   )r–   rX   rŒ   r�   rˆ   Úpersonaru   rv   rw   Úupdate_queryÚupdated_personas              r0   Úupdate_personarŸ   ?  s  € ä˜#×*Ñ*Ô+äÓ€DØ�[‰[ Dˆ[Ó)€FðcØ�‰ðð
 ˜ dÑ+Ð,ô	
ð —/‘/Ó#ˆáÜØØTôð ô 	˜SÔ!ð �=‰=Ð  C§M¡MÐ$9Ü+;¸C×<NÑ<NÓ+OÑ(ˆCŒM˜3œ=ä+GØ—‘Ø—/‘/Ø—‘Ø—‘Ø×#Ñ#Ø—‘Ø ×1Ñ1Ø—‘Ø—‘ô
,
Ñ(ˆ�)˜[ðˆð, 	�‰Øà—‘—‘Ó Ø(+¯ª�—‘×"Ñ"Ô$¸$Ø× Ñ Ø—‘Ø—‘Ø—‘Ø—‘Ø× Ñ Ø—‘Ø×$Ñ$Ø×"Ñ"Ø—‘Ø—‘ØØØØØ˜TÑ"ð%ô	
ð0 	�‰Œà�‰ðð
 ˜ dÑ+Ð,ô	
ð !Ÿ/™/Ó+ˆØð 	�‰ŒØ�
‰
�øð 	�‰ŒØ�
‰
�ús   ³G:I É"I0c                 óŠ  — t        «       }|j                  d¬«      }	 |j                  d| |d   f«       |j                  «       }|st	        dd¬«      ‚|j                  d| |d   f«       |j                  «        dd	d
œ|j                  «        |j                  «        S # |j                  «        |j                  «        w xY w)NTr…   rš   r‡   r›   z=Persona not found or you do not have permission to delete it.r{   z^
            DELETE FROM user_personas
            WHERE id = %s AND user_id = %s
            zPersona deleted successfully.)ÚsuccessÚmessage)r	   rˆ   r‰   r”   r   r’   r‹   )r–   rŒ   r�   rˆ   rœ   s        r0   Údelete_personar£   ¬  sÇ   € äÓ€DØ�[‰[ Dˆ[Ó)€Fð#Ø�‰ðð
 ˜ dÑ+Ð,ô	
ð —/‘/Ó#ˆáÜØØVôð ð
 	�‰ðð ˜ dÑ+Ð,ô	
ð 	�‰Œð Ø6ñ
ð 	�‰ŒØ�
‰
�øð 	�‰ŒØ�
‰
�ús   žA!B  Â "C)'Úurllib.requestrI   Úurllib.parserO   Útypingr   Úfastapir   r   r   Úpydanticr   r   Údbr	   Úauth_routesr
   Ú	astrologyr   Úrouterr�   r   r+   r)   r>   r_   r,   r-   rx   r   rƒ   rS   r�   Úpostr˜   ÚputrŸ   Údeleter£   r.   r/   r0   ú<module>r°      s½  ðÛ Û Û Ý ç 5Ñ 5ß %å  Ý (Ý 'ñ 
Ð*°/Ð1BÔ	C€âTÐ ô&�Yô &ð&˜Sð ¨#ð °Só ð.  Có  ðFA Ø
ðA àðA ð 
ðA ð �3‰-ð	A ð
 �S‰MðA ð �3‰-ðA ð ðA ð 
�%‰ðA ð 
�%‰óA ðHY˜nó Yð6
¨ó 
ð ‡�ˆBƒÙ%Ð&6Ó7ò ó ðð. ‡�ˆRƒÙ29Ð:JÓ2Kñ \�^ò \ó ð\ð~ ‡�ˆOÓÙFMÐN^ÓF_ñ i˜sð i¨ò ió ðiðX ‡�ˆÓÙ18Ð9IÓ1Jñ '˜sò 'ó  ñ'r/   