
    {i                     r    d Z ddlmZmZmZ ddlmZmZmZ ddlZddl	m
Z
 ddlmZ  G d d      Z e       Zy)	z)
JWT Token utilities for authentication.
    )datetime	timedeltatimezone)OptionalDictAnyN)EmailStr)settingsc                       e Zd ZdZeddeeef   dee	   defd       Z
eddeeef   dee	   defd       Zededeeeef      fd	       Zededefd
       Zededee   fd       Zededee   fd       Zy)
JWTManagerzJWT token management utility.Ndataexpires_deltareturnc                    | j                         }|r't        j                  t        j                        |z   }n>t        j                  t        j                        t        t        j                        z   }|j                  |t        j                  t        j                        d       t        j                  |t        j                  t        j                        }|S )z
        Create JWT access token.
        
        Args:
            data: Data to encode in the token
            expires_delta: Custom expiration time
            
        Returns:
            Encoded JWT token
        )minutes)expiat	algorithm)copyr   nowr   utcr   r
   jwt_expires_minutesupdatejwtencodejwt_secret_keyjwt_algorithmr   r   	to_encodeexpireencoded_jwts        P/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/core/utils/jwt.pycreate_access_tokenzJWTManager.create_access_token   s     IIK	\\(,,/-?F\\(,,/)HD`D`2aaFX\\0JKLjjH,C,CxOeOef    c                    | j                         }|r't        j                  t        j                        |z   }n>t        j                  t        j                        t        t        j                        z   }|j                  |t        j                  t        j                        dd       t        j                  |t        j                  t        j                        }|S )a	  
        Create JWT refresh token.
        
        Args:
            data: Data to encode in the token
            expires_delta: Custom expiration time (default from JWT_REFRESH_EXPIRES)
            
        Returns:
            Encoded JWT refresh token
        )daysrefresh)r   r   typer   )r   r   r   r   r   r   r
   jwt_refresh_expires_daysr   r   r   r   r   r   s        r#   create_refresh_tokenzJWTManager.create_refresh_token(   s     IIK	\\(,,/-?F\\(,,/)AbAb2ccFX\\0JT]^_jjH,C,CxOeOefr%   tokenc                     	 t        j                  | t        j                  t        j                  g      }|S # t         j
                  $ r Y yt         j                  $ r Y yw xY w)z
        Verify and decode JWT token.
        
        Args:
            token: JWT token to verify
            
        Returns:
            Decoded token data or None if invalid
        
algorithmsN)r   decoder
   r   r   ExpiredSignatureError
PyJWTErrorr,   payloads     r#   verify_tokenzJWTManager.verify_token@   sT    	jj(?(?XMcMcLdeGN(( 	~~ 		s   69 A#A#"A#c                 Z   	 t        j                  | t        j                  t        j                  g      }|j                  d      }|yt        j                  |t        j                        t        j                  t        j                        k  S # t         j                  $ r Y yw xY w)z
        Check if token is expired.
        
        Args:
            token: JWT token to check
            
        Returns:
            True if expired, False otherwise
        r.   r   T)tz)r   r0   r
   r   r   getr   fromtimestampr   r   r   r2   )r,   r4   r   s      r#   is_token_expiredzJWTManager.is_token_expiredS   s}    	jj(?(?XMcMcLdeG++e$C{))#(,,?(,,x||B\\\~~ 		s   AB AB B*)B*c                 T    t         j                  |       }|r|j                  d      S y)z
        Extract user ID from token.
        
        Args:
            token: JWT token
            
        Returns:
            User ID or None if invalid
        user_idNr   r5   r8   r3   s     r#   get_user_id_from_tokenz!JWTManager.get_user_id_from_tokeng   s)     ))%0;;y))r%   c                 T    t         j                  |       }|r|j                  d      S y)z
        Extract user email from token.
        
        Args:
            token: JWT token
            
        Returns:
            User email or None if invalid
        emailNr=   r3   s     r#   get_user_email_from_tokenz$JWTManager.get_user_email_from_tokenw   s)     ))%0;;w''r%   )N)__name__
__module____qualname____doc__staticmethodr   strr   r   r   r$   r+   r5   boolr:   intr>   rA    r%   r#   r   r      s   '$sCx. )AT `c  . 4S> (9BU ad  . C HT#s(^$<  $    & c hsm    #  r%   r   )rE   r   r   r   typingr   r   r   r   pydanticr	   src.core.configr
   r   jwt_managerrJ   r%   r#   <module>rO      s7    3 2 & & 
  $x xx lr%   