Ë
    =jj‰E  ã                  ó>  — d Z ddlmZ ddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ  ee«      Z e	ddg¬«      ZejA                  d«       e
e«      fdd„«       Z!d d„Z"ejA                  d«      d!d„«       Z#ejA                  d«      d"d„«       Z$ejK                  d«       e
e«      fd#d„«       Z&ejA                  d«       e
e«      fd$d„«       Z'ejK                  d«       ed¬«      f	 	 	 d%d„«       Z(y)&uE   
routers/sessions.py â€” session management and PDF report download.
é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚAny)Ú	APIRouterÚDependsÚHTTPExceptionÚQuery)ÚResponse)ÚScenarioÚScenarioCreateÚSessionReportÚSessionState)Ústore)Úget_current_userÚdecode_token)Úgenerate_report_analysis)Ú
get_loggerz/api/sessionsÚsessions)ÚprefixÚtagsz/startc              ƒ  ó  K  — | j                  dd«      j                  «       }| j                  d«      xs dj                  «       xs d}|st        dd¬«      ‚t        j                  |«      ƒ d {  –—† }|st        dd	¬«      ‚t        t        j                  «       «      d d
 }t        |||t        j                  t        j                  «      j                  «       ¬«      }t        j                  |«      ƒ d {  –—†  d|iS 7 Œ’7 Œ
­w)NÚscenario_idÚ Úlanguage_codeÚené¦  zscenario_id is required©Údetailé”  úScenario not foundé   )Ú
session_idr   r   Ú
started_atr#   )ÚgetÚstripr	   r   Úget_scenarioÚstrÚuuidÚuuid4r   r   Únowr   ÚutcÚ	isoformatÚsave_session)ÚbodyÚcurrent_userr   r   Úscenarior#   Úsessions          új/Users/priyanka/Documents/AI_Agent_Assessment/pepole_hub_candidate/people_hub_candidate/routes/sessions.pyÚstart_sessionr4      sä   è ø€ à—H‘H˜]¨BÓ/×5Ñ5Ó7€KØ—X‘X˜oÓ.Ò6°$×=Ñ=Ó?ÒGÀ4€MÙÜ˜CÐ(AÔBÐBÜ×'Ñ'¨Ó4×4€HÙÜ˜CÐ(<Ô=Ð=Ü”T—Z‘Z“\Ó" 3 BÐ'€JÜØØØ#Ü—<‘<¤§¡Ó-×7Ñ7Ó9ô	€Gô ×
Ñ
˜WÓ
%×%Ð%Ø˜*Ð%Ð%ð 5øð &ús%   ‚A/DÁ1DÁ2B	DÃ;DÃ<	DÄDc                ó  ‡ — ddœˆ fd„
}t         |dt        j                  «       j                  dd ¬«      «      }d|dd › d	|› �dd
 }t	        dui d|“dd“dt         |dd¬«      xs d«      “dt         |ddd¬«      xs d«      “dt        j                  t        j                  «      j                  «       “dt        j                  t        j                  «      j                  «       “dt         |ddd¬«      «      dd “dt         |dddd¬«      «      dd “dt         |dddd¬«      «      “d t         |d d!d"d#dd$¬«      «      “d%t         |d%d&d'dd(¬«      «      “d)t         |d)d*d+d,d-¬«      «      dd. “d/t         |d/d0d1d2d3¬«      «      “d4t         |d4d5d6d7d8d9¬«      «      dd. “d:t         |d:d;d<d=d>¬«      «      “d?t         |d?d@dAd¬«      «      “dBt         |dBdCdD¬«      «      “dEt        dFt        t         |dEdGdHd¬«      xs d«      dI«      «      “dJt         |dJdKdLdM¬«      «      “dNt         |dNdOdPdQdR¬«      «      “dSt         |dSdTdUdVdW¬«      «      “dXt         |dXdYdZd[d\¬«      «      “d]t         |d]d^d_d`dadb¬«      «      “dt         |ddcd¬«      «      “ddt         |dddedf¬«      «      “dgdh“dit         |didjdkdldh¬«      «      “dmt         |dmdndodpdh¬«      «      “dqt         |dqdrdsdt¬«      «      “ŽS )vzgAccept arbitrary external API shape (snake_case OR camelCase), fill in
    safe defaults, and validate.r   ©Údefaultc                óH   •— |D ]  }‰j                  |«      }|dvsŒ|c S  | S )z:Pick the first non-empty value from any of the given keys.)Nr   )r%   )r7   ÚkeysÚkÚvÚraws       €r3   Úgz_coerce_scenario.<locals>.g:   s.   ø€ ãˆAØ—‘˜“
ˆAØ˜
Ò"Ø’ð ð ˆó    ÚidNr"   zak-é   Ú-é0   ÚstatusÚliveÚcompletionsr   Ú	avg_scoreÚavgScoreÚ
created_atÚ
updated_atÚtitleÚnamezUntitled scenarioéP   ÚdescriptionÚsummaryÚdesczPractise this conversation.i,  ÚcategoryÚcatÚindustryÚcsÚ	cat_labelÚcatLabelÚcategory_labelÚcategoryLabelÚGeneralÚcontextÚsceneÚ
backgroundzHave a realistic conversation.Úlearner_roleÚlearnerRoleÚ	user_roleÚuserRoleÚ	Candidateé<   Úlearner_emojiÚlearnerEmojiÚ
user_emojiÚ	userEmojiu   ðŸ§‘â€�ðŸ’¼Úai_characterÚaiCharacterÚ	characterÚpartnerÚnpczAI CharacterÚai_emojiÚaiEmojiÚcharacter_emojiÚcharacterEmojiu   ðŸ¤–Úai_personalityÚaiPersonalityÚpersonalityÚ
difficultyÚlevelÚIntermediateÚturnsé   Ú	max_turnsÚmaxTurnsé   ÚscoringÚscoring_modeÚscoringModezGuided with FeedbackÚ
time_limitÚ	timeLimitÚdurationÚtimez10 minr   ÚlanguageCodeÚ	lang_codeÚlangCoder   Úlanguage_nameÚlanguageNameÚ	lang_nameÚlangNameÚEnglishÚlanguage_flagÚlanguageFlagÚ	lang_flagÚlangFlagÚflagu   ðŸ‡¬ðŸ‡§ÚindustryNameÚassign_groupÚassignGroupz	All usersÚvoice_onTÚchat_onÚchatOnÚenable_chatÚ
enableChatÚ	report_onÚreportOnÚenable_reportÚenableReportÚfeaturedÚis_featuredÚ
isFeaturedF© )r(   r)   r*   Úhexr   ÚintÚfloatr   r+   r   r,   r-   ÚmaxÚminÚbool)r<   Ú
access_keyr=   Úraw_idÚsyn_ids   `    r3   Ú_coerce_scenarior§   6   sÁ  ø€ ð ö ô ‘!�D¤$§*¡*£,×"2Ñ"2°3°BÐ"7Ô8Ó9€FØ�J˜r �NÐ# 1 V HÐ-¨c¨rÐ2€Fäò *Ùð*áð*ô ™˜-°Ô3Ò8°qÔ9ð*ô ™˜+ z¸1Ô=ÒBÀÔCð	*ô
 —<‘<¤§¡Ó-×7Ñ7Ô9ð*ô —<‘<¤§¡Ó-×7Ñ7Ô9ð*ô ™Q˜w¨Ð8KÔLÓMÈcÈrÑRð*ô ™Q˜}¨i¸ÐIfÔgÓhÐimÐjmÑnð*ô ™Q˜z¨5°*ÀdÔKÔLð*ô ™Q˜{¨JÐ8HÈ/Ø)°9ô>ô ?ð*ô ™Q˜y¨'°<ÀÐXxÔyÔzð*ô ™Q˜~¨}¸kÈ:Ø'2ô4ó 5Ø58°bñ:ð*ô ™Q˜°ÀÈkØ'4ô6ô 7ð*ô" ™Q˜~¨}¸kÈ9ÐV[Ø'5ô7ó 8Ø8;¸ñ=ð#*ô& ™Q˜z¨9Ð6GÐIYØ'-ô/ô 0ð'*ô* ™QÐ/°À-ÐY[Ô\Ô]ð+*ô, ™Q˜|¨W¸nÔMÔNð-*ô. ˜Q¤¤C©¨'°;À
ÐTUÔ(VÒ([ÐZ[Ó$\Ð^`Ó aÔbð/*ô0 ™Q˜y¨.¸-ÐQgÔhÔið1*ô2 ™Q˜|¨[¸*ÀfÐV^Ô_Ô`ð3*ô4 ™Q˜°ÀÈZØ'+ô-ô .ð5*ô8 ™Q˜°ÀÈZØ'0ô2ô 3ð9*ô< ™Q˜°ÀÈZÐY_Ø'1ô3ô 4ð=*ô@ ™Q˜z¨>À2ÔFÔGðA*ôB ™Q˜~¨}ÀkÔRÔSðC*ñL ðM*ôN ™a 	¨8°]ÀLÐZ^Ô_Ô`ðO*ôP ™a ¨Z¸È.ÐbfÔgÔhðQ*ôR ™a 
¨M¸<ÐQVÔWÔXðS*ð *r>   z/start-externalc           	   ƒ  ój  K  — | xs i j                  dd«      j                  «       }| xs i j                  d«      xs i }| xs i j                  d«      xs dj                  «       xs d}| xs i j                  d«      xs dj                  «       }| xs i j                  d«      xs dj                  «       }|st        dd	¬
«      ‚t        |t        «      r|st        dd¬
«      ‚	 t        ||«      }	 t        j                  |«      ƒ d{  –—†  t        t        j                  «       «      dd }d}	|r=	 ddlm}
 t!        |
j#                  «       «      }||v r|}	nt        j                  d|«       t%        ||j&                  |t)        j*                  t,        j.                  «      j1                  «       |xs d|	xs d¬«      }t        j2                  |«      ƒ d{  –—†  t        j5                  d|dd dz   |j&                  |«       ||j&                  d|z   dœS # t        $ r+}t        j                  d|«       t        dd|› �¬
«      ‚d}~ww xY w7 �ŒG# t        $ r!}t        j                  d|«       Y d}~�Œjd}~ww xY w# t        $ r!}t        j                  d|«       Y d}~�Œ6d}~ww xY w7 ŒÓ­w)a2  
    Start a session for a candidate authenticated via the external People
    Hub login (no JWT). Body shape:

        {
          "access_key":   "<the candidate's access key>",
          "scenario":     { ...full external scenario object... },
          "language_code": "en"   (optional)
        }
    r¤   r   r1   r   r   Úcandidate_nameÚselected_avatari�  zaccess_key is requiredr   r   zscenario object is requiredz%[sessions] coerce scenario failed: %szInvalid scenario: Nz/[sessions] persist external scenario failed: %sr"   r   )Úvideo_enginez:[sessions] rejected selected_avatar=%s (not in asset list)z'[sessions] avatar validation failed: %s)r#   r   r   r$   r©   rª   z9[sessions] external start  ak=%s  scenario=%s  session=%sé   u   â€¦zak:)r#   r   Úws_token)r%   r&   r	   Ú
isinstanceÚdictr§   Ú	ExceptionÚlogÚwarningr   Úupsert_scenarior(   r)   r*   Úservicesr«   ÚsetÚlist_available_avatarsr   r?   r   r+   r   r,   r-   r.   Úinfo)r/   r¤   Úraw_scr‚   Ú	cand_namerª   r1   Úexcr#   Úcleaned_avatarr«   Úallowedr2   s                r3   Ústart_session_externalr½   s   s�  è ø€ ð ’*˜"×!Ñ! ,°Ó3×9Ñ9Ó;€JØ’*˜"×!Ñ! *Ó-Ò3°€FØ’:˜2×"Ñ" ?Ó3Ò;°t×BÑBÓDÒLÈ€Ið ’:˜2×"Ñ"Ð#3Ó4Ò:¸×AÑAÓC€Ið
 š
 ×'Ñ'Ð(9Ó:Ò@¸b×GÑGÓI€OáÜ˜CÐ(@ÔAÐAÜ�fœdÔ#©6Ü˜CÐ(EÔFÐFðDÜ# F¨JÓ7ˆðLÜ×#Ñ# HÓ-×-Ð-ô ”T—Z‘Z“\Ó" 3 BÐ'€Jð
 €NÙð	HÝ-Ü˜,×=Ñ=Ó?Ó@ˆGØ 'Ñ)Ø!0‘ä—‘ØPØ#ôô Ø#Ø!Ÿ™Ø"Ü!Ÿ™¤h§l¡lÓ3×=Ñ=Ó?Ø"Ò* dØ(Ò0¨Dô€Gô ×
Ñ
˜WÓ
%×%Ð%ä‡H�HÐHØ˜˜ˆ^˜eÑ# X§[¡[°*ô>ð "Ø—{‘{Ø˜zÑ)ñð øôW ò DÜ�‰Ð;¸SÔAÜ˜CÐ*<¸S¸EÐ(BÔCÐCûðDúð 	.úÜò LÜ�‰ÐEÀs×KÒKûðLûô( ò 	HÜ�K‰KÐAÀ3×GÒGûð	Húð &ús—   ‚C%J3Ã(H Ã5I ÄIÄI Ä$J3Ä7<J Å3A*J3ÇJ1Ç?J3È	IÈ&&IÉIÉJ3ÉI É	JÉ I<É6J3É<JÊJ3Ê	J.ÊJ)Ê#J3Ê)J.Ê.J3z/{session_id}/end-externalc              ƒ  óô  K  — |xs i }t        j                  | «      ƒ d{  –—† }|st        dd«      ‚t        j                  |j                  «      ƒ d{  –—† }|st        dd«      ‚t        |j                  d«      xs d«      }|j                  d«      xs dj                  «       }t        |j                  d	«      xs d
«      j                  «       }|j                  d«      xs dj                  «       }ddl	m
}m}	m}
 ddl}|xs d| |j                  |j                  ||||j                   t#        j$                  t&        j(                  «      j+                  «       dœ	} |d|xs d|«       t-        |j.                  ||«      ƒ d{  –—† }t1        d+i d| “d|j                  “d|j2                  “d|j4                  “d|j6                  “d|j8                  › d|j:                  › �“d|“d|j                   “d|“dt=        |j                  d«      xs d«      “d|j                  dd«      “d|j                  dg «      “d|j                  dg «      “d|j                  dg «      “d |j.                  “d!t#        j$                  t&        j(                  «      j+                  «       “Ž}|�r|
j?                  |«      rñ	  |	|«      d"z  }g }|jA                  «       r5	 |jC                  |jE                  d#¬$«      «      }tG        |tH        «      s|g}|jM                  ||jO                  «       t#        j$                  t&        j(                  «      j+                  «       d%œ«       |jQ                  |jS                  |d&t        d'¬(«      d#¬$«       tT        jW                  d)|tY        |«      «       |S |S 7 �Œ�7 �Œ^7 �Œ+# tJ        $ r g }Y Œ¶w xY w# tJ        $ r!}tT        j[                  d*|«       Y d}~|S d}~ww xY w­w),u•  End a session that was started via /start-external. No JWT required â€”
    the session_id itself serves as the proof of having started a session.

    The full end-session request is logged as an "API SPEC SAMPLE" so the
    backend developer can use the exact shape when designing the upstream
    role-play results endpoint, and is mirrored to
    data/by_access_key/{access_key}/end_session.json.
    Nr    úSession not foundr!   Úduration_secondsr   ÚmodeÚchatr¤   r   Ú
end_reasonÚ	completed)Ú_log_outgoing_requestÚ
_audit_dirÚ_ACCESS_KEY_REz<not-provided>)	r¤   r#   r   Úscenario_titlerÀ   rÁ   rÃ   Úturns_completedÚended_atÚend_sessionÚ	anonymousr#   rÈ   r\   rf   rr   ÚlanguageÚ rÉ   Úoverall_scoreÚverdictÚneeds_improvementÚ
dimensionsÚfeedbackÚsentiment_timelineÚ
transcriptÚgenerated_atzend_session.jsonzutf-8)Úencoding)ÚrequestÚresponseÚsaved_até   F)Úindentr7   Úensure_asciiu9   [end_session] mirrored â†’ %s/end_session.json (%d total)z)[end_session] mirror failed (ignored): %sr�   ).r   Úget_sessionr	   r'   r   rŸ   r%   r&   r(   Úroutes.peoplehub_externalrÅ   rÆ   rÇ   Újsonr?   rJ   Úturnr   r+   r   r,   r-   r   Úmessagesr   r\   rf   rr   r‰   r„   r    Ú	fullmatchÚexistsÚloadsÚ	read_textr®   Úlistr°   ÚappendÚ
model_dumpÚ
write_textÚdumpsr±   r·   Úlenr²   )r#   r/   r2   r1   r   rÁ   r¤   rÃ   rÅ   rÆ   rÇ   rà   Úspec_payloadÚanalysisÚreportÚpathÚexistingrº   s                     r3   Úend_session_externalrò   Æ   sÍ  è ø€ ð Š:�2€DÜ×%Ñ% jÓ1×1€GÙÜ˜CÐ!4Ó5Ð5Ü×'Ñ'¨×(;Ñ(;Ó<×<€HÙÜ˜CÐ!5Ó6Ð6ä�T—X‘XÐ0Ó1Ò6°QÓ7€HØ—(‘(˜6Ó"Ò, f×3Ñ3Ó5€DÜ�T—X‘X˜lÓ+Ò1¨rÓ2×8Ñ8Ó:€JØ—(‘(˜<Ó(Ò7¨K×>Ñ>Ó@€J÷ñ ó ð &Ò9Ð)9Ø%Ø#Ÿ;™;Ø#Ÿ>™>Ø$ØØ%Ø"Ÿ<™<Ü#Ÿ<™<¬¯©Ó5×?Ñ?ÓAñ
€Lñ ˜-¨Ò)B°{ÀLÔQä-¨g×.>Ñ.>ÀÈ(ÓS×S€Häò Ù$ðà"Ÿ.š.ðð #×/Ò/ðð #×/Ò/ð	ð
 #×-Ò-ðð &×3Ñ3Ð4°A°h×6LÑ6LÐ5MÑNðñ ðð "Ÿ,š,ðñ #ðô   §¡¨_Ó =Ò BÀÔCðð #Ÿ,™, yÐ2EÔFðð #Ÿ,™, |°RÔ8ðð #Ÿ,™, z°2Ô6ðð &Ÿ\™\Ð*>ÀÔCðð "×*Ò*ðô  #Ÿ,™,¤x§|¡|Ó4×>Ñ>Ô@ð!€Fò( �n×.Ñ.¨zÔ:ð	JÙ˜jÓ)Ð,>Ñ>ˆDØˆHØ�{‰{Œ}ð"Ø#Ÿz™z¨$¯.©.À'¨.Ó*JÓK�HÜ% h´Ô5Ø$, :˜ð �O‰OØ(Ø"×-Ñ-Ó/Ü$ŸL™L¬¯©Ó6×@Ñ@ÓBñô ð �O‰OØ—
‘
˜8¨A´sÈ�
ÓOØ ð ô ô �H‰HÐPØ¤ X£ô0ð
 €Mˆ6€Mðc 2ùð =ùð: Túô> !ò "Ø!’Hð"ûô ò 	JÜ�K‰KÐCÀS×IÐIà€Mûð	Jüs„   ‚O8¡N1¢4O8ÁN4ÁD5O8ÆN7ÆD1O8Ê?O Ë4N: ÌBO Î-O8Î4O8Î7O8Î:OÏO ÏOÏO Ï	O5ÏO0Ï*O8Ï0O5Ï5O8z/{session_id}c              ƒ  óh   K  — t        j                  | «      ƒ d {  –—† }|st        dd«      ‚|S 7 Œ­w)Nr    r¿   )r   rÞ   r	   )r#   Ú_Úss      r3   rÞ   rÞ   %  s4   è ø€ ä×Ñ 
Ó+×+€AÙÜ˜CÐ!4Ó5Ð5Ø€Hð 	,ús   ‚2›0œ2z/{session_id}/endc           
   ƒ  ó$  K  — t        j                  | «      ƒ d {  –—† }|st        dd«      ‚t        j                  |j                  «      ƒ d {  –—† }|st        dd«      ‚t        |j                  d«      xs d«      }|j                  d«      xs dj                  «       }t        |j                  ||«      ƒ d {  –—† }t        di d| “d	|j                  “d
|j                  “d|j                  “d|j                  “d|j                  › d|j                   › �“d|“d|j"                  “d|“dt%        |j                  d«      xs d«      “d|j                  dd«      “d|j                  dg «      “d|j                  dg «      “d|j                  dg «      “d|j                  “dt'        j(                  t*        j,                  «      j/                  «       “Ž}t        j0                  t3        di |j5                  dh¬«      ¤dt'        j(                  t*        j,                  «      j/                  «       i¤Ž«      ƒ d {  –—†  t        j6                  |j                  d|j8                  xs ddz   i«      ƒ d {  –—†  |S 7 �Œh7 �Œ67 �ŒË7 ŒJ7 Œ­w)Nr    r¿   r!   rÀ   r   rÁ   rÂ   r#   rÈ   r\   rf   rr   rÍ   rÎ   rÉ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   rÊ   )ÚexcluderE   é   r�   )r   rÞ   r	   r'   r   rŸ   r%   r&   r   râ   r   rJ   r\   rf   rr   r‰   r„   rá   r    r   r+   r   r,   r-   r.   r   ré   Úpatch_scenariorE   )	r#   r/   rô   r2   r1   r   rÁ   rî   rï   s	            r3   rË   rË   -  s�  è ø€ ä×%Ñ% jÓ1×1€GÙÜ˜CÐ!4Ó5Ð5Ü×'Ñ'¨×(;Ñ(;Ó<×<€HÙÜ˜CÐ!5Ó6Ð6Ü�4—8‘8Ð.Ó/Ò4°1Ó5€HØ—‘˜Ó Ò* F×1Ñ1Ó3€DÜ-¨g×.>Ñ.>ÀÈ(ÓS×S€HÜò Ùðà—~’~ðð ×*Ò*ðð ×*Ò*ð	ð
 ×&Ò&ðð ×*Ñ*Ð+¨1¨X×-CÑ-CÐ,DÑEðñ ðð  Ÿšðñ "ðô ˜HŸL™L¨Ó9Ò>¸QÔ?ðð —‘˜YÐ(;Ô<ðð —<‘< ¨bÔ1ðð —‘˜j¨"Ô-ðð $Ÿ<™<Ð(<¸bÔAðð ×#Ò#ðô  —\‘\¤(§,¡,Ó/×9Ñ9Ô;ð!€Fô$ ×
Ñ
œ\ñ Ø
×
Ñ
 j \Ð
Ó
2ñä—‘œhŸl™lÓ+×5Ñ5Ó7òó ÷ ð ô ×
Ñ
˜w×2Ñ2Ø˜×,Ñ,Ò1°°QÑ6ð5ó ÷ ð ð €MðE 2ùð =ùð
 Tùð&øðúsY   ‚J›Jœ4JÁJÁA-JÂ>J	Â?FJÉJÉ:JÉ<JÉ=JÊJÊ	JÊJÊJz/{session_id}/report/pdfr   r6   c           
   ƒ  ój  K  — |st        dd¬«      ‚	 t        |«       t        j                  | «      ƒ d{  –—† }|st        dd«      ‚t        j
                  |j                  «      ƒ d{  –—† }|st        dd«      ‚t        |j                  |d	«      ƒ d{  –—† }t        d(i d
| “d|j                  “d|j                  “d|j                  “d|j                  “d|j                  › d|j                  › �“dd“d|j                   “dd	“dt#        |j%                  d«      xs d	«      “d|j%                  dd«      “d|j%                  dg «      “d|j%                  dg «      “d|j%                  dg «      “d|j                  “dt'        j(                  t*        j,                  «      j/                  «       “Ž}	 d	dlm}  ||«      }t;        |d#d$d%| › d&�i¬'«      S # t        $ r t        dd¬«      ‚w xY w7 �Œ½7 �Œ‹7 �Œa# t4        $ r+}t6        j9                  d«       t        dd |› d!�¬"«      ‚d}~ww xY w­w))uÈ   
    Stream a PDF report. Auth via ?token= query param only â€”
    window.open() cannot send Authorization headers so we skip Depends()
    and validate the token manually from the query string.
    i‘  u)   Authentication required â€” token missing)Ústatus_coder   zInvalid or expired tokenNr    r¿   r!   r   r#   rÈ   r\   rf   rr   rÍ   rÎ   rÁ   r2   rÉ   rÀ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   )Úgenerate_pdfz#[sessions] report_pdf import failediô  zPDF generator unavailable: z". Install reportlab on the server.r   zapplication/pdfzContent-Dispositionzattachment; filename="report_z.pdf")ÚcontentÚ
media_typeÚheadersr�   )r	   r   Ú
ValueErrorr   rÞ   r'   r   r   râ   r   rJ   r\   rf   rr   r‰   r„   rá   r    r%   r   r+   r   r,   r-   Úservices.report_pdfrü   r°   r±   Ú	exceptionr   )	r#   Útokenr2   r1   rî   rï   rü   rº   Ú	pdf_bytess	            r3   Údownload_reportr  T  sm  è ø€ ñ Ü¨Ð4_Ô`Ð`ðPÜ�UÔô ×%Ñ% jÓ1×1€GÙÜ˜CÐ!4Ó5Ð5Ü×'Ñ'¨×(;Ñ(;Ó<×<€HÙÜ˜CÐ!5Ó6Ð6ä-¨g×.>Ñ.>ÀÈ!ÓL×L€HÜò Ùðà—~’~ðð ×*Ò*ðð ×*Ò*ð	ð
 ×&Ò&ðð ×*Ñ*Ð+¨1¨X×-CÑ-CÐ,DÑEðñ ðð  Ÿšðñ ðô ˜HŸL™L¨Ó9Ò>¸QÔ?ðð —‘˜YÐ(;Ô<ðð —<‘< ¨bÔ1ðð —‘˜j¨"Ô-ðð $Ÿ<™<Ð(<¸bÔAðð ×#Ò#ðô  —\‘\¤(§,¡,Ó/×9Ñ9Ô;ð!€Fð(
Ý4ñ ˜VÓ$€IÜØØ$Ø&Ð*GÈ
À|ÐSXÐ(YÐZôð øôQ ò PÜ¨Ð4NÔOÐOðPúð 2ùð =ùð Múô. ò 
Ü�‰Ð;Ô<ÜØØ0°°Ð5WÐXô
ð 	
ûð
üsn   ‚H3“G žH3¶G3·4H3Á+G6Á,,H3ÂG9ÂDH3Æ7G< Æ=H3ÇG0Ç0H3Ç6H3Ç9H3Ç<	H0È&H+È+H0È0H3)r/   r¯   )r<   r¯   r¤   r(   Úreturnr   )r/   údict[str, Any])r#   r(   r/   r  )r#   r(   )r#   r(   r/   r¯   )r#   r(   r  r(   ))Ú__doc__Ú
__future__r   r)   r   r   Útypingr   Úfastapir   r   r	   r
   Úfastapi.responsesr   Úmodels.schemasr   r   r   r   r´   r   Úservices.authr   r   Úservices.openai_servicer   Úutils.loggerr   Ú__name__r±   ÚrouterÚpostr4   r§   r½   rò   r%   rÞ   rË   r  r�   r>   r3   Ú<module>r     sA  ðñõ #Û ß 'Ý ç <Ó <Ý &ç PÓ PÝ ß 8Ý <õ $á�Ó€Ù	˜/°°Ô	=€ð ‡�ˆXÓÙ18Ð9IÓ1Jó &ó ð&ó2:ðz ‡�ÐÓòOó  ðOðd ‡�Ð)Ó*ò[ó +ð[ð| ‡�ˆOÓÙ)0Ð1AÓ)Bó ó ðð ‡�Ð Ó!Ù5<Ð=MÓ5Nó #ó "ð#ðL ‡�Ð&Ó'ñ ˜rÔ"ð9Øð9àò9ó (ñ9r>   