o
    Uhu>                     @   s   U d dl m Z mZ d dlmZ d dlmZmZ d dlmZ d dl	Z
d dlm  m  mZ d dlmZ d dlmZmZ d dlmZ d d	l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Z!e"ed df e#d< G dd dZ$dS )    )datetime	timedelta)Literal)HTTPException
UploadFile)OAuth2PasswordRequestFormN)Session)
JWTManagerJWTPayloadSchema)Messages)TblGroup)StudentBase
TblStudent)generate_secure_password)
send_email)CustomResponse)studentadmin
superadmin.VALID_ROLESc                   @   s   e Zd ZdedefddZdejfddZde	fd	d
Z
de	fddZde	fddZdejfddZededefddZdd ZdefddZdefddZdd ZdS )StudentServicedbtokenc                 C   s   || _ || _d S N)r   r   )selfr   r    r   2/var/www/html/RetailAPI/app/api/student/service.py__init__   s   
zStudentService.__init__requestc                    s2   t |}t|| j | j  tdtjdS )N1statusmessage)	r   model_validater   creater   commitr   r   STUDENT_CREAT)r   r   created_studentr   r   r   create_student   s
   

zStudentService.create_student
student_idc                    s   t || j}tj|S r   )r   	get_by_idr   schemasStudentResponser#   r   r)   r   r   r   r   get_student   s   zStudentService.get_studentc                    s2   t || j}|stdtjdtjj|ddS N  status_codedetailT)from_attributes)	r   r*   r   r   r   STUDENT_NOT_FOUNDr+   r,   r#   r-   r   r   r   get_student_get#   s
   zStudentService.get_student_getc                    sH   t || j}|stdtjd|jstdtjdtj	j
|jddS r/   )r   r*   r   r   r   r5   groupGROUP_NOT_ASSIGNEDr+   GroupResponser#   r-   r   r   r   get_student_group)   s   z StudentService.get_student_groupc                    sN   t |}|jd u rtdtjdS t|j|| j | j	  tdtj
dS )N-1r    r   )r   r#   r)   r   r   SEGMENT_NOT_FOUNDr   updater   r%   STUDENT_UPDATE)r   r   updated_studentr   r   r   update_student1   s   


zStudentService.update_studentcredentialsc                    s   | ttj| jk }|stdtjd| j	|j	kr%tdtj
d|jrL| ttj|jktjdktj|jk }|rLtdd|j ddd|_|  t|jddt td	d
 d}t|}|jro|jjnd }|d|jd|j|dS )Nr0   r1   i  r   i  z	Student 'z'' from your group is already logged in.r      )minutes)r)   	user_type	user_roleexpbearer)access_token
token_typeemail_idroler)   group_id)queryr   filterstudent_emailusernamefirstr   r   r5   passwordINCORRECT_PASSWORD
group_codelogin_statusr)   
first_namer%   r
   r   utcnowr   r	   create_access_tokenr7   rL   )rA   r   r   activepayloadrH   rL   r   r   r   student_login9   sH   



zStudentService.student_loginc                 C   s   | j jd u rtdtjd| jttj| j jk	 }|s&tdtj
d|jdkr2tdtjdd|_| j  tdtjdS )Ni  r1   r0   r   i  0r    )r   r)   r   r   STUDENT_ID_REQUIEDr   rM   r   rN   rQ   CATCHMENT_NOT_FOUNDrU   STUDENT_NOT_LOGINr%   r   STUDENT_LOGOUT)r   r   r   r   r   student_logout_   s    

zStudentService.student_logoutfilec              
      s\  z|j d tj|j dd d}g d}d }| D ]\}}dd |D }||kr/|} nq|d u rBdd||d	j d
W S |j d tj|j d|d}|jj	
 j	 j	dd|_|t|d }d|jv rv|jdgdd i }| D ]\}	}|d}
|
r||
g | q|g }g }| D ]\}
}|d }t|}| jtj|
d }|s|d rt|d n|}t|
|d |d |d ||dd}| j| | j  | j| nj|jpd}||k r|d|
 d| d| d q||kr|| }|d|
 d| d| d d}|jr!|jdkr&||_d}d D ]}||rDt|||| krDt ||||  d}q(|rN| j  |D ]-}| jt!j|d! d" rcqPt" }t!|d# |d$ |d! |d%|
d&}| j| qPq| j  |rd'd(||d)W S d*d+|d,W S  t#y } zt$d-d.t	| d/d }~ww )0Nr   openpyxl)engineheader)	rV   	last_namerO   rT   simulation_code
group_namegroup_emailnumber_of_memberscategory_assignedc                 S   s$   g | ]}t |  d dqS ) _)strstriplowerreplace).0colr   r   r   
<listcomp>x   s   $ z=StudentService.upload_students_from_excel.<locals>.<listcomp>r;   z&Missing required headers in Excel file   )r!   errorexpected_headerssample_rowsrl   rm   rR   T)columnsinplacerT   )rT   rj   rg   rh   ri   rk   )rT   rg   rh   ri   rj   rk   zGroup z: You can only add z  students, but you tried to add .z: You added z students, but z spots are still available.F)rh   ri   rg   rk   rO   rO   rV   rf   r   )rV   rf   rO   rR   rK   rT   r\   zMSome groups were not uploaded due to exceeding the allowed number of members.)r!   r"   errorswarningsr   zUpload successful)r!   r"   r~     zUpload failed: r1   )%rb   seekpd
read_exceliterrowsheadvaluestolistry   rn   ro   rp   rq   wherenotnulldropget
setdefaultappenditemslenr   rM   r   	filter_byrQ   intaddr%   refreshrj   getattrsetattrr   r   	Exceptionr   )r   rb   dfrw   header_row_indexirow
normalizedgroup_student_maprm   rT   error_messageswarning_messagesstudentsrQ   student_countr7   rj   	remainingupdatedfieldpassword_plainr   er   r   r   upload_students_from_excelk   s   




 

z)StudentService.upload_students_from_excelrO   c                 C   sj   | j tj|d }|stdddd}d|j d|j d}t|||d	}|s0td
dddddS )Nr|   r0   zStudent not foundr1   Your Student Portal PasswordHello ,

Your password is: 

Please keep it secure.tosubjectbodyr   zFailed to send emailr   zPassword sent to emailr    )	r   rM   r   r   rQ   r   rV   rR   r   )r   rO   r   r   r   successr   r   r   send_password_to_email   s   
z%StudentService.send_password_to_emailc                 C   s   | j t }|stdddg }|D ]}d}d|j d|j d}t|j||d}|s3|	|j q|r<d	d
|dS dddS )Nr0   zNo students foundr1   r   r   r   r   r   r\   zSome emails failed to send)r!   r"   failed_emailsr   z$Passwords sent to all student emailsr    )
r   rM   r   allr   rV   rR   r   rO   r   )r   r   failuresr   r   r   r   r   r   r   send_passwords_to_all_students   s"   
z-StudentService.send_passwords_to_all_studentsN)__name__
__module____qualname__r   r
   r   r+   StudentCreater(   r   r.   r6   r:   StudentUpdater@   staticmethodr   r[   ra   r   r   rn   r   r   r   r   r   r   r      s    %}r   )%r   r   typingr   fastapir   r   fastapi.securityr   pandasr   app.api.student.schemasapir   r+   sqlalchemy.ormr   app.dependency.authanticationr	   r
   app.locale.messagesr   app.models.main.groupr   app.models.main.studentr   r   app.utils.common_utilsr   app.utils.emailr   app.utils.schemas_utilsr   r   tuple__annotations__r   r   r   r   r   <module>   s     