
    U+i2                        d dl mZmZmZ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 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlZd dlZ eddg      Zej9                  d       edddd       ee      fdededee   defd       Zej?                  d       ed       ed       ed       ed       edddd       ee      fdedededee   dee   d ee   dee   defd!       Z ej9                  d"       edddd#       ee      fdededee   defd$       Z!ej9                  d%       ee      fd&edefd'       Z"y)(    )	APIRouterstatusDependsQuery
UploadFileFile)JSONResponseFileResponse)FolderClass)StudentClass)	FileClass)get_db)Optional)Session)Path)datetimeNz/foldersFolders)prefixtagsz7/checkDocumentExistence/{student_id}/{document_type_id}i  i4  u7   Año del período escolar (filtra registros en folders))geledescription
student_iddocument_type_idperiod_yeardbc                   K   	 t        |      }|j                  | ||      }|j                  d      dk(  r1t        t        j
                  d|j                  dd      ddg d	      S |j                  d
      }|g }nt        |t              s|r|gng }|j                  d      }|g }nt        |t              s|r|gng }t        t        j                  d|j                  d      |j                  d      |j                  dd      |j                  dd      ||d	      S # t        $ r7}t        t        j
                  ddt        |       ddg d	      cY d}~S d}~ww xY ww)u  
    Verifica si un estudiante ya tiene documentos de un tipo específico.
    Busca directamente en la tabla correspondiente según el document_type_id:
    - document_type_id = 1: busca en birth_certificate_documents
    - document_type_id = 4: busca en health_evaluations
    - Otros: busca en folders filtrando por document_type_id
    Retorna información sobre la existencia del documento filtrado por student_id y document_type_id.
    r   error  messagez*Error verificando existencia del documentoFr   )r   r    existstotaldatastatus_codecontentr#   Nmissing   r!   r"   total_missing)r   r    r!   r"   r)   r#   r'   z,Error verificando existencia del documento: )r   check_document_existencegetr	   r   HTTP_500_INTERNAL_SERVER_ERROR
isinstancelistHTTP_200_OK	Exceptionstr)	r   r   r   r   folder_serviceresultr#   r'   es	            C/var/www/pie360backend.cl/public_html/app/backend/routes/folders.pycheckDocumentExistencer6      sn    (5
$R88EUWbc::h7*"AA!%zz)5ab#	 	 zz&!<DD$'!D6rD **Y'?GGT*#*wiG**!::i0 **X.GQ/!'OQ!?"
 	
  

==!!McRSfXV#	
 		


sB   E%A"D" &E%'B:D" !E%"	E"+,EE"E%E""E%z"/upload/{student_id}/{document_id}.u   Año del período escolardocument_idfile	school_id	course_idprofessional_idc                   K   	 t        |      }|j                  |       }	t        |	t              rg|	j                  d      s|	j                  d      dk(  rBt	        t
        j                  d|	j                  d      xs |	j                  dd      dd      S d	d
lm}
 |j                  |
      j                  |
j                  |k(  |
j                  j                  d            j                         }|s#t	        t
        j                  dd| ddd      S |j                  }|j                   r-t#        |j                         j$                  j'                         nd}t)        j*                         j-                  d      }|  d| d| d| | }t/        |      }d| }	 |j1                  ||       t9        |      }|j;                  | ||||||t7        |      nd      }t        |t              rU|j                  d      dk(  rA	 |j=                  |       t	        t
        j4                  d|j                  dd      dd      S t	        t
        j>                  dd|j                  d      |j                  d      | ||||j                  |      |j                   dd      S # t2        $ r5}t	        t
        j4                  ddt7        |       dd      cY d}~S d}~ww xY w#  Y xY w# t2        $ rE}|jA                          t	        t
        j4                  ddt7        |       dd      cY d}~S d}~ww xY ww)u   
    Sube un archivo de documento para un estudiante y documento específico en la tabla folders.
    Maneja el control de versiones automáticamente.
    r   r     r    zEstudiante no encontradoNr   r    r#   r$   r   )DocumentModelzDocumento con id z no encontrado z%Y%m%d%H%M%S_zsystem/folders/r   zError subiendo archivo: )r   r7   	file_pathr9   r:   r;   r   z1Error guardando registro del archivo de documento   z(Archivo de documento subido exitosamenteid
version_id)rD   rE   r   r7   filenamerB   file_urloriginal_filename)!r   r+   r-   dictr	   r   HTTP_404_NOT_FOUNDapp.backend.db.modelsr?   queryfilterrD   deleted_dateis_firstr   rF   r   suffixlowerr   nowstrftimer   uploadr0   r,   r1   r   storedeleteHTTP_201_CREATEDrollback)r   r7   r8   r9   r:   r;   r   r   student_servicestudent_resultr?   document_infor   file_extension	date_hourunique_filenamefile_serviceremote_pathupload_errorr2   store_resultr4   s                         r5   upload_documentrd   ^   sV    (r
&r*(,,Z8nd+1C1CG1LP^PbPbckPlpwPw"55!-11':wn>P>PQZ\v>w   	8/66+&&**40
 %' 	
 "55!!2;-~N   )99 @D}}dmm,3399;RT LLN++N;	 (L+a8H7I9+VdUef !}''89	k2 %R%++!#%+,7,CK( , 
 lD)l.>.>x.HG.S##K0  "AA!+//	;no   //E&**40"."2"2<"@",#. /!, , 0 0 =)-	
 	
K  	"AA!!9#l:K9LM  	48  	

==5c!fX>
 	
	
s   M BK/ M A?K/ M B	K/ !J' 3AK/ K( .K/ M AK/ &M '	K%0*K K%K/ M  K%%K/ (K,*K/ /	L=8:L82L=3M 8L==M z /list/{student_id}/{document_id}u6   Año del período escolar (solo versiones de ese año)c           	        K   	 t        |      }|j                  | ||t        |      nd      }t        |t              rC|j                  d      dk(  r/t        t        j                  d|j                  dd      g d	      S t        t        j                  d
dt        |       dt        |      |d	      S # t        $ r5}t        t        j                  ddt        |       g d	      cY d}~S d}~ww xY ww)z
    Lista los registros de folders filtrados por student_id y document_id.
    Retorna todos los registros ordenados por version_id descendente.
    N)r   r   r   r   r    zError listando documentosr>   r$   r(   zSe encontraron z documento(s))r   r    r"   r#   zError listando documentos: )r   get_by_student_and_documentr1   r-   rI   r+   r	   r   r,   r/   lenr0   )r   r7   r   r   r2   r3   r4   s          r5   list_foldersrh      s     "
$R;;[E\[1Abf < 
 fd#

8(<(G"AA!%zz)5PQ  **,S[MGV	
 	
  
==8QA
 	

sA   C:A>B9 C:5B9 8C:9	C7*C2,C7-C:2C77C:z/download/{id}rD   c           	      \  K   	 t        |      }|j                  |       }t        |t              rC|j                  d      dk(  r/t	        t
        j                  d|j                  dd      dd      S |j                  d	      }|st	        t
        j                  dd
dd      S t        |      j                  }t        d      |z  }|j                         sUt        d      |j                  d	      z  }|j                         r|}n%t	        t
        j                  dd| d| dd      S t        j                  t        |            \  }}|sd}|}	t        t        |      |	|      S # t        $ r5}
t	        t
        j                  ddt        |
       dd      cY d}
~
S d}
~
ww xY ww)zi
    Descarga un documento de folders por su ID.
    El archivo debe estar en files/system/students/
    r   r   r=   r    zDocumento no encontradoNr>   r$   r8   z%El registro no tiene archivo asociadozfiles/system/studentszArchivo no encontrado: z. Buscando en: zapplication/octet-stream)pathrF   
media_typer   zError descargando archivo: )r   r+   r-   rI   r	   r   rJ   r   namer!   	mimetypes
guess_typer1   r
   r0   r,   )rD   r   r2   r3   rF   rB   file_path_altrk   rA   download_filenamer4   s              r5   download_documentrq     s    E
$R##B'fd#

8(<(G"55!%zz)5NO   ::f%"55!F   >&& 01H<	! !89FJJv<NNM##%)	# & 9 9"%%<XJoV_U`#a $  ",,S^<
A3J %Y&!
 	
  
==8QA
 	

sZ   F,A.E+ 2F,31E+ $F,%BE+ ,F,-=E+ *F,+	F)4*F$F)F,$F))F,)#fastapir   r   r   r   r   r   fastapi.responsesr	   r
   /app.backend.classes.student_document_file_classr   !app.backend.classes.student_classr   app.backend.classes.files_classr   app.backend.db.databaser   typingr   sqlalchemy.ormr   pathlibr   r   uuidrm   foldersr+   intr6   postrd   rh   rq        r5   <module>r      s   G G 8 G : 5 *  "    


 	FG "'M	" &/H
H
H
 #H
 	H
 HH
T 	23 Cy$T{$T{%*4[!&/	" &/E
E
E
 E
 }	E

 }E
 c]E
 #E
 	E
 4E
N 	/0 "'L	" &/1
1
1
 #1
 	1
 11
f 	 &/M
M
M
 M
r   