
    45j                       S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJrJrJrJrJr  SSKJr  SSKJrJr  SSKJr  SSKJrJ r J!r!  \RD                  " \#5      r$SS jr% S       SS jjr&SS jr'        SS jr(        SS jr)          SS jr* S           SS jjr+            SS jr,g) u>   Generación del informe familia: base PIE360 + redacción GPT.    )annotationsN)datetime)Path)Any)Session)settings)AgentResponseFileModel)apply_familia_arial_10_font)build_familia_identification_replacements!compact_familia_narrative_spacingfill_familia_docx!fix_familia_motivo_evaluacion_row)%fill_familia_identification_only_docx)docx_has_form_controlsresolve_familia_template_path)is_familia_report_request)	agent_dirbuild_response_storage_pathensure_responses_dirc                     [        [        R                  5      S-  S-  n U R                  5       (       a  [	        U 5      (       a  U $ g )Noriginal_student_fileszfamily_report.docx)r   r   	files_diris_filer   )paths    eC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\services\agent_familia_generate_service.py_system_family_report_templater   "   s<    ""#&>>AUUD||~~066    c                    [        X5      nU(       a  UR                  5       (       d  Ub  SSKJn  U" X 5      nU(       a  [	        U5      (       a  U$ [        5       $ )zTPlantilla familia del agente (formulario o ministerial) o family_report del sistema.r   )'resolve_familia_template_path_for_agent)r   r   (app.backend.utils.agent_familia_templater   r   r   )agent_idselected_rowsdbr   r   s        r   $resolve_form_template_for_generationr$   )   sH     )ADBNd6rD&t,,)++r   c                    [         R                  " SSU =(       d    S5      R                  5       R                  SS5      nUS S =(       d    SR                  S5      $ )Nz[^\w\s-] 
estudiante _(   )resubstripreplace)student_namebases     r   _safe_filenamer1   9   sM    66+rL$@LBHHJRRSVX[\D"I%,,S11r   c                    [        XU5      nUR                  S5      S:X  a#  [        UR                  S5      =(       d    S5      eg )Nstatuserrormessageu   fill_familia_docx falló)r   getRuntimeError)template_pathout_pathreplacementsresults       r   _fill_and_saver<   >   s@    
 }HEFzz(w&6::i0N4NOO 'r   c                   [        U 5        UR                  S5      =(       d    SnS[        [        U5      5       S3n[        R
                  " 5       R                  SS n[        U 5      S-  SU S	U 3-  nUR                  R                  S
S
S9  [        U5      n[        X'U5      nUR                  S5      S:X  a#  [        UR                  S5      =(       d    S5      e[        Xa5        [        U5        UUUR                  S.$ )uN   Genera .docx base con identificación desde BD (sin fila en BD de respuestas).student_full_name
EstudianteInforme_familia_.docxN
   	responses_base_r)   Tparentsexist_okr3   r4   r5   u,   fill_familia_identification_only_docx falló)	disk_pathdisplay_nametemplate_name)r   r6   r1   struuiduuid4hexr   parentmkdirr   r   r7   r   r
   name)	r!   student_contextr8   r/   rI   tokenrH   r:   r;   s	            r   create_familia_base_for_gptrT   H   s     ""&&':;K|L%nS5F&G%HNLJJLSb!E(#k1fUG1\N4SSI4$7<_ML2=PYZFzz(w&6::i0b4bcc%iA	* $&++ r   c           
        [        U5        UR                  S5      =(       d    SnS[        [        U5      5       S3n[	        U5      u  pg[        U5      U-  nUR                  R                  SSS9  [        U5      n	[        X8U	5        [        X5        [        U5        [        U5        [        R                  " 5       n
[        UUUUR!                  5       R"                  SSU
S9nU R%                  U5        U R'                  5         UR(                  UR*                  [-        UR.                  =(       d    S	5      UR0                  (       a  UR0                  R3                  5       S.$ S
S.$ )z5Informe completo solo desde BD (fallback sin OpenAI).r>   r?   r@   rA   TrE   zpie360-form)idr!   rI   
size_bytesopenai_container_idopenai_file_id
created_atr   N)rV   rQ   size	createdAt)r   r6   r1   rK   r   r   rO   rP   build_familia_form_replacementsr<   r   r   r
   r   utcnowr	   statst_sizeaddflushrV   rI   intrW   rZ   	isoformat)r#   r!   rR   r8   r/   visible_namestorage_pathvisibler9   r:   nowrows               r   generate_familia_report_docxrj   c   s;    ""&&':;K|L%nS5F&G%HNL7EL"\1HOO$62?CL=L9%h@%h/)
//
C
 ==?**)$C FF3KHHJ ff  CNN'a(36>>S^^--/	  HL	 r   c                t    [        U 5      (       d  g U(       a  UR                  S5      (       d  g [        X2US9$ )N
student_idr#   )r   r6   r$   )r5   rR   r"   r!   r#   s        r   can_use_familia_hybridrn      s5     %W--/"5"5l"C"C/BOOr   c                    [        X$X1U S9nU(       a  U(       d  g[        XXE5      nUR                  S5      =(       d    SnSU SUR                   S3U/SSS	UR                  S
.$ )z5Solo cuando no hay OpenAI: informe completo desde BD.rm   Nr>   zel estudianteu&   Generé el Informe para la Familia de u    desde PIE360 (plantilla «u!   »). Descarga el archivo adjunto.r   zpie360-fill_docx_form)replyresponseFilesopenaiFilesUsedcontainerIdmodeltemplateUsed)rn   rj   r6   rQ   )r#   r!   r5   r"   rR   r8   	file_dictr/   s           r    try_deterministic_familia_reportrw      s     +7]acdM,R?ZI"&&':;NL 5\N C)..//PR $(%**
 
r   )returnPath | None)N)r!   rK   r"   	list[Any]r#   Session | Nonerx   ry   )r/   z
str | Nonerx   rK   )r8   r   r9   r   r:   zdict[str, str]rx   None)r!   rK   rR   dict[str, Any]r8   r   rx   r}   )
r#   r   r!   rK   rR   r}   r8   r   rx   r}   )r5   rK   rR   dict[str, Any] | Noner"   rz   r!   rK   r#   r{   rx   ry   )r#   r   r!   rK   r5   rK   r"   rz   rR   r~   rx   r~   )-__doc__
__future__r   loggingr+   rL   r   pathlibr   typingr   sqlalchemy.ormr   app.backend.core.configr   app.backend.db.modelsr	   'app.backend.utils.agent_familia_prefillr
   r   r   r   r   0app.backend.utils.agent_familia_placeholder_fillr   r    r   r   &app.backend.utils.agent_student_lookupr   app.backend.utils.agent_filesr   r   r   	getLogger__name__loggerr   r$   r1   r<   rT   rj   rn   rw    r   r   <module>r      s   D "  	     " , 8  c M f f			8	$ ,,, 	, 	, 2
PPP !P 
	P#  	6&&& $& 	&
 &\ PP*P P 	P
 	P P  	
 + r   