U
    i#                     @   s   d dl mZ d dl mZmZmZmZmZmZ d dl	Z	d dl
mZ d dlmZ d dlZd dlmZ d dlmZ d dlmZmZ dd	d
ZdS )    )current_app)requestrender_templateredirecturl_forjsonifysessionNwraps)datetime)get_connection)send_activation_email)consultar_usersActualizar_ultimo_loginc                    sp    j ddgddd }  ddd }d	d
 }| _  d|dd } j ddgd fdd}tS )Nz/auth/loginPOST)methodsc               
   S   s  zt  } | s$tddddfW S | d}| d}| dd}|rL|s`tddddfW S t|}t|trt|d	kr|W S |}|d
 }|d }|d }|d }	|	dkrtddddfW S |dkrtddddfW S zt|	 }
t
|d|
d}|s"tddddfW W S t|}|s>td|  t  |td< |td< |rbdt_tddddW W S  tk
r } z*td|  tddddf W Y W S d}~X Y nX W nR tk
r } z2td|  tddt| ddf W Y S d}~X Y nX dS ) uh   
        Autenticación de usuarios.
        Verifica las credenciales contra la base de datos.
        FzNo se recibieron datos.successmessage  emailpasswordrememberu   Falta correo o contraseña.   UserIDZEmailZPasswordHashZStatusZACTIVOu?   Tu cuenta no está activa. Por favor, activa tu cuenta primero.i  Nug   Debes establecer tu contraseña primero. Verifica tu correo electrónico para el enlace de activación.zutf-8uF   Credenciales incorrectas. Por favor, verifica tu correo y contraseña.u?   Advertencia: No se pudo actualizar último login para usuario: user_idTu   Inicio de sesión exitoso.z/index)r   r   r   u    Error al verificar contraseña: u@   Error al verificar credenciales. Por favor, inténtalo de nuevo.  zError en login: u$   Error durante el inicio de sesión: )r   get_jsonr   getr   
isinstancetuplelenstrstripbcryptZcheckpwencoder   printr   clear	permanent	Exception)datar   r   r   result	user_datar   Zdb_emailZpassword_hashstatusZ
clean_hashZis_validZupdate_successe r/   XC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Security_Module\login.py
login_auth   s    

 zauth_routes.<locals>.login_authz/auth/logoutc                   S   s   t   ttdS )u0   
        Cierra la sesión del usuario.
        login)r   r'   r   r   r/   r/   r/   r0   logout_autht   s    z auth_routes.<locals>.logout_authc                    s   t   fdd}|S )Nc                     s   dt krttdS  | |S )Nr   r2   )r   r   r   )argskwargsfr/   r0   decorated_function~   s    z?auth_routes.<locals>.login_required.<locals>.decorated_functionr	   )r7   r8   r/   r6   r0   login_required}   s    z#auth_routes.<locals>.login_requiredz/profilec                   S   s   t dS )Nzprofile.html)r   r/   r/   r/   r0   profile   s    zauth_routes.<locals>.profilez/auth/reset-password-requestc                     s  zlt  } | r| ds.tddddfW S | d}d}t "}| }|||g | }|stdddW  5 Q R  W S |\}}}t |}	t	|	t
rJ|	\}
}zDt|
d	r|
 }n|
j}td|d
dd|fW W  5 Q R  W S  tk
rH } z6td|  tddddf W Y W  5 Q R  W S d}~X Y nX tdddW  5 Q R  W S Q R X W n\ tk
r } z<td|  ddl}t|  tddddf W Y S d}~X Y nX dS )u   
        Procesa la solicitud de recuperación de contraseña.
        Genera un token y envía un correo electrónico al usuario.
        r   Fu   Correo electrónico requeridor   r   zu
                SELECT UserID, Email, Status
                FROM Users
                WHERE Email = ?
            TuT   Si tu correo está registrado, recibirás un enlace para restablecer tu contraseña.r   errorz*Error al enviar correo de restablecimientoz&Error al procesar respuesta de error: r   Nub   Se ha enviado un enlace para restablecer tu contraseña. Por favor, revisa tu correo electrónico.z(Error en solicitud de restablecimiento: r   uA   Error al procesar la solicitud. Por favor, inténtalo más tarde.)r   r   r   r   r   cursorexecutefetchoner   r   r    hasattrjsonr)   r&   	traceback
format_exc)r*   r   Zcheck_queryconnr<   r,   r   Z
user_emailr-   token_resultjson_responsestatus_code
error_datar.   rA   appmailr/   r0   auth_request_password_reset   sf    





( z0auth_routes.<locals>.auth_request_password_reset)router9   auth_routes)rI   rJ   r1   r3   r9   r:   rK   r/   rH   r0   rM      s    
c
	MrM   )N)flaskr   rI   r   r   r   r   r   r   r$   	functoolsr
   r   ZjwtConsultas_SQL.conexionr    App.Security_Module.UserPasswordr   ZConsultas_SQL.Security.loginSQLr   r   rM   r/   r/   r/   r0   <module>   s    