
    ui?                     J   S SK JrJr  S SKJr  S SKJrJr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JrJrJr  \" S/S	S
9rS\S\S\\   4S jrS7S\S\\\      S\\   4S jjrS\S\S\\   4S jrS\S\\\4   4S jrS\S\S\S\4S jrS\S\4S jr  S8S\S\S\S\S\S\\   S\\   S\4S jjr S\S\4S jr!S \\\4   S\4S! jr"S\S\S\S\4S" jr#S\S\S\4S# jr$S\S\S\4S$ jr%S\S\S\4S% jr&S\S\S\4S& jr'S\S\S\4S' jr(S\S\S\4S( jr)S\S\S\4S) jr*S\S\\   4S* jr+S\S\\\\4      4S+ jr,S\S\S\4S, jr-S\S\S\\\\4      4S- jr.S9S\S.\S/\S0\\   S\\\4   4
S1 jjr/S\S\S\S\S\4
S2 jr0S\S\S3\S\4S4 jr1S\S\S5\S\4S6 jr2g):    )Session
joinedload)func)OptionalDictAny)datetime)CryptContext   )UserUserProfile
UserSports
UserHealthUserConsentUserGuardiansUserMarketingUserFinancebcryptauto)schemes
deprecateddbemailreturnc                 D   U R                  [        5      R                  [        [        R                  5      [        [        R
                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      5      R                  [        R                  " [        R                  5      [        R                  " U5      :H  5      R                  5       $ )zf
Get user by email with all related data loaded.
Returns User object with eager-loaded relationships.
)queryr   optionsr   profilesportshealthconsent	guardians	marketingfinancefilterr   lowerr   first)r   r   s     ;/home/mario/Escritorio/thel4footbal/app/models/auth_crud.pyget_user_by_emailr)      s    
 88D>!!4<< 4;;4;;4<< 4>>"4>>"4<<  fTZZ

#tzz%'889%%'B    Nrolesc                    U R                  [        5      R                  [        [        R                  5      [        [        R
                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      5      nU(       a`  UR                  [        R                  " [        R                  5      R                  U Vs/ s H  o3R                  5       PM     sn5      5      nUR!                  [        R"                  R%                  5       5      R'                  5       $ s  snf )zL
Get all users, optionally filtered by roles.
Eager loads all related data.
)r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r   r&   rolein_order_byiddescall)r   r+   r   rs       r(   get_all_usersr4       s    
 HHTN""4<< 4;;4;;4<< 4>>"4>>"4<< E TZZ		26657Q5a	57QRS>>$'',,.)--// 8Rs   E.user_idc                    U R                  [        5      R                  [        [        R                  5      [        [        R
                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      [        [        R                  5      5      R                  [        R                  U:H  5      R                  5       $ )zc
Get user by ID with all related data loaded.
Returns User object with eager-loaded relationships.
)r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r0   r'   r   r5   s     r(   get_user_by_idr8   6   s    
 88D>!!4<< 4;;4;;4<< 4>>"4>>"4<<  fTWW )r*   userc                    U (       d  g0 SU R                   _SU R                  _SU R                  _SU R                  _SU R                  _SU R
                  _S[        U R                  5      _S	[        U S	5      (       a  [        U R                  5      OS
_SU R                  _SU R                  _SU R                  (       a  U R                  R                  OS_SU R                  (       a  U R                  R                  OS_SU R                  (       a  U R                  R                  OS_SU R                  (       a  U R                  R                   OS_SU R                  (       a  U R                  R"                  OS_SU R$                  (       a  U R$                  R&                  OS_SU R$                  (       a  U R$                  R(                  OS_0 SU R$                  (       a  U R$                  R*                  OS_SU R$                  (       a  U R$                  R,                  OS_SU R$                  (       a  U R$                  R.                  OS_SU R$                  (       a  U R$                  R0                  OS_SU R$                  (       a  U R$                  R2                  OS_SU R$                  (       a  U R$                  R4                  OS_SU R6                  (       a  U R6                  R8                  OS_SU R6                  (       a  U R6                  R:                  OS_SU R6                  (       a  U R6                  R<                  OS_SU R6                  (       a  U R6                  R>                  OS_SU R6                  (       a  U R6                  R@                  OS_SU R6                  (       a  U R6                  RB                  OS_S U R6                  (       a  U R6                  RD                  OS_S!U RF                  (       a  U RF                  RH                  OS_S"U RF                  (       a  U RF                  RJ                  OS_S#U RF                  (       a  U RF                  RL                  OS_S$U RF                  (       a  U RF                  RN                  OS_EU RF                  (       a  U RF                  RP                  OSU RR                  (       a  U RR                  RT                  OSU RR                  (       a  U RR                  RV                  OSU RR                  (       a  U RR                  RX                  OSU RR                  (       a  U RR                  RZ                  OSU R\                  (       a  U R\                  R^                  OSU R\                  (       a  U R\                  R`                  OSU R\                  (       a  U R\                  Rb                  OSU R\                  (       a  U R\                  Rd                  OSU Rf                  (       a  U Rf                  Rh                  OS%[k        [m        U Rf                  (       a  U Rf                  Rh                  OS%S&-  5      5      S'.EnU$ )(z
Convert User ORM object to dictionary matching the old sqlite3.Row format.
This ensures backward compatibility with existing code that expects dict-like access.
Nr0   namer   password_hash
created_atr-   is_mvp90is_temporaryF
first_name	last_namephoneavatarcitydni
birth_dateteamcategorypositiondominant_foot	strengths
weaknessesinjury_historytraining_typephysical_workphysical_work_detailssmokingalcoholrecovery
chest_pain
discomfortwhatsapp_contentvideo_permissionprivacy_acceptancedata_confirmation        d   )	agreement
occupationstudy_placeparent_nameparent_emailfound_us	enjoymentnerves_confidenceadditional_commentsmatricula_eurmatricula_cents)7r0   r;   r   r<   r=   r-   boolr>   hasattrr?   r@   rA   r   rB   rC   rD   rE   rF   r   rG   rH   rI   rJ   rK   rL   rM   rN   r    rO   rP   rQ   rR   rS   rT   rU   r!   rV   rW   rX   rY   r\   r"   r]   r^   r_   r`   r#   ra   rb   rc   rd   r$   re   intround)r9   results     r(   user_to_dictrl   F   s   
 =dgg= 			= 		=
 	++= 	doo= 			= 	D'= 	743P3PT../V[= 	doo= 	T^^= 	t||##= 	$,,%%4=  	T\\!!t!=" 	4<<t||T#=$ 	dll--4%=* 	DKK  T+=, 	DKKDKK((T-=. 	DKKDKK((T/=0 	dkk22t1=2 	dkkT[[**t3=4 	dkk,,5=6 	$++447=8 	dkk22t9=> 	dkk22t?=@ 	 dkk!B!BW[A=B 	$++4;;&&4C=D 	$++4;;&&4E=F 	DKKDKK((TG=H 	dkk,,I=J 	dkk,,K=P 	T\\DLL99tQ=R 	T\\DLL99tS=T 	dll==SWU=V 	t||T\\;;QUW=X 04||T\\++ 48>>dnn//t59^^t~~1159^^t~~117;~~334 04~~DNN++415T^^--TAET^^==UYEI^^t~~AAY] 8<||33uDLLdll&@&@VY]`%`aby=F~ Mr*   valuec                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       a!  U(       a  SOSUl        U R                  5         gg)zToggle MVP-90 status for a user   r   TF)r   r   r%   r0   r'   r>   commit)r   r5   rm   r9   s       r(   set_user_mvp90rq      sI    88D>  G!34::<D"
		r*   c                 f   U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        US95        U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        US95        U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        US95        U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        US95        U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        US95        U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        US95        U R                  [        5      R                  [        R                  U:H  5      R	                  5       (       d  U R                  [        USS95        U R                  5         g)zc
Ensure all satellite tables have records for the user.
Creates empty records if they don't exist.
r5   rZ   r5   re   N)r   r   r%   r5   r'   addr   r   r   r   r   r   rp   r7   s     r(   _ensure_user_satellitesrv      s    88K ''(;(;w(FGMMOO
{7+, 88J&&z'9'9W'DEKKMM
z'*+ 88J&&z'9'9W'DEKKMM
z'*+ 88K ''(;(;w(FGMMOO
{7+, 88M"))-*?*?7*JKQQSS
}W-. 88M"))-*?*?7*JKQQSS
}W-. 88K ''(;(;w(FGMMOO
{7#>?IIKr*   r;   passwordr-   r@   rA   c           	      
   [         R                  U5      n[        UUR                  5       UUUUS9nU R	                  U5        U R                  5         U R                  U5        [        XR                  5        UR                  $ )zd
Create a new user with hashed password and initialize satellite tables.
Returns the new user's ID.
)r;   r   r<   r-   r@   rA   )	pwd_contexthashr   r&   ru   rp   refreshrv   r0   )	r   r;   r   rw   r-   r@   rA   r<   r9   s	            r(   create_userr|      so      $$X.Mkkm#D FF4LIIKJJt B(77Nr*   c                     U R                  [        5      R                  [        R                  S:H  5      R	                  5       $ )zCount number of admin usersadmin)r   r   r%   r-   countr   s    r(   count_adminsr      s-    88D>  g!56<<>>r*   	user_dictc                 >    [        U R                  SS5      5      S:H  $ )z!Check if user dict has admin roler-    r~   )strget)r   s    r(   is_adminr      s    y}}VR()W44r*   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       a  X#l        U R                  5         gg)zSet user's roleTF)r   r   r%   r0   r'   r-   rp   )r   r5   r-   r9   s       r(   set_user_roler      sC    88D>  G!34::<D	
		r*   c                 d   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        US9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user profile fieldsrs   T)
r   r   r%   r5   r'   ru   itemsrh   setattrrp   )r   r5   kwargsr   keyrm   s         r(   update_user_profiler          hh{#**;+>+>'+IJPPRGg.
wlln
7  U%6G%( % IIKr*   c                 d   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        US9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user sports fieldsrs   T)
r   r   r%   r5   r'   ru   r   rh   r   rp   )r   r5   r   r   r   rm   s         r(   update_user_sportsr          XXj!((););w)FGMMOFG,
vlln
6E$5F' % IIKr*   c                 d   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        US9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user health fieldsrs   T)
r   r   r%   r5   r'   ru   r   rh   r   rp   )r   r5   r   r    r   rm   s         r(   update_user_healthr   
  r   r*   c                 d   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        US9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user consent fieldsrs   T)
r   r   r%   r5   r'   ru   r   rh   r   rp   )r   r5   r   r!   r   rm   s         r(   update_user_consentr     r   r*   c                 d   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        US9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user guardians fieldsrs   T)
r   r   r%   r5   r'   ru   r   rh   r   rp   )r   r5   r   r"   r   rm   s         r(   update_user_guardiansr   (      '..}/D/D/OPVVXI!'2	
ylln
9""u'8IE* % IIKr*   c                 d   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        US9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user marketing fieldsrs   T)
r   r   r%   r5   r'   ru   r   rh   r   rp   )r   r5   r   r#   r   rm   s         r(   update_user_marketingr   7  r   r*   c                 f   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  [        USS9nU R                  U5        UR                  5        H(  u  pE[        X45      (       d  M  Uc  M  [        X4U5        M*     U R                  5         g)zUpdate user finance fieldsrZ   rt   T)
r   r   r%   r5   r'   ru   r   rh   r   rp   )r   r5   r   r$   r   rm   s         r(   update_user_financer   F  s    hh{#**;+>+>'+IJPPRGgSA
wlln
7  U%6G%( % IIKr*   c                     U R                  [        5      R                  [        R                  S:H  5      R	                  [        R
                  5      R                  5       $ )z Get all students ordered by namealumno)r   r   r%   r-   r/   r;   r2   r   s    r(   get_all_studentsr   X  s<    88D>  h!67@@KOOQQr*   c           	      b   U R                  [        5      R                  [        R                  S:H  5      R	                  [        R
                  5      R                  5       nU Vs/ s H=  nUR                  UR
                  UR                  UR                  UR                  S.PM?     sn$ s  snf )zGet all teachers as dictsdocente)r0   r;   r   r=   r-   )
r   r   r%   r-   r/   r;   r2   r0   r   r=   )r   teachersts      r(   get_teachersr   \  s    xx~$$TYY)%;<EEdiiPTTVH A ttQVVaggQ\\[\[a[ab  s   %AB,c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  gU R                  U5        U R                  5         g)zHDelete a user along with cascading deletes not handled by DB constraintsFT)r   r   r%   r0   r'   deleterp   r   r5   r9   s      r(   delete_userr   d  sK    88D>  G!34::<D
 IIdOIIKr*   c                 >    [        X5      nU(       d  g[        U5      $ )z{
Get full user details including all satellite tables for admin view.
Replaces the large raw SQL query in api_user_detail.
N)r8   rl   r   s      r(   get_user_with_satellitesr   q  s    
 "&Dr*   pageper_pagesearchc           
      X   U R                  [        [        R                  5      R	                  [        [        R
                  [        R                  :H  5      nU(       a  UR                  5       (       a  SUR                  5       R                  5        S3nUR                  [        R                  " [        R                  5      R                  U5      [        R                  " [        R                  5      R                  U5      -  5      nUR                  R                  [        R                   " 5       5      R#                  S5      nU R%                  U5      R'                  5       =(       d    SnUS-
  U-  nUR#                  [        R(                  R+                  5       [        R
                  R+                  5       5      R-                  U5      R/                  U5      R1                  5       n	/ n
U	 H|  u  pUR
                  UR                  UR                  UR2                  [5        UR6                  5      UR(                  U=(       d    SR                  5       S.nU
R9                  U5        M~     Xr-   S-
  U-  nUS:  nX:  nU
UUUUUUU(       a  US-
  OSU(       a  US-   OSS.S.$ )	zC
Get users for management view with pagination and search support.
%Nr   ro   r   )r0   r;   r   r-   r>   r=   rH   )r   r   totaltotal_pageshas_prevhas_next	prev_page	next_page)users
pagination)r   r   r   rH   	outerjoinr0   r5   stripr&   r%   r   r;   liker   	statementwith_only_columnsr   r/   executescalarr=   r1   offsetlimitr2   r-   rg   r>   append)r   r   r   r   r   search_termtotal_querytotal_countr   resultsr   r9   rH   u_dictr   r   r   s                    r(   get_users_for_managementr   |  s   
 HHT:../99DGGz111E
 &,,..&,,...013ZZ		"''4ZZ

#((57
 //33DJJLAJJ4PK**[)0027aK Qh("FnnT__113TWW\\^DKKFSYYZbcggiG E!''IIZZIIT]]+//!R..0
 	V " )A-(:KaxH!H   &  %-4%-4	
 r*   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  gX$l        X4l        U R                  5         g)z%Update core user fields (name, email)FT)r   r   r%   r0   r'   r;   r   rp   )r   r5   r;   r   r9   s        r(   update_user_corer     sH    88D>  G!34::<DIJIIKr*   r<   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  gX#l        U R                  5         g)zUpdate user passwordFT)r   r   r%   r0   r'   r<   rp   )r   r5   r<   r9   s       r(   update_passwordr     sD    88D>  G!34::<D&IIKr*   plain_passwordc                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       a+  [
        R                  U5      Ul        U R                  5         gg)z&Set user's password (hashing it first)TF)	r   r   r%   r0   r'   ry   rz   r<   rp   )r   r5   r   r9   s       r(   set_user_passwordr     sQ    88D>  G!34::<D(--n=
		r*   )N)r   NN)ro      N)3sqlalchemy.ormr   r   
sqlalchemyr   typingr   r   r   r	   passlib.contextr
   models.userr   r   r   r   r   r   r   r   ry   r   r)   listr4   ri   r8   rl   rg   rq   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r*   r(   <module>r      sj   .  & &  (   H:&AB' B# B(4. B 0g 0htCy&9 0T$Z 0,)w ) )$ ) Gt GS#X GRw  T d ! !# !H PXMQG 3 s c  $SM=Ec]VY6?W ? ?
5S#X 54 5
g  3 4 G c  7 S t 7 S t G c  g  $ g  $ G c  $R RT$Z RW d38n!5 G c d 	 	3 	8DcN;S 	8 8 83 8U]^aUb 8nrsvx{s{n| 8t 3 c # $  # c d ' C   r*   