
    ŻfuI                     >   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZmZmZmZmZ d dlmZ  e         ej*                  d      Zd Z e       Zd	 Zd
 Zd Zd Zd Zd Zd Zd Z d Z!d Z"d dddddddZ#d Z$ddZ%d Z&d Z'd Z(y)     N)HTTPException)JSONResponse)uuid4)DeviceNotRegisteredError
PushClientPushMessagePushServerErrorPushTicketError)load_dotenvMONGODB_DATABASEc                     t        j                  d      } t        j                  d      }t        j                  d      }t        j                  d      }t        j                  d      }t        j                  | t	        |      |||      }|S )NMONGODB_HOSTMONGODB_PORTr   MONGODB_USERMONGODB_PASSWORD)hostport
authSourceusernamepassword)osgetenvpymongoMongoClientint)mongodb_hostmongodb_portmongodb_databasemongodb_usermongodb_passwordmongodb_clients         GC:\Users\ChattiNader\Documents\EpsilonGroupe\api-vastappli\app\utils.pymongodb_connectr#      sz    99^,L99^,Lyy!3499^,Lyy!34(( #!N     c                 ^    t        j                  | t        j                  d      dg      }|S )N
JWT_SECRETHS256)
algorithms)jwtdecoder   r   )
auth_tokenpayloads     r"   decode_auth_tokenr-   )   s$    jjRYY|%<'SGNr$   c                     t        |       }t        t           d   j                  d|iddd      }|st	        dddd	
      S y)Nuserssubr      )_idr0   errorz Erreur. Utilisateur n'existe passtatusmessagei  contentstatus_codeT)get_user_subr!   r   find_oner   )r+   r0   results      r"   
user_existr=   .   sQ    
z
"C,-g6??	a*F wCe$ftwxxr$   c                    | s"t        j                  d       t        dd      t        |       syt	        |       ryd|v ryt        |       }t        t           d   j                  d	|i      }|d
   D ]  }||v s y t        dd      )Nznot authorized  zNNot Authorized. You must provide a token. You must log in to generate a token.)r9   detailFT*r/   r0   rolesi  z1Forbidden. You don't have access to this resource)	loggingwarningr   r=   is_rootr:   r!   r   r;   )r+   admited_rolesuser_subuserroles        r"   check_accessrJ   9   s    ()  5E  F  	Fj!z
mJ'H*+G4==uh>OPDW =  C0c
ddr$   c                    | s%t        j                  d       t        dddd      S 	 t        |       }|d   }|S # t        j
                  j                  $ r#}t        dt        |      dd      cY d }~S d }~wt        j                  $ r t        dddd      cY S t        j                  $ r t        dd	dd      cY S w xY w)
N   Accès non autoriséfailedd   Accès non autorisé. Vous devez fournir un jeton. Vous devez vous connecter pour générer un tokenr4   r?   r7   r0   3   Accès non autorisé. Erreur de signature expirée./   Accès non autorisé. Erreur de jeton invalide.)
rC   rD   r   r-   r)   
exceptionsDecodeErrorstrExpiredSignatureErrorInvalidTokenError)r+   r,   rG   errs       r"   r:   r:   L   s    ./x  Ek  %l  z}  ~  	~	I#J/5>>>%% `xCH$M[^__$$ MxDy$z  IL  M  	M   IxDu$v  EH  I  	IIs'   ; CA60C6&C"CCc                    | s%t        j                  d       t        dddd      S 	 t        |       }|d   }t        t
           d   j                  d|i      }|sy	|d
   }d|v S # t        j                  j                  $ r#}t        dt        |      dd      cY d }~S d }~wt        j                  $ r t        dddd      cY S t        j                  $ r t        dddd      cY S w xY w)NrL   rM   rN   r4   r?   r7   r0   r/   FrB   rootrO   rP   rC   rD   r   r-   r!   r   r;   r)   rQ   rR   rS   rT   rU   r+   r,   rG   rH   rB   rV   s         r"   rE   rE   ]   s   ./x  Ek  %l  z}  ~  	~I#J/5>./8AAHW>>%% `xCH$M[^__$$ MxDy$z  IL  M  	M   IxDu$v  EH  I  	IIs/   3A& A& &C.B!C.!&C.	"C.-C.c                 J   | s%t        j                  d       t        dddd      S 	 t        |       }|d   }t        t
           d   j                  d|i      }|d	   }i }|D ]2  }t        t
           d	   j                  d
|i      }|d   D ]  }d||<   	 4 |S # t        j                  j                  $ r#}	t        dt        |	      dd      cY d }	~	S d }	~	wt        j                  $ r t        dddd      cY S t        j                  $ r t        dddd      cY S w xY w)NrL   rM   rN   r4   r?   r7   r0   r/   rB   namepermissionsr1   rO   rP   rY   )
r+   r,   rG   rH   rB   perms	role_namerI   permrV   s
             r"   	get_permsra   r   sf   ./x  Ek  %l  z}  ~  	~I#J/5>./8AAHW 	 I!"23G<EE#D ]+  d 		  >>%% `xCH$M[^__$$ MxDy$z  IL  M  	M   IxDu$v  EH  I  	IIs*   A0B D"7CD"&D"="D"!D"c                    t         j                   j                         t        j                  d|      z   t         j                   j                         | d}t        j                  |t        j                  d      d      S )Nr   )daysseconds)expiatr0   r&   r'   )	algorithm)datetimeutcnow	timedeltar)   encoder   r   )user_idexpired_in_secondsr,   s      r"   encode_auth_tokenrn      sl      '')


!-?
@A  '')	G ::
		, r$   c                    | s%t        j                  d       t        dddd      S 	 t        |       }|d   }t        t
           d   j                  d|i      }|d	   }|S # t        j                  j                  $ r#}t        dt        |      dd      cY d }~S d }~wt        j                  $ r t        dd
dd      cY S t        j                  $ r t        dddd      cY S w xY w)NrL   rM   rN   r4   r?   r7   r0   r/   rB   rO   rP   rY   rZ   s         r"   	get_rolesrp      s   ./x  Ek  %l  z}  ~  	~I#J/5>./8AAHW>>%% `xCH$M[^__$$ MxDy$z  IL  M  	M   IxDu$v  EH  I  	IIs)   7A! !C)>BC)&C)"C)(C)c                 d    t        |       }t        t           d   j                  d|i      }|d   S )Nr/   r0   sector)r:   r!   r   r;   )r+   rG   rH   s      r"   
get_sectorrs      s6    J'H*+G4==uh>OPD>r$   c                      t        |       }d|v S )Nadmin)rp   )r+   rB   s     r"   is_adminrv      s    j!Eer$   r1                  LunMarMerJeuVenSamDimc                 
  &' g }| d   }|d   }|d   }t        |d         }|d   }t        j                  j                         }	|	t        j                  d      z   }
|D ]F  }t        |d         }t        |d	         }|d
   }|	j
                  }|dz   }||fD ]	  }t        j                  ||dz   d      }||	k  r$||
kD  r e|j                  t        j                  ||dz         d         }t        ||
      }|dk(  r|D cg c]A  }|t        j                  j                  |d   d      j                         cxk  r|k  rn n|C }}t        d|t        |      z
        }g }t        |      D ]  }t        d      D cg c]I  }|||z   D cg c]3  }t        j                  j                  |d   d      j                         5 c}vsH|K }}}t        |||||      't!        'fd|D              r]|D cg c]  }|'j                         k7  s| }}|st#        t        d            }t        |||||      't!        'fd|D              r]|j%                  t'        '||d   | d                 |j)                  |       |dk(  rt        j*                  ||dz         }|D ]}  }t        j                  ||dz   |d   xs d      }t        j                  ||dz   |d   xs |j,                        } |D cg c]A  }|t        j                  j                  |d   d      j                         cxk  r| k  rn n|C }!}t        d|t        |!      z
        }g }"t        |      D ]  }t        d      D cg c]I  }||!|"z   D cg c]3  }t        j                  j                  |d   d      j                         5 c}vsH|K }}}|st#        t        d            }t        || |||      '|"j%                  t'        '||d   | d                 |j)                  |"        |dk(  s|}#|#|k  st        |      D ]3  }t        |#|#||      '|j%                  t'        '||d   | d                5 |#t        j                  d      z  }#|#|k  r` I |j/                  d        g }$|D ](  &t!        &fd|$D              r|$j%                  &       * t1        d |D              }%|$D cg c]  }|d   |d   f|%vs| }$}|$S c c}w c c}w c c}}w c c}w c c}w c c}w c c}}w c c}w )Nmaintenance_inforc   hourduration	frequencyi  rc   month
reccurenceperiodr1   daydate%Y-%m-%dr      c              3   L   K   | ]  }|d    j                  d      k(    yw)r   r   N)strftime).0iintervention_dates     r"   	<genexpr>z4generate_interventions_for_client.<locals>.<genexpr>   s'     oVWai+<+E+Ej+QQos   !$r0   rG   weekr{   r   c                     | d   | d   fS )Nr   r    xs    r"   <lambda>z3generate_interventions_for_client.<locals>.<lambda>  s    ai6%; r$   keyc              3   N   K   | ]  }|d    d    k(  xr |d   d   k(    ywr   r   Nr   )r   r   interventions     r"   r   z4generate_interventions_for_client.<locals>.<genexpr>  s7     y_`1V9V 44Z6lSYFZ9ZZys   "%c              3   0   K   | ]  }|d    |d   f  ywr   r   )r   es     r"   r   z4generate_interventions_for_client.<locals>.<genexpr>  s     %]qy!F)&<%]s   )r   rh   r   todayrj   yearreplacecalendar
monthrangeminstrptimemaxlenrangeweekdaygenerate_intervention_dateanylistappendcreate_interventionextendmonthcalendarr   sortset)(clientpoolexisting_interventionsinterventionsr   preferred_dayspreferred_hourr   r   r   end_date
month_infor   
recurrencer   current_year	next_yearr   month_start	month_endr   existing_month_interventionsinterventions_neededmonth_interventions_r   r   available_daysdweeksr   
week_startweek_endexisting_week_interventionsweek_interventionscurrent_dateunique_interventionsexisting_intervention_datesr   r   s(                                         @@r"   !generate_interventions_for_clientr      s   M01%f-N%f-N#J/0H -IMM!Ex))u55H Q?
Jw'(L12
H%zz 1$	!9- I	?D"--eai;KU"X%#++0C0CD%RS)0TUV0W+XIIx0I   60"h&7&7&@&@6J&W&\&\&^kbkk 0, 0 (+1j3?[;\.\']$&(#34 BA5:1X &c!=@S!SM !))221V9jIQQSM Bc &N & )C;PY[iky  |J  )K% o[noo5C)hqL]LeLeLgGg!)h)h--1%(^N,F{T]_mo}  @N  -O)	 o[noo (../BCTV^`dej`kmst~m  0A  BB  $$%896! ..tUQY?! =D!)tUQYQ1!MJ'}}T519d1g>VWH $:3%):):)C)CAfIz)Z)_)_)amemm 3/ 3 ,/q*sC^?_2_+`()+&"#78 E9>q *#S%@CU%UQ ! %--66qy*MUUWQ F# * *  .-1%(^N,FzS[]km{  ~L  -M)*112EFWYacghmcnpv  xB  qC  3D  EE "(();<1=4 5*"i/":. @,F|Uacq  tB  -C)%,,-@ART\^bch^ikqr|k}-~@ !H$6$6A$>>L	 #i/KI	?Q?h ;<% 6ydxyy ''56
 #&%]F\%]"]';y!&	1V9?U]x?xAyyU0M & *i 3Q *8 zsb   ATT&8T!T&T&>T,
T,
AT1
T;8T6T;T;UU!T&6T;c                    dddddddd}|D cg c]  }||   	 }}t        || z
  j                  dz         D cg c]  }| t        j                  |	      z    }	}|"|	D 
cg c]  }
|
j	                         |v s|
 }	}
|D ]k  }|	D 
cg c]  }
|
j	                         |k(  s|
 }}
|s)|d   }t        j                  j                  |t        j                  j                  |            c S  t        d
      D ]s  }|||v s|	D 
cg c]  }
|
j	                         |k(  s|
 }}
|s1|d   }t        j                  j                  |t        j                  j                  |            c S  |	r|	d   }n| }t        j                  j                  |t        j                  j                  |            S c c}w c c}w c c}
w c c}
w c c}
w )Nr   r1   rw   rx   ry   rz   r{   r|   r   r   )r   rc   rh   rj   r   combinetimefromisoformat)
start_dater   r   r   r   days_mapr   preferred_weekdaysr   available_datesr   r   possible_dateschosen_dates                 r"   r   r   $  s   1QqSTUH3ABC(3-BBHMxZdOdNjNjmnNnHop1zH$6$6A$>>pOp!,;`Dt||~Q_?_4`` & g+:X4dllnPW>W$XX(+K$$,,[(--:U:UVd:eff	g 8 k%'^*C/>\t$,,.T[B[d\N\,Q/((00hmm>Y>YZh>ijjk %a( $$[(--2M2Mn2]^^7 Cp` Y ]s.   F8 F="G:G	G"G
G#Gc                     t        t                     | j                  d      | j                  d      t        |      ||dS )Nr   z%H:%M)r0   r   r   r   pool_subrG   )rS   r   r   )r   r   r   rG   s       r"   r   r   C  s>    57|!**:6!**73M r$   c                    | D cg c]  }|d   	 }}|D ]  }t        t        t           d   j                  d|iddd            }|D ]0  }|d   }	 t	               j                  t        |||dd	i
            }	2 t        t                     |||t        t        j                  j                               dd}t        t           d   j                  |        y c c}w # t        $ r!}
t        dt        |
              Y d }
~
d }
~
ww xY w)Nr0   push_tokensrG   r   r1   )r2   tokenr   typeanomaly_created)totitlebodydatazError: sent)r0   rG   r   r6   sent_atr5   notifications)r   r!   r   findr   publishr   	ExceptionprintrS   r   rh   now
insert_one)	user_subsr   r6   rH   r/   rG   tokens	token_docr   responser   notification_datas               r"   send_push_notificationr   M  s'   %./TT%[/E/ Xn%56}EJJ""
    
	*Ig&E*%<//5&+%,&,.?%@B
	* uw< 8,,0023
 	'(9DDEVW3X 0  *Ax())*s   C(C!!	D*DDc           	         t        |d         }t        |d         }|d   }t        j                  ||dz   d      }|j                  t	        j
                  ||dz         d         }| D cg c]A  }|t        j                  j                  |d   d      j                         cxk  r|k  rn n|C }	}|dk(  rt        |	d 	      d | }
np|d
k(  rt	        j                  ||dz         }g }
|D ]  }t        j                  ||dz   |d   xs d      }t        j                  ||dz   |d   xs |j                        }|	D cg c]A  }|t        j                  j                  |d   d      j                         cxk  r|k  rn n|C }}|
j                  t        |d 	      d |         n|dk(  rg }
|}||k  r|	D cg c]8  }t        j                  j                  |d   d      j                         |k(  r|: }}|
j                  t        |d 	      d |        |t        j                  d      z  }||k  r|	D cg c]  }|
vrd|vr| }}|S c c}w c c}w c c}w c c}w )Nr   r   r   r1   r   r   r   c                     | d   S Nr   r   r   s    r"   r   z1process_interventions_by_period.<locals>.<lambda>{  s
    1V9 r$   r   r   r   r{   c                     | d   S r   r   r   s    r"   r   z1process_interventions_by_period.<locals>.<lambda>  s    RSTZR[ r$   r   c                     | d   S )Nr   r   r   s    r"   r   z1process_interventions_by_period.<locals>.<lambda>  s    QRSYQZ r$   r   state)r   rh   r   r   r   r   r   sortedr   r   r   rj   )r   r   r   r   r   r   r   r   r   period_interventionsinterventions_to_keepr   r   r   r   r   r   day_interventionsinterventions_to_removes                      r"   process_interventions_by_periodr  j  s   
7#$EZ-.J!F --eai;K##(;(;L%RS)(TUV(W#XI *(++44QvY
KPPR_V__ 	
 
  &';AT UVaWa b	6	&&|UQY? " 	kD!|UQYQ1MJ}}\519d1g>VWH/"!2!2!;!;AfIz!R!W!W!Ye]ee " " "((0BH[)\]h^h)ij	k 
5 ""i'/!$$--aiDIIK|[ ! ! "((0AGZ)[\g]g)hiH..A66L i' ())gQ.> 	
 
 #"M"!s   ,AIAI>=I I$)N))r   r   fastapir   fastapi.responsesr   r   r)   rC   rh   randomuuidr   exponent_server_sdkr   r   r   r	   r
   dotenvr   r   r   r#   r!   r-   r=   rJ   r:   rE   ra   rn   rp   rs   rv   r   r   r   r   r   r  r   r$   r"   <module>r     s     	 ! *  
     s s  299/0 $ !"
e&I"I*I4I$

 Qq1Qqi V_>X:0#r$   