Ë
    IB™j  ã            	       óú   — d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ  G d„ de	«      Z G d	„ d
e	«      Zdedefd„Zdedefd„Zddedededefd„Zdededefd„Zdededefd„Zy)é    N)ÚPath)Údatetime)Ú	BaseModel)ÚAstrologicalSubjectÚKerykeionChartSVG)Úextract_synastry_wheelc                   óT   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   y)	ÚSynastryPersonInputÚnameÚyearÚmonthÚdayÚhourÚminuteÚplaceN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úint© ó    ú8/var/www/html/Astrologybackend/backend/synastry-chart.pyr
   r
      s%   … Ø
ƒIØ
ƒIØƒJØ	ƒHØ
ƒIØƒKØ„Jr   r
   c                   ó"   — e Zd ZU eed<   eed<   y)ÚSynastryChartInputÚperson1Úperson2N)r   r   r   r
   r   r   r   r   r   r      s   … Ø Ó Ø Ô r   r   r   Úreturnc                 óÄ   — | j                  «       j                  «       } t        j                  dd| «      } t        j                  dd| «      j                  d«      } | xs dS )Nz
[^a-z0-9]+ú-z-+Úuser)ÚstripÚlowerÚreÚsub)r   s    r   Úsafe_file_namer'      sO   € Ø�:‰:‹<×ÑÓ€DÜ�6‰6�-  dÓ+€DÜ�6‰6�%˜˜dÓ#×)Ñ)¨#Ó.€DØŠ>�6Ðr   r   c           	      óú  — dddœ}	 d}| ddœ}t        j                  |||d¬«      }|j                  «        |j                  «       }|j                  d	g «      }|r¸|d
   }|j                  di «      j                  dg «      }t	        |«      dk\  rƒt        |d
   «      }	t        |d   «      }
|j                  di «      }|j                  d«      xs( |j                  d«      xs |j                  d«      xs | }|j                  dd«      }|
|	||ddœS t        j                  d«       	 d}| dddddœ}t        j                  |||d¬«      }|j                  «        |j                  «       }|st        d| › �«      ‚|d
   }t        |d   «      }
t        |d   «      }	|j                  d i «      }|j                  d«      xsN |j                  d!«      xs; |j                  d"«      xs( |j                  d«      xs |j                  d#«      xs | }|j                  dd«      }|
|	||ddœS # t        $ r}t        d| › d|› �«       Y d}~�Œ7d}~ww xY w# t        $ r}t        d$| › d%t        |«      › �«      ‚d}~ww xY w)&z”
    Place name to latitude/longitude.

    First try Photon.
    If Photon fails, fallback to Nominatim.

    Timezone fixed:
    Asia/Kolkata
    z-AstrologyApp/1.0 (contact: harsh@example.com)zapplication/json)z
User-AgentÚAcceptzhttps://photon.komoot.io/api/é   )ÚqÚlimité   )ÚparamsÚheadersÚtimeoutÚfeaturesr   ÚgeometryÚcoordinatesé   Ú
propertiesÚcityr   ÚcountyÚcountryÚIndiazAsia/Kolkata)ÚlatitudeÚ	longituder6   r8   Útimezone_strzPhoton geocoder failed for 'z': Nz*https://nominatim.openstreetmap.org/searchÚjsonÚin)r+   Úformatr,   ÚaddressdetailsÚcountrycodeszPlace not found: ÚlatÚlonÚaddressÚtownÚvillageÚstate_districtzLocation error for 'z,'. Photon and Nominatim both failed. Error: )ÚrequestsÚgetÚraise_for_statusr=   ÚlenÚfloatÚ	ExceptionÚprintÚtimeÚsleepÚ
ValueErrorr   )r   r/   Ú
photon_urlÚphoton_paramsÚresponseÚdatar1   Úfeaturer3   r;   r:   Úpropsr6   r8   Úphoton_errorÚnominatim_urlÚnominatim_paramsÚitemrD   Únominatim_errors                       r   Úget_place_detailsr]   %   sç  € ð FØ$ñ€Gð/GØ4ˆ
àØñ
ˆô
 —<‘<ØØ ØØô	
ˆð 	×!Ñ!Ô#à�}‰}‹ˆØ—8‘8˜J¨Ó+ˆáØ˜q‘kˆGØ!Ÿ+™+ j°"Ó5×9Ñ9¸-ÈÓLˆKä�;Ó 1Ò$Ü! +¨a¡.Ó1�	Ü  ¨Q¡Ó0�àŸ™ L°"Ó5�ð —I‘I˜fÓ%ò Ø—y‘y Ó(òà—y‘y Ó*òð ð	 ð  Ÿ)™) I¨wÓ7�ð !)Ø!*Ø Ø&Ø$2ñð ô 	‡J�Jˆq„Mð7
ØDˆàØØØØ ñ
Ðô —<‘<ØØ#ØØô	
ˆð 	×!Ñ!Ô#à�}‰}‹ˆáÜÐ0°°Ð8Ó9Ð9à�A‰wˆä˜˜e™Ó%ˆÜ˜$˜u™+Ó&ˆ	à—(‘(˜9 bÓ)ˆð �K‰K˜Óò Ø�{‰{˜6Ó"òà�{‰{˜9Ó%òð �{‰{˜8Ó$òð �{‰{Ð+Ó,ò	ð
 ð 	ð —+‘+˜i¨Ó1ˆð !Ø"ØØØ*ñ
ð 	
øôa ò GÜÐ,¨U¨G°3°|°nÐE×FÒFûðGûôp ò 
ÜØ" 5 'ð *ä˜/Ó*Ð+ð-ó
ð 	
ûð
ús1   ‡DH* Ä)D I È*	IÈ3I
É
IÉ	I:ÉI5É5I:Úfolder_pathÚmax_retriesÚdelayc                 óF  — t        | «      }t        |«      D ]i  }t        |j                  d«      «      }|r-t	        |d„ ¬«      }	 |j                  «       j                   |c S ||dz
  k  sŒUt        j                  |«       Œk t        d«      ‚# t        t        f$ r Y Œ<w xY w)z@Find latest SVG with retry logic to wait for file to be written.z*.svgc                 ó6   — | j                  «       j                  S )N)ÚstatÚst_mtime)Úfiles    r   ú<lambda>z!find_latest_svg.<locals>.<lambda>¬   s   € °T·Y±Y³[×5IÑ5I€ r   )Úkeyr*   z&Kerykeion SVG chart was not generated.)r   ÚrangeÚlistÚrglobÚmaxrc   Úst_sizeÚOSErrorÚFileNotFoundErrorrO   rP   )r^   r_   r`   ÚfolderÚattemptÚ	svg_filesÚlatests          r   Úfind_latest_svgrs   ¤   sž   € ä�+Ó€Fä˜Ó%ò ˆÜ˜Ÿ™ gÓ.Ó/ˆ	áÜ˜Ñ(IÔJˆFðØ—‘“×%Ò%Ø’ð �[ 1‘_Ó$Ü�J‰J�uÕðô ÐDÓ
EÐEøô Ô.Ð/ò Ùðús   ÁBÂB ÂB ÚpersonÚgeoc                 óÆ   — t        | j                  | j                  | j                  | j                  | j
                  | j                  |d   |d   |d   |d   |d   d¬«      S )Nr;   r:   r<   r6   r8   F)ÚlngrB   Útz_strr6   ÚnationÚonline)r   r   r   r   r   r   r   )rt   ru   s     r   Úcreate_subjectr{   º   sa   € ÜØ�‰Ø�‰Ø�‰Ø�
‰
Ø�‰Ø�‰Ø�ÑØ�
‰OØ�>Ñ"Ø�‰[Ø�9‰~Øôð r   rU   Ú
charts_dirc                 ó¼  — t         j                  j                  |d«      }t        j                  |d¬«       d}	 t	        | j
                  j                  «      }t	        | j                  j                  «      }t        | j
                  |«      }t        | j                  |«      }t        j                  «       j                  d«      }t         j                  j                  |d|› �«      }t        j                  |d¬«       t        |d||¬«      }	|	j                  «        t        j                  d	«       t!        |«      }
t#        | j
                  j$                  «      }t#        | j                  j$                  «      }|› d
|› d|› d�}t         j                  j                  ||«      }t'        t)        |
«      |«      }|st+        j,                  t)        |
«      |«       t+        j.                  |d¬«       dd|› �iS # t0        $ rT}|r6t         j                  j3                  |«      rt+        j.                  |d¬«       t1        dt)        |«      › �«      ‚d}~ww xY w)zè
    Generate full Kerykeion Synastry chart,
    then extract only wheel like birth chart.

    Save final extracted chart in:
    charts/synastry-chart/

    Return:
    {
      "chart": "/charts/synastry-chart/file.svg"
    }
    zsynastry-chartT)Úexist_okNz%Y%m%d_%H%M%SÚtemp_ÚSynastry)Ú
chart_typeÚ
second_objÚnew_output_directoryr*   Ú_and_Ú_synastry_chart_z.svg)Úignore_errorsÚchartz/charts/synastry-chart/z"Synastry chart generation failed: )ÚosÚpathÚjoinÚmakedirsr]   r   r   r   r{   r   ÚnowÚstrftimer   ÚmakeSVGrO   rP   rs   r'   r   r   r   ÚshutilÚmoveÚrmtreerM   Úexists)rU   r|   Úsynastry_folderÚtemp_dirÚperson1_geoÚperson2_geor   r   Ú	timestampr‡   Úfull_chart_svgÚp1_nameÚp2_nameÚfinal_file_nameÚ
final_pathÚ	extractedÚes                    r   Úgenerate_synastry_chart_svgrŸ   Ë   sù  € ô —g‘g—l‘l :Ð/?Ó@€OÜ‡K�K�¨$Õ/à€Hð<Gä'¨¯©×(:Ñ(:Ó;ˆÜ'¨¯©×(:Ñ(:Ó;ˆô ! §¡¨{Ó;ˆÜ  §¡¨{Ó;ˆô —L‘L“N×+Ñ+¨OÓ<ˆ	Ü—7‘7—<‘< °5¸¸Ð1DÓEˆÜ
�‰�H tÕ,ô "ØØ!ØØ!)ô	
ˆð 	�‰Œô 	�
‰
�1Œô )¨Ó2ˆä  §¡×!2Ñ!2Ó3ˆÜ  §¡×!2Ñ!2Ó3ˆð ˆi�u˜W˜IÐ%5°i°[ÀÐEð 	ô —W‘W—\‘\ /°?ÓCˆ
ô +Ü�ÓØó
ˆ	ñ
 ä�K‰Kœ˜NÓ+¨ZÔ8ô 	�‰�h¨dÕ3ð Ð.¨Ð.?Ð@ð
ð 	
øô ò GÙœŸ™Ÿ™ xÔ0Ü�M‰M˜(°$Õ7äÐ<¼SÀ»V¸HÐEÓFÐFûð	Gús   »GG> Ç>	IÈAIÉI)é   g      à?)rˆ   r%   rO   r�   rH   Úpathlibr   r   Úpydanticr   Ú	kerykeionr   r   Úchart_utilsr   r
   r   r   r'   Údictr]   r   rL   rs   r{   rŸ   r   r   r   ú<module>r¦      sË   ðÛ 	Û 	Û Û Û Ý Ý å ß <å .ô˜)ô ô!˜ô !ð
˜ð  ó ð|
˜Sð |
 Tó |
ñ~F ð F°3ð FÀ5ð FÐSWó Fð,Ð.ð °Tð Ð>Qó ð"OGÐ&8ð OGÀcð OGÈdô OGr   