o
    h                   
   @   s~  d dl m Z m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
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dl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 dl&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, d dl-Z-d dl.Z.d dl/m0Z0 e Z1e1j2ddde	ee	ej3fde+dede4fddZ5e1j6ddde	ee	ej3fde,dede4fddZ7e12d e	efd!eee	 f defd"d#Z8e1j2d$dde	ee	ej3fde)dede4fd%d&Z9e1j:d'dde	ee	ej3fdede4fd(d)Z;e1j6d*dde	ee	ej3fde*dede4fd+d,Z<e12d-e	efdefd.d/Z=e12d0e	efdefd1d2Z>e12d3e	efdefd4d5Z?e12d6e	efd7e@defd8d9ZAe0d:gd;d<ZBd=e@d>e@fd?d@ZCdAe@dBe@d>eDfdCdDZEe12dEe	efd7e@dFe@dGe@defdHdIZFdQdKeGd>e@fdLdMZHe12dNe	efd7e@defdOdPZIdS )R    )datetime	timedeltaN)	Annotated)	APIRouterDependsHTTPException)OAuth2PasswordRequestForm)Session)service)get_db)
JWTManager)TblAdmin)TblRole)TblSeafarers)TblSeafarerIdType)SeafarererRoleBaseTblSeafarerRole)
TblUserOTP)TblUsers)
send_email)CustomResponse   )SeafarerRoleCreateSeafarererRoleUpdate
UserCreate
UserUpdate)CryptContextz/authT)response_model_exclude_nonerequestdbtokenc                       t ||| I d H S N)r
   AuthServicecreate_userr   r   r     r&   //var/www/html/beacon-api/app/api/auth/router.pycreate_admin      r(   c                    r!   r"   )r
   r#   update_userr%   r&   r&   r'   update_admin"   r)   r+   z/user/logincredentialsc                    s   t j|i d| I d H S )N)r    )r
   r#   
user_login)r,   r   r&   r&   r'   
login_user&   s   r.   z/Seafarer-rolec                    r!   r"   )r
   r#   create_roler%   r&   r&   r'   r/   *   r)   r/   z/Seafarer-rolesc                    s   t | | I d H S r"   )r
   r#   get_all_roles)r   r    r&   r&   r'   r0   .   s   r0   z/Seafarer-role/{sf_role_id}c                    r!   r"   )r
   r#   update_roler%   r&   r&   r'   r1   2   r)   r1   z/load-roles-from-file/c              
   C      t d}| stdddt|d}t|}W d    n1 s$w   Y  |D ]}t|d |d d}| | q+z	| 	  W d
diS  t
y^ } z|   td	t|dd }~ww )Nzdata/roles.json  zroles.json not foundstatus_codedetailrrole_id	role_name)r8   r9     messagez1Roles loaded from JSON and inserted successfully.)pathlibPathexistsr   openjsonloadr   addcommit	Exceptionrollbackstrr   	file_pathfile
roles_dataroledb_roleer&   r&   r'   load_roles_from_file6   "   

rN   z/load-seafarer-roles-from-file/c              
   C   r2   )Nzdata/sf_roles.jsonr3   zsf_roles.json not foundr4   r7   
sf_role_idsf_role_name)rP   rQ   r:   r;   :Seafarer Roles loaded from JSON and inserted successfully.)r<   r=   r>   r   r?   r@   rA   r   rB   rC   rD   rE   rF   rG   r&   r&   r'   load_seafarer_roles_from_fileG   rO   rS   z!/load-seafarer-id-type-from-file/c              
   C   r2   )Nzdata/sf_id_type.jsonr3   zsf_id_type.json not foundr4   r7   id_type
sf_id_type)rT   rU   r:   r;   rR   )r<   r=   r>   r   r?   r@   rA   r   rB   rC   rD   rE   rF   rG   r&   r&   r'   load_seafarer_ID_type_from_fileX   rO   rV   z/forgot-passwordusernamec                    s   | ttj| k }|stdddS ttdd}t	
 tdd }t|j||d}|| |  t|jd	d
| d tdddS )N0User not foundstatusr;   i i?B 
   )minutes)usr_idotpexpiryzPassword Reset OTPzYour OTP is tosubjectbody1zOTP sent to your email)queryr   filter	user_namefirstr   rF   randomrandintr   utcnowr   r   r^   rB   rC   r   )rW   r   userr_   r`   user_otpr&   r&   r'   forgot_passwordj   s   
ro   bcryptauto)schemes
deprecatedpasswordreturnc                 C   s
   t | S r"   )pwd_contexthash)rt   r&   r&   r'   hash_passwordy   s   
rx   plain_passwordhashed_passwordc                 C   s   t | |S r"   )rv   verify)ry   rz   r&   r&   r'   verify_password|   s   r|   z/reset-passwordr_   new_passwordc                    s   | ttj| k }|stdddS | ttj|jktj|ktj	t
 k }|s6tdddS ||_|jdv rR| ttj|jk }|rQ||_n|jdkrj| ttj|jk }|rj||_|  tdddS )	NrX   rY   rZ   zInvalid or expired OTP   r            re   zPassword reset successfully)rf   r   rg   rh   ri   r   r   r^   r_   r`   r   rl   rt   r8   r   admin_id	entity_id	pass_wordr   seafarer_idrC   )rW   r_   r}   r   rm   	otp_entryadminseafarerr&   r&   r'   reset_password   s2   



r   r\   lengthc                    s(   t jt j  d fddt| D S )N c                 3   s    | ]}t  V  qd S r"   )secretschoice).0_charsr&   r'   	<genexpr>   s    z+generate_random_password.<locals>.<genexpr>)stringascii_lettersdigitsjoinrange)r   r&   r   r'   generate_random_password   s   r   z/forgot-password11c                    s   | ttj| k }|stdddS td}||_|jdv r=| t	t	j
|jk }|r9||_|j}n*|j}n&|jdkr`| ttj|jk }|r\||_|jpZ|j}n|j}n|j}|  t|dd| d	d
 tdddS )NrX   rY   rZ      r~   r   zYour New PasswordzCHello,

Your password has been reset automatically.

New Password: z*

Please log in and change it immediately.ra   re   z*A new password has been sent to your email)rf   r   rg   rh   ri   r   r   rt   r8   r   r   r   r   email_idr   r   emailrC   r   )rW   r   rm   r}   r   email_tor   r&   r&   r'   forgot_password1   s4   


r   )r\   )Jr   r   r@   r<   rj   typingr   fastapir   r   r   fastapi.securityr   sqlalchemy.ormr	   app.api.authr
   app.database.main.mysqlr   app.dependency.authanticationr   app.models.main.adminr   app.models.main.roler   app.models.main.seafarerr    app.models.main.seafarer_id_typer   app.models.main.seafarer_roler   r   app.models.main.user_otpr   app.models.main.usersr   app.utils.email_utilsr   app.utils.schemas_utilsr   schemasr   r   r   r   r   r   passlib.contextr   auth_routerpostverify_tokendictr(   putr+   r.   r/   getr0   r1   rN   rS   rV   rF   ro   rv   rx   boolr|   r   intr   r   r&   r&   r&   r'   <module>   sj    ((&($($ 