
    J!j                        d dl Z 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 d dlmZ d dlmZ d dlmZ  e j&                  e j(                  	        e j*                  e      Z ee      Z ee       ej3                  e      d
        Zd dlmZ ej=                  e       d dlm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z' d dl(m)Z)m*Z*m+Z+  e        Z,e,j[                  e"ddd d       e,j[                  e$dd d d       e,j[                  e%ddd       e,j[                  e&ddd       e,j[                  e'dddd       e,j[                  e)ddd       e,j[                  e*ddd        e,j[                  e+dd!d d"       e,j]                          ej_                  d#       d d$l0m1Z1 d d%l2m3Z3 d d&l4m5Z5 d' Z6d( Z7	  e3e1e6e7      Z8e8j]                          ej_                  d)       ejw                  d+d,g-      d.        Z<ed/k(  r\ e=d0ej|                  rej|                  nd1         ej~                  d2d3      j                         d4k(  ZAej                  d5d6eA7       yy# e$ rZ9eju                  d*e9        Y dZ9[9dZ9[9ww xY w)8    N)Flaskrequestjsonify)CORS)HTTPException)settings)MeliAuthServiceSessionLocal)Token)levelc                     t        | t              r.t        | j                  | j                  d      | j
                  fS t        j                  dd       t        ddd      dfS )N)errormessagezUnhandled ExceptionT)exc_infozInternal Server Errorz7Ocorreu um erro interno. Verifique os logs do servidor.  )
isinstancer   r   namedescriptioncodeloggerr   )es    5/var/www/hypershopcomercio.com.br/hyper-ai/app/web.pyhandle_exceptionr      so    !]#VV}}
  FF 	
 LL&L6(L  	     )api_bp)BackgroundScheduler)run_daily_sync)run_daily_predictionsrun_hourly_reconciliationrun_weekly_calibrationrun_daily_snapshot)!run_competitor_metrics_collectionrun_impact_analysisrun_threat_score_calculationcron   r   )functriggerhourminuteidr      r    )r(   r)   r+   r,   
   run_hourly_calibration   7   r"      competitor_metrics_collection   competitor_impact_analysis   competitor_threat_scoresztScheduler started: Forecast + Competitor Intelligence (Hourly :05, :10, :15, :20 + Daily 00:00, 01:00, 04:00, 23:55))webhook_queue)init_processorMeliApiServicec                      t               S )Nr
    r   r   
db_factoryr>   X   s
    >r   c                     t        |       S )N)
db_sessionr:   )dbs    r   meli_factoryrB   [   s    R((r   z&Webhook Processor started successfullyz#Failed to start Webhook Processor: z/oauth/meli/callbackGET)methodsc            
      (   t         j                  j                  d      } | st        ddi      dfS 	 t	               }|j                  |       }t               }	 |j                  t              j                          t        |d   |d   t        |d         t        j                  j                         t        j                  |d   	      z   
      }|j                  |       |j                          t         j#                  d|j                  d              t        d|j                  d      |j                  d      d      df|j%                          S # t&        $ rQ}|j)                          t         j+                  d|        t        ddi      dfcY d}~|j%                          S d}~ww xY w# |j%                          w xY w# t&        $ r=}t         j+                  d|        t        ddt        |       i      dfcY d}~S d}~ww xY w)u   
    Rota de callback para o fluxo OAuth2 do Mercado Livre.
    
    Espera receber um parâmetro 'code' na URL.
    Troca este código por um Access Token e Refresh Token e os salva no banco de dados.
    r   r   zAuthorization code not providedi  access_tokenrefresh_tokenuser_id
expires_in)seconds)rF   rG   rH   
expires_atz&Token salvo com sucesso para User ID: u%   Autenticação realizada com sucesso!)r   rH   rI      zErro ao salvar token no banco: u+   Falha ao persistir dados de autenticação.r   NzErro no fluxo OAuth: zErro na troca de token: )r   argsgetr   r	   exchange_code_for_tokenr   queryr   deletestrdatetimenow	timedeltaaddcommitr   infoclose	Exceptionrollbackr   )r   auth_servicetokensrA   	new_tokendb_er   s          r   meli_callbackr`   h   s    <<F#D !BCDcII-L&( 55d; ^	HHUO""$ #N3$_5F9-.#,,002X5G5GPVWcPd5eeI FF9IIKKK@IAV@WXYB!::i0$jj6  	 HHJ  	ZKKMLL:4&ABG%RSTVYYYHHJ	Z
 HHJ L,QC01#;CF8!DEFKKLs`   %G C0E G 	F3"6F.F3F6 G .F33F6 6GG 	H2HHH__main__z7Servidor rodando. Configure o Redirect URI no ML para: z)http://localhost:5000/oauth/meli/callbackFLASK_DEBUGFalsetruez0.0.0.0i  )hostportdebug)CloggingrS   osflaskr   r   r   
flask_corsr   werkzeug.exceptionsr   app.core.configr   app.services.meli_authr	   app.core.databaser   app.models.tokenr   basicConfigINFO	getLogger__name__r   apperrorhandlerrZ   r   app.apir   register_blueprint!apscheduler.schedulers.backgroundr   app.scheduler.tasksr   app.jobs.forecast_jobsr   r    r!   r"   app.jobs.competitor_jobsr#   r$   r%   	scheduleradd_jobstartrX   app.api.endpoints.webhooksr8   app.services.webhook_processorr9   app.services.meli_apir;   r>   rB   	processorr   r   router`   printMELI_REDIRECT_URIgetenvlowerflask_debugrunr=   r   r   <module>r      s     	 ) )  - $ 2 * "   ',, '			8	$Ho S	 )     v  B .    !	 
  ~vAaL\  ] 
  ,f1QSj  k 
  0&Oj  k 
  -vbMe  f 
  )62Rf  g 
  8&QSXw  x 
  *F2Jf  g 
  3V!TUZt  u 	    C  D 5 9 0)<}j,GIOO
KK89 !E73:L 4:Lx z	Cbjb|b|HD^D^  Cn  Do  p  q"))M7399;vEKGG[G9	 G  <
LL6qc:;;<s   7+I J#I<<J