
    !+i#                         d Z ddlZddlmZ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  ej                  e      ZdZ G d	 d
      Zy)u   
Serviço de scraping de métricas de concorrentes via API do Mercado Livre.

Coleta dados públicos disponíveis: preço, vendas, visitas, reputação, etc.
    N)DictOptional)datetime)Session)CompetitorMetricsHistory)Adzhttps://api.mercadolibre.comc                       e Zd ZdZdefdZdedee   fdZ	dedee
   fdZdedefd	Zd
e
defdZdededefdZdefdZy)CompetitorMetricsScraperuJ   
    Scraper de métricas públicas de concorrentes no Mercado Livre.
    dbc                     || _         y )N)r   )selfr   s     U/var/www/hypershopcomercio.com.br/hyper-ai/app/services/competitor_metrics_scraper.py__init__z!CompetitorMetricsScraper.__init__   s	        ml_idreturnc                 4   	 t          d| }t        j                  |d      }|j                  dk(  r|j	                         S t
        j                  d|j                   d|        y# t        $ r%}t
        j                  d| d	|        Y d}~yd}~ww xY w)
u   
        Busca dados públicos de um item do ML via API.
        
        Args:
            ml_id: ID do MLB (ex: MLB1234567890)
            
        Returns:
            Dict com dados do item ou None se falhar
        /items/
   timeout   zML API retornou z para Nz Erro ao buscar dados do ML para : )	ML_API_BASErequestsgetstatus_codejsonloggerwarning	Exceptionerror)r   r   urlresponsees        r   fetch_competitor_item_dataz3CompetitorMetricsScraper.fetch_competitor_item_data   s    	 M0C||C4H##s*}}&!1(2F2F1GveWUV 	LL;E7"QCHI	s   A A) %A) )	B2BBc                 @   	 t          d| d}t        j                  |d      }|j                  dk(  r"|j	                         }|j                  dd      S t
        j                  d|        y	# t        $ r%}t
        j                  d
| d|        Y d	}~y	d	}~ww xY w)u   
        Busca quantidade de visitas do item (via endpoint público).
        
        Nota: A API do ML expõe visitas em alguns endpoints públicos,
        mas pode ser necessário autenticação para dados mais detalhados.
        r   z/visitsr   r   r   totalr   u&   Visits endpoint não disponível para Nu&   Não foi possível obter visitas para r   )r   r   r   r   r   r   debugr!   )r   r   r#   r$   datar%   s         r   fetch_competitor_visitsz0CompetitorMetricsScraper.fetch_competitor_visits4   s    	 Mw7C||C4H##s*}}xx++EeWMN 	LLA%1#NO	s   AA/ A/ /	B8BB	item_datac                    i }	 |j                  dd      |d<   |j                  dd      |d<   |j                  dd      |d<   |j                  di       }|j                  dd	      |d
<   |j                  d      }|d   }|duxr ||kD  |d<   |j                  d      }|r"| j                  |      }|j                  |       |j                  dd      |d<   |S # t        $ r#}t        j                  d|        Y d}~|S d}~ww xY w)u   
        Extrai métricas relevantes dos dados do item.
        
        Args:
            item_data: Resposta JSON da API /items/{id}
            
        Returns:
            Dict com métricas processadas
        pricer   sold_quantitysalesavailable_quantitystock_availableshippingfree_shippingFhas_free_shippingoriginal_priceNhas_promotion	seller_idstatusunknownu   Erro ao extrair métricas: )r   _fetch_seller_reputationupdater!   r   r"   )	r   r,   metricsr3   r6   current_pricer8   seller_metricsr%   s	            r   extract_metrics_from_itemz2CompetitorMetricsScraper.extract_metrics_from_itemL   s+    	<(}}Wa8GG  )}}_a@GG *37KQ)OG%& !}}Z4H+3<<+OG'( ']]+;<N#G,M'5T'A'dnWdFdGO$ "k2I!%!>!>y!I~. !*h	 BGH
   	<LL6qc:;;	<s   CC 	D#DDr8   c                    	 t          d| }t        j                  |d      }|j                  dk(  rg|j	                         }|j                  di       }|j                  dd      |j                  d      |j                  d	i       j                  d
d      dS 	 ddddS # t
        $ r%}t        j                  d| d|        Y d}~/d}~ww xY w)u=   
        Busca métricas de reputação do vendedor.
        z/users/r   r   r   seller_reputationlevel_idr:   power_seller_statustransactionsr(   r   )rB   ratingreviews_countu1   Não foi possível obter reputação do vendedor r   N)r   r   r   r   r   r!   r   r)   )r   r8   r#   r$   r*   
seller_repr%   s          r   r;   z1CompetitorMetricsScraper._fetch_seller_reputationy   s    	_ M4C||C4H##s*}}!XX&92>
 *4
I)N(nn-BC%/^^NB%G%K%KGUV%W 	 + "+
 	
  	_LLLYKWYZ[Y\]^^	_s   BB! !	C*C

Ccompetitor_ml_id	our_ad_idc                    	 | j                  |      }|st        j                  d|        y| j                  |      }| j	                  |      }||d<   |r!|dkD  r|j                  dd      |z  dz  |d<   nd|d<   | j                  j                  t              j                  t        j                  |k(        j                         }i }|r(|j                  t        |dd      t        |dd      ddd	}t        d||t        j                          |j                  d
      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      d|}| j                  j#                  |       | j                  j%                          t        j'                  d| d|j                  d
       d|j                  d              y# t(        $ r?}	t        j+                  d| d|	        | j                  j-                          Y d}	~	yd}	~	ww xY w)u  
        Coleta métricas do concorrente e salva no histórico.
        
        Args:
            competitor_ml_id: MLB ID do concorrente
            our_ad_id: MLB ID do nosso anúncio
            
        Returns:
            True se sucesso, False se falhar
        u.   Não foi possível obter dados do concorrente Fvisitsr   r0   d   conversion_rateN)	our_price
our_visits	our_salesour_conversion_rateour_search_positionr.   r2   r5   r7   rB   rG   )competitor_idrJ   	timestampr.   rL   r0   rN   r2   r5   r7   rB   rG   u)   ✅ Métricas coletadas para concorrente u   : Preço R$z	, Vendas Tu2   Erro ao coletar e salvar métricas do concorrente r    )r&   r   r    r@   r+   r   r   queryr   filteridfirstr.   getattrr   r   utcnowaddcommitinfor!   r"   rollback)
r   rI   rJ   r,   r=   rL   our_adour_metricshistory_entryr%   s
             r   collect_and_save_metricsz1CompetitorMetricsScraper.collect_and_save_metrics   s_   ?	778HII!OP`Oabc 44Y?G 112BCF &GH &1*.5kk'1.E.NRU-U)*-1)* WW]]2&--beey.@AGGIFK!'")&(D"A!($!?+/+/ 5 .#"//+ kk'*{{8,kk'* ',= > ',= >")++.A"B%kk/:")++.A"B%kk/:" #M( GGKK&GGNNKKCDTCUU`ahalalmtau`vv  AH  AL  AL  MT  AU  @V  W  X 	LLMN^M__abcadefGG	s   +H G*H 	I!"5II!c                 4    t         j                  d|        y)u   
        Coleta métricas de todos os concorrentes monitorados para um anúncio.
        
        Args:
            our_ad_id: MLB ID do nosso anúncio
        u/   Coletando métricas de todos concorrentes para N)r   r_   )r   rJ   s     r   collect_all_competitors_metricsz8CompetitorMetricsScraper.collect_all_competitors_metrics   s     	Ei[QR 	r   N)__name__
__module____qualname____doc__r   r   strr   r   r&   intr+   r@   r;   boolrd   rf   rV   r   r   r
   r
      s    7   2S Xc] 0+4 +D +Z
# 
$ 
4J J JQU JX r   r
   )rj   loggingtypingr   r   r   r   sqlalchemy.ormr   "app.models.competitor_intelligencer   app.models.adr   	getLoggerrg   r   r   r
   rV   r   r   <module>rt      sD   
  !   " G 			8	$,X Xr   