
    KVh!                     T   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mZmZmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
l m!Z!  eddg      Z"e"jG                  dee$ef          ed       ee       ee!      fdee%   dedefd       Z&e"jG                  de       ee       ee!      fde%dedefd       Z'e"jG                  d       ee       ee!      fdedefd       Z(e"jG                  d       ee       ee!      fde%dedefd       Z)y)    )	APIRouterDependsHTTPExceptionQuery)Session)funcdesc)ListOptionalDictAny)get_db)Application	CandidateProjectAIAssessmentUserApplicationStatus)ApplicationStatsResponseCandidateRankingResponseCandidateRankingItem)CandidateResponse)ProjectResponse)get_current_active_userz/reportsReports)prefixtagsz/application-stats)response_modelN
project_iddbcurrent_userc                 :  K   |j                  t              }| r|j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  dk7  r&|j                  |j                  k7  rt        dd      |j                  t        j                  | k(        }nN|j                  dk7  r?|j                  t              j                  t        j                  |j                  k(        }|j                         }|j                  t        j                  t        j                  t        j                              j                  t        j                        j!                         }|D ci c]  \  }}|j"                  | }	}}|j                  t              j                  t        j$                  t        j                  t        j                              j                  t        j$                        j!                         }
|
D cg c]
  \  }}||d }}}|j'                  t)        t        j*                              j-                  d      j!                         }||	||d	S c c}}w c c}}w w)
zGet application statistics  Project not foundstatus_codedetailadmin  Not enough permissions)project_titlecount
   )total_applicationsapplications_by_statusapplications_by_projectrecent_applications)queryr   r   filteridfirstr   roleowner_idr   joinr,   with_entitiesstatusr   group_byallvaluetitleorder_byr	   
applied_atlimit)r   r    r!   r2   projectr.   status_countsr:   r,   r/   project_countsr>   r0   r1   s                 \/Users/theessential/Documents/Github/40Admission/40-admission-backend/app/routers/reports.pyget_application_statsrF      s
     HH[!E ((7#**7::+CDJJLC8KLL'G,<,<,OC8PQQ[33zAB			g	%

7#**7+;+;|+NO  	K..

;;M;M0NO	+$$	%	 
 HUUmfefllE1UU 	

7	w}}djj1G1G&H	I	'--	 		  +E5  %0  	tK2234	r	  1"8#:2	 + Vs    FJJ*BJ1J AJz /candidate-rankings/{project_id}c                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  dk7  r&|j                  |j                  k7  rt        dd      |j                  t              j                  t        j                  | k(        j                         }g }|D ]  }|j                  t              j                  t        j                  |j                  k(  t        j                  | k(        j                  t        t        j                              j	                         }t!        |j"                  |j$                  |r|j&                  nd|r|j(                  nd      }|j+                  |        |j-                  d	 d
       t/        | |j$                  |      S w)z/Get AI-powered candidate rankings for a projectr#   r$   r%   r(   r)   r*   N)	candidater+   scoreassessment_summaryc                 P    | j                   xs d | j                  j                  fS )Nr   )rI   rH   
created_at)xs    rE   <lambda>z(get_candidate_rankings.<locals>.<lambda>{   s    A(>(>?     F)keyreverse)r   r+   rankings)r2   r   r3   r4   r5   r   r6   r7   r   r   r<   r   candidate_idr?   r	   generated_atr   rH   r>   rI   summaryappendsortr   )	r   r    r!   rB   applicationsrR   app
assessmentranking_items	            rE   get_candidate_rankingsr\   N   s     hhw&&wzzZ'?@FFHG4GHHG#(8(8LOO(K4LMM 		&&*4	5	  H & HH\"V))S-=-=='':5 Xd<4456UW 	 ,mm!--&0*""d5?z11T	
 	%%&* MM?  
 $mm s   GGz/dashboard-summaryc           	      `  K   |j                   dk(  r+| j                  t              }| j                  t              }n| j                  t              j	                  t        j
                  |j                  k(        }| j                  t              j                  t              j	                  t        j
                  |j                  k(        }|j                         }|j                         }| j                  t              j                         }|j	                  t        j                  dk(        j                         }|j	                  t        j                  t        j                  k(        j                         }|j	                  t        j                  t        j                  k(        j                         }	|j	                  t        j                  t        j                  k(        j                         }
ddlm}m} |j#                          |d      z
  }|j	                  t        j$                  |k\        j                         }|j                  t              j'                  t        j(                  t+        j                  t        j,                        j/                  d            j1                  t        j(                        j3                  t5        d            j7                  d      j9                         }||||d	||	|
|d
|D cg c]
  \  }}||d c}}dS c c}}w w)z$Get summary statistics for dashboardr(   openr   )datetime	timedelta   )days	app_count   )total_projectsr.   total_candidatesactive_projects)new	in_reviewadmittedrecent_applications_7_days)r>   application_count)rU   rX   top_projects)r6   r2   r   r   r3   r7   r4   r8   r,   r   r:   r   NEW	IN_REVIEWADMITTEDr_   r`   utcnowr@   r9   r>   r   r   labelr;   r?   r	   rA   r<   )r    r!   projects_queryapplications_queryre   r.   rf   rg   new_applicationsri   rj   r_   r`   recent_dater1   rm   r>   r,   s                     rE   get_dashboard_summaryrw      sw     G#'*XXk2'*11'2B2Bloo2UVXXk277@GGHXHX\h\k\kHkl $))+N+113xx	*002 %++GNNf,DEKKMO *001C1CGXG\G\1\]cce"))+*<*<@Q@[@[*[\bbdI!((););?P?Y?Y)YZ``bH -//#iQ&77K 	!!+"8"8K"GHNNP  	K(	w}}djj1G1G&H&N&N{&[	\	'--	 	${#	$	q	  -"4 0.	
 $" *=	
 !-
u %8
 
s   LL.L(
"L.z#/candidate-analytics/{candidate_id}rS   c                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  t              j                  t        j                  | k(        j                         }|j                  t              j                  t        j                  | k(        j                  t        t        j                              j                         }t        |      }|rt        d |D              t        |      z  nd}i }|D ]0  }	|	j                  j                   }
|j#                  |
d      dz   ||
<   2 |||dt        |      t%        |d      |d	d
 ddS w)z/Get detailed analytics for a specific candidater#   zCandidate not foundr%   c              3   N   K   | ]  }|j                   s|j                     y w)N)rI   ).0as     rE   	<genexpr>z*get_candidate_analytics.<locals>.<genexpr>   s     <AGGAGG<s   %%r      )totalstatus_distribution   N   )r,   average_scorelatest_assessments)rH   rX   ai_assessments)r2   r   r3   r4   r5   r   r   rS   r<   r   r?   r	   rT   lensumr:   r=   getround)rS   r    r!   rH   rX   assessmentsr.   	avg_scoreapplication_status_distributionrY   r:   s              rE   get_candidate_analyticsr      se     #**9<<<+GHNNPI4IJJ 88K(//0H0HL0XY]]_L 		))\9	:	$|001	2		  \*S^<[<<s;?OOdeI&(# e!!2Q2U2UV\^_2`cd2d'/e
 '#B

 %"9a0"-bq/
 s   FF)*fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr   r	   typingr
   r   r   r   app.core.databaser   
app.modelsr   r   r   r   r   r   app.schemas.reportsr   r   r   app.schemas.candidater   app.schemas.projectr   app.services.authr   routerr   strintrF   r\   rw   r    rO   rE   <module>r      s|   < < " ! , , $ ] ]  4 / 5	*I;	7 c3h@ %d&/ !89;;; ; A;z .?WX &/ !89444 4 Y4l  !&/ !89=== "=~ 12 &/ !89))) ) 3)rO   