
    oi                         d dl Z d dl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
  e j                  e      Z G d d      Zy)    N)datetime	timedeltatimezone)settings)SessionLocal)
OAuthTokenc                   <    e Zd Zd Zd ZdefdZdefdZd Zd Z	y	)
MeliAuthServicec                     t         j                  | _        t         j                  | _        t         j
                  | _        y )N)r   MELI_APP_IDapp_idMELI_CLIENT_SECRETclient_secretMELI_REDIRECT_URIredirect_uri)selfs    D/var/www/hypershopcomercio.com.br/hyper-ai/app/services/meli_auth.py__init__zMeliAuthService.__init__   s+    **%88$66    c                     dd l }d}d| j                  | j                  dd}| d|j                  j	                  ||j                  j
                         S )Nr   z.https://auth.mercadolivre.com.br/authorizationcodez=read:items write:items offline_access read:orders advertising)response_type	client_idr   scope?)	quote_via)urllib.parser   r   parse	urlencodequote)r   urllibbase_urlparamss       r   get_auth_urlzMeliAuthService.get_auth_url   sY    C# --T	
 1V\\33FfllFXFX3YZ[[r   r   c           
         dd l }d| j                  | j                  || j                  d}d}t	        |      D ]  }t        j                  d|      }|j                  dk(  r<|dz   d	z  }t        j                  d
| d|dz    d| d       |j                  |       e|j                          |j                         c S  t        d      )Nr   authorization_code)
grant_typer   r   r   r      (https://api.mercadolibre.com/oauth/tokendata        z$Rate limit during exchange. Waiting s... (Attempt /)ue   Mercado Livre está limitando as requisições (429). Por favor, aguarde 5 minutos e tente novamente.)timer   r   r   rangerequestspoststatus_codeloggerwarningsleepraise_for_statusjson	Exception)r   r   r2   r+   max_retriesattemptresponsewaits           r   exchange_code_for_tokenz'MeliAuthService.exchange_code_for_token   s    .!// --
 [) 		#G}}%OVZ[H##s*!q(!EdV>ZabcZcYddefqerrstu

4 %%'==?"		#   A  	Ar   refresh_tokenc           
         dd l }d| j                  | j                  |d}d}t        |      D ]  }t	        j
                  d|      }|j                  dk(  r<|dz   d	z  }t        j                  d
| d|dz    d| d       |j                  |       e|j                          |j                         c S  t        d      )Nr   rB   )r'   r   r   rB   r(   r)   r*   r,   r-   r.   z#Rate limit during refresh. Waiting r/   r0   r1   uD   Mercado Livre está limitando as requisições de renovação (429).)r2   r   r   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   )r   rB   r2   r+   r=   r>   r?   r@   s           r   refresh_access_tokenz$MeliAuthService.refresh_access_token4   s    )!//*	
 [) 		#G}}%OVZ[H##s*!q(!DTF.Y`abYbXccdepdqqrst

4 %%'==?"		# ^__r   c                    t               }ddlm} 	 t        |j	                  d            }|j	                  dd      }t        j                         t        |      z   }d|d   |d	   |||d
}  |t              j                  di |}|d   |d	   |d   |d   |d   d}	 |j                  di |	}|j                  |       |j                          |j                  t              j                  d      j                         |j!                          S # t"        $ r.}
|j%                          t&        j)                  d|
         d}
~
ww xY w# |j!                          w xY w)zE
        Save or update tokens in the database using Upsert.
        r   )insertuser_id
expires_in`T  secondsmercadolivreaccess_tokenrB   )providerrM   rB   
expires_atrG   	seller_idrO   rP   )rM   rB   rO   rG   rP   rN   zError saving tokens: N )r   sqlalchemy.dialects.mysqlrF   strgetr   utcnowr   r   valueson_duplicate_key_updateexecutecommitquery	filter_byfirstcloser<   rollbackr7   error)r   
token_datadbrF   rG   rH   rO   r+   stmtupdate_dictes              r   save_tokenszMeliAuthService.save_tokensK   sW    ^40	*..34G#e<J!*Yz-JJJ + *> :!+O!<("$D -6*%,,4t4D !%^ 4!%o!6"<0	?!+.K 04//>+>DJJtIIK 88J'11>1JPPR HHJ  	KKMLL045	
 HHJs$   C4D 	E )E		EE E#c                 @   t               }	 |j                  t              j                  d      j	                         }|s't
        j                  d       	 |j                          y|j                  s|j                  |j                          S t        j                         }|j                  }|r|j                  r|j                  d      }|r||t        d      z   k  rt
        j                  d       	 | j!                  |j"                        }|d	   |_	        |d
   |_        |j%                  dd      }t        j&                  t(        j*                        t        |      z   |_        |j-                          t
        j                  d       |j                  |j                          S |j                  |j                          S # t.        $ r2}t
        j1                  d|        Y d}~|j                          yd}~ww xY w# |j                          w xY w)z
        Returns a valid access token string. 
        Refreshes automatically if expired or expiring soon (< 30 min).
        rL   rQ   zNo token found in database.N)tzinfo   )minutesz-Token expired or expiring soon. Refreshing...rM   rB   rH   rI   rJ   zToken refreshed successfully.zFailed to refresh token: )r   r[   r   r\   r]   r7   r8   r^   rO   rM   r   rV   rh   replacer   inforD   rB   rU   nowr   utcrZ   r<   r`   )r   rb   tokenrm   expiryrefresh_datarH   re   s           r   get_valid_tokenzMeliAuthService.get_valid_token   s   
 ^*	HHZ(22N2KQQSE<=L HHJE ##))B HHJ= //#C%%F&--t4 VsYr-B'BBKL "&";";E<O<O"P<
 )5^(D5%)5o)F5& , 0 0u E:&.ll8<<&@9U_C`&`5#99;;;>?,, HHJ %%HHJ !  LL#<QC!@A HHJ  HHJsD   A
H (H A)H :B&G 1H 	HH.H HH HN)
__name__
__module____qualname__r   r$   rT   rA   rD   rf   rr   rR   r   r   r
   r
   
   s4    7
	\AC A2`# `.7r0r   r
   )loggingr4   r   r   r   app.core.configr   app.core.databaser   app.models.oauth_tokenr   	getLoggerrs   r7   r
   rR   r   r   <module>r{      s8      2 2 $ * -			8	$j jr   