
    +Vhr                         d dl mZmZmZmZmZmZ d dlmZ d dl	m
Z
mZ d dlZd dlZd dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZm Z m!Z! d d	l"m#Z# d d
l$m%Z%  eddg          Z&e&'                    de           ee           ee#          fdededefd            Z(e&)                    de
e                    ed d            eddd           ed           ed           ed           ee           ee#          fde*de*dee+         dee+         dee*         dedefd            Z,e&)                    de           ee           ee#          fd e*dedefd!            Z-e&.                    de           ee           ee#          fd e*d"ededefd#            Z/e&'                    d$e           ee           ee#          fd e*d%ededefd&            Z0e&)                    d$e
e                    ee           ee#          fd e*dedefd'            Z1e&'                    d(e           ed)          d* ee           ee#          fd e*d+ed,e+dedef
d-            Z2e&)                    d(e
e                    ee           ee#          fd e*dedefd.            Z3e&'                    d/e            ee           ee#          fd e*d0ededefd1            Z4e&)                    d/e
e                     ee           ee#          fd e*dedefd2            Z5e&'                    d3           ee           ee#          fd e*d4e!dedefd5            Z6dS )6    )	APIRouterDependsHTTPExceptionQuery
UploadFileFile)Session)ListOptionalN)datetime)get_db)	CandidateApplicationDocumentNoteUser)
CandidateCreateCandidateUpdateCandidateResponseApplicationCreateApplicationUpdateApplicationResponseDocumentResponse
NoteCreateNoteResponseAICandidateAssessRequest)get_current_active_user)	AIServicez/candidates
Candidates)prefixtags/)response_model	candidatedbcurrent_userc                   K   |                     t                                        t          j        | j        k                                              }|rt          dd          t          di |                                 }|                    |           |                                 |	                    |           |S )zCreate a new candidate  z(Candidate with this email already existsstatus_codedetail )
queryr   filteremailfirstr   
model_dumpaddcommitrefresh)r$   r%   r&   existingdb_candidates        0/home/runner/workspace/app/routers/candidates.pycreate_candidater8      s       xx	"")))/Y_*LMMSSUUH `4^____66y335566LFF<IIKKKJJ|    )ged      i  )r:   leskiplimitsearchstatus
project_idc                 v  K   |                     t                    }|r~|                    t          j                            d| d          t          j                            d| d          z  t          j                            d| d          z            }|r#|                    t          j        |k              }|r;|                    t                                        t          j
        |k              }|                    |                               |                                          }|S )zList candidates with filtering%)r-   r   r.   
first_nameilike	last_namer/   status_overalljoinr   rB   offsetr?   all)	r>   r?   r@   rA   rB   r%   r&   r-   
candidatess	            r7   list_candidatesrM   &   s      HHYE 
 &&}6}}}55%%m&mmm445O!!-f---001
 
  AY5?@@ U

;''..{/E/STTd##))%004466Jr9   z/{candidate_id}candidate_idc                    K   |                     t                                        t          j        | k                                              }|st          dd          |S )zGet a specific candidate  Candidate not foundr)   )r-   r   r.   idr0   r   )rN   r%   r&   r$   s       r7   get_candidaterS   C   s]       ##**9<<+GHHNNPPI K4IJJJJr9   candidate_updatec                   K   |                     t                                        t          j        | k                                              }|st          dd          |                    d                                          D ]\  }}t          |||           |	                                 |
                    |           |S )zUpdate a candidaterP   rQ   r)   T)exclude_unset)r-   r   r.   rR   r0   r   r1   itemssetattrr3   r4   )rN   rT   r%   r&   r$   fieldvalues          r7   update_candidater[   O   s       ##**9<<+GHHNNPPI K4IJJJJ(33$3GGMMOO ) )u	5%((((IIKKKJJyr9   z/{candidate_id}/applicationsapplicationc                 r  K   |                     t                                        t          j        | k                                              }|st          dd          |                     t                                        t          j        | k    t          j        |j        k                                              }|rt          dd          t          | |j        |j	        |j
                  }|                    |           |                                 |                    |           |S )z%Create an application for a candidaterP   rQ   r)   r(   z+Application already exists for this project)rN   rB   motivation_letteradditional_info)r-   r   r.   rR   r0   r   r   rN   rB   r^   r_   r2   r3   r4   )rN   r\   r%   r&   r$   r5   db_applications          r7   create_applicationra   c   s"      ##**9<<+GHHNNPPI K4IJJJJ xx$$++ L0+"88  egg   c4abbbb !)%7#3	  N FF>IIKKKJJ~r9   c                    K   |                     t                                        t          j        | k                                              }|S )z*List applications for a specific candidate)r-   r   r.   rN   rK   )rN   r%   r&   applicationss       r7   list_candidate_applicationsrd      sA       88K((//0HL0XYY]]__Lr9   z/{candidate_id}/documents.otherfiledocument_typec           	      ^  K   |                     t                                        t          j        | k                                              }|st          dd          d}t          j        |d           t          j	                    
                    d          }d|j        v r |j                            d          d	         nd
}d|  d| d| }	t          j                            ||	          }
t          |
d          5 }t!          j        |j        |           ddd           n# 1 swxY w Y   t'          | |j        |
|t          j                            |
                    }|                    |           |                                 |                    |           |S )z!Upload a document for a candidaterP   rQ   r)   zuploads/documentsT)exist_okz%Y%m%d_%H%M%S. 
candidate__wbN)rN   	file_name	file_pathrg   	file_size)r-   r   r.   rR   r0   r   osmakedirsr   nowstrftimefilenamesplitpathrI   openshutilcopyfileobjrf   r   getsizer2   r3   r4   )rN   rf   rg   r%   r&   r$   
upload_dir	timestampfile_extensionrw   rq   bufferdocuments                r7   upload_documentr      s      ##**9<<+GHHNNPPI K4IJJJJ %JK
T**** ''88I58DM5I5IT]((--b11rNGLGG9GG~GGHZ22I 
i		 .&49f---. . . . . . . . . . . . . . . !-#'//),,  H FF8IIKKKJJxOs   D..D25D2c                    K   |                     t                                        t          j        | k                                              }|S )zList documents for a candidate)r-   r   r.   rN   rK   )rN   r%   r&   	documentss       r7   list_candidate_documentsr      sA       ""))(*?<*OPPTTVVIr9   z/{candidate_id}/notesnotec                   K   |                     t                                        t          j        | k                                              }|st          dd          t          | |j        |j        |j                  }|	                    |           |
                                 |                    |           |S )zCreate a note for a candidaterP   rQ   r)   )rN   user_idcontentis_important)r-   r   r.   rR   r0   r   r   r   r   r2   r3   r4   )rN   r   r%   r&   r$   db_notes         r7   create_noter      s       ##**9<<+GHHNNPPI K4IJJJJ!&	  G FF7OOOIIKKKJJwNr9   c                    K   |                     t                                        t          j        | k                                              }|S )zList notes for a candidate)r-   r   r.   rN   rK   )rN   r%   r&   notess       r7   list_candidate_notesr      s>       HHTNN!!$"3|"CDDHHJJELr9   z/{candidate_id}/ai-assessmentrequestc                 N   K   | |_         t          j        ||           d{V }|S )z!Get AI assessment for a candidateN)rN   r   assess_candidate)rN   r   r%   r&   
assessments        r7   r   r      s:       (G 1"g>>>>>>>>Jr9   )7fastapir   r   r   r   r   r   sqlalchemy.ormr	   typingr
   r   rs   r{   r   app.core.databaser   
app.modelsr   r   r   r   r   app.schemas.candidater   r   r   r   r   r   r   r   r   r   app.services.authr   app.services.ai_servicesr   routerpostr8   getintstrrM   rS   putr[   ra   rd   r   r   r   r   r   r,   r9   r7   <module>r      s   N N N N N N N N N N N N N N N N " " " " " " ! ! ! ! ! ! ! ! 				        $ $ $ $ $ $ C C C C C C C C C C C C C C                        6 5 5 5 5 5 . . . . . .	-|n	=	=	=S!233 '&// !899     43" C%6 788aAsqT***!E$KK!E$KK %d'&// !899 
 SM SM	
  	    988 .?@@ '&// !899	 			 	 	 	 A@	 .?@@ '&// !899	 % 	 	   A@& +<OPP '&// !899	 " 	 	   QP> *4@S;TUU '&// !899     VU (9IJJ tCyy '&// !899& &&
& & 		&
 & & & KJ&P '=M8NOO '&// !899     PO $\BB '&// !899	 
 	 	   CB, #D4FGG '&// !899     HG ,-- '&// !899		 		%	 		 		 	 	 .-	 	 	r9   