
    !+ig5                         d Z ddlZddlmZmZmZmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZ ddlZddlmZmZmZ  ej*                  e      Z G d d	      Zy)
u   
Detector e analisador de eventos de impacto competitivo.

Identifica mudanças significativas nos concorrentes e calcula correlação com nosso desempenho.
    N)DictListOptionalTuple)datetime	timedelta)Session)and_descfunc)CompetitorMetricsHistoryCompetitorImpactEventCompetitorThreatScorec            
           e Zd ZdZdZdZdZdefdZ	 dde	de	d	e
d
ee   fdZ	 dde	de	d	e
d
ee   fdZ	 dde	dede
d
efdZ	 dde	de	de
d
efdZdededed
e	fdZdeded
e	fdZde	de	ded
efdZde	de	fdZy)ImpactAnalyzeru   
    Analisador de impacto competitivo.
    
    Detecta eventos, calcula correlações e gera diagnósticos automáticos.
       2      dbc                     || _         y )N)r   )selfr   s     J/var/www/hypershopcomercio.com.br/hyper-ai/app/services/impact_analyzer.py__init__zImpactAnalyzer.__init__!   s	        competitor_id	our_ad_idlookback_hoursreturnc                    t        j                         t        |      z
  }| j                  j	                  t
              j                  t        t
        j                  |k(  t
        j                  |k(  t
        j                  |k\              j                  t        t
        j                              j                  d      j                         }t        |      dk  ry|d   |d   }}|j                   r|j                   sy|j                   |j                   z
  |j                   z  dz  }t#        |      | j$                  k\  r?|dk  rdndt'        |j                         t'        |j                         ||j                  d	S y)
u;   
        Detecta mudança significativa de preço.
        hours   Nr      d   
price_dropprice_increase
event_typemetric_beforemetric_afterchange_percentage	timestamp)r   utcnowr   r   queryr   filterr
   r   r   r,   order_byr   limitalllenpriceabsPRICE_DROP_THRESHOLDfloat	r   r   r   r   sincemetricscurrentprevious
change_pcts	            r   detect_price_change_eventz(ImpactAnalyzer.detect_price_change_event$   s:    !IN$CC ''-- 89@@(66-G(22i?(22e;
 (40::;
<UU1Xcce 	 w<!#AJ
}}HNN}}x~~5G3N
 z?d777.81nlBR!&x~~!6 %gmm 4%/$..  r   c                    t        j                         t        |      z
  }| j                  j	                  t
              j                  t        t
        j                  |k(  t
        j                  |k(  t
        j                  |k\              j                  t        t
        j                              j                  d      j                         }t        |      dk  ry|d   |d   }}|j                   r|j                   r|j                   dk(  ry|j                   |j                   z
  |j                   z  dz  }|| j"                  k\  r&d|j                   |j                   ||j                  dS y)	z9
        Detecta spike de vendas do concorrente.
        r    r"   Nr   r#   r$   sales_spiker'   )r   r-   r   r   r.   r   r/   r
   r   r   r,   r0   r   r1   r2   r3   salesSALES_SPIKE_THRESHOLDr8   s	            r   detect_sales_spikez!ImpactAnalyzer.detect_sales_spikeN   s*    !IN$CC''-- 89@@(66-G(22i?(22e;
 (40::;
<UU1Xcce 	 w<!#AJ
}}HNNhnn6I}}x~~5G3N
333+!) '%/$..  r   event_timestampwindow_daysc                 X   |t        |      z
  }|}|}|t        |      z   }| j                  j                  t              j	                  t        t        j                  |k(  t        j                  |k\  t        j                  |k              j                         }| j                  j                  t              j	                  t        t        j                  |k(  t        j                  |k\  t        j                  |k              j                         }	|	sMdd|j                  d       d|j                  d       |j                  d       d|j                  d       dS |r:t        j                  |D 
cg c]  }
|
j                  s|
j                   c}
      nd}|	r:t        j                  |	D 
cg c]  }
|
j                  s|
j                   c}
      nd}|rCt        j                  |D 
cg c]$  }
|
j                  st        |
j                        & c}
      nd}|	rCt        j                  |	D 
cg c]$  }
|
j                  st        |
j                        & c}
      nd}|r:t        j                  |D 
cg c]  }
|
j                  s|
j                   c}
      nd}|	r:t        j                  |	D 
cg c]  }
|
j                  s|
j                   c}
      nd}t!        dt#        ||z
              }t#        |      t#        |      t%        |d      t%        |d      t#        |      t#        |      ||j                  d       d|j                  d       |j                  d       d|j                  d       d	S c c}
w c c}
w c c}
w c c}
w c c}
w c c}
w )	u   
        Calcula impacto nas nossas vendas após um evento do concorrente.
        
        Compara média de 7 dias antes vs após o evento.
        daysr   insufficient_future_dataz%d/%mz a )estimated_sales_loststatusperiod_beforeperiod_afterr"   )	our_sales_beforeour_sales_afterour_conversion_beforeour_conversion_afterour_visits_beforeour_visits_afterrJ   rL   rM   )r   r   r.   r   r/   r
   r   r,   r2   strftimenpmean	our_salesour_conversion_rater7   
our_visitsmaxintround)r   r   rD   rE   before_start
before_endafter_start	after_endbefore_metricsafter_metricsmrN   rO   our_conv_beforeour_conv_afterrR   rS   rJ   s                     r   calculate_impact_on_our_salesz,ImpactAnalyzer.calculate_impact_on_our_salesv   s)    ')DD$
%#i[&AA	 '?@GG(22i?(22lB(22Z?
 #% 	 &>?FF(22i?(22kA(22Y>
 #% 	 ()4$0$9$9'$B#C3zGZGZ[bGcFd!e#.#7#7#@"AYEWEWX_E`Da b	  ]k277#WA1;;AKK#WXpqZg"''"U11;;"UVmn wE"''"qA[\[p[p5)>)>#?"qr  KL uB!o1YZYnYn%(=(=">!op  HI_mBGG>$ZaQ\\Q\\$Z[st]j277-#XQ1<<ALL#XYpq  #1c*:_*L&MN !$$4 5"?3%*?A%>$).!$<!$%6!7 #$4 5$8 , 5 5g >?s:CVCVW^C_B`a*33G<=SASAST[A\@]^

 
	
 $X"U"q!o$Z#XsH   ;NN9NN7N	N>NNN"N"N'N'lookback_daysc                    t        j                         t        |      z
  }| j                  j	                  t
              j                  t        t
        j                  |k(  t
        j                  |k(  t
        j                  |k\  t
        j                  j                  d      t
        j                  j                  d                  j                         }t        |      dk  ry|D cg c]  }|j                   }}|D cg c]  }|j                   }}	 t!        j"                  ||      d   }	t%        |	d      S c c}w c c}w #  Y yxY w)u   
        Calcula correlação de Pearson entre vendas do concorrente e nossas vendas.
        
        Retorna valor entre -1 (correlação negativa perfeita) e 1 (correlação positiva perfeita).
        rG   N
   g        )r   r#   r"   )r   r-   r   r   r.   r   r/   r
   r   r   r,   rA   isnotrW   r2   r3   rU   corrcoefr\   )
r   r   r   rg   r9   r:   rc   competitor_salesrW   correlations
             r   calculate_correlationz$ImpactAnalyzer.calculate_correlation   s    !I=$AA''-- 89@@(66-G(22i?(22e;(..44T:(2288>
 #% 	 w<"-45AGG55*12QQ[[2	2	++&6	B4HKa(( 62
	s   +D?E$E	 	Eeventimpactrm   c                 @   |d   }|d   }|j                  dd      }|j                  dd      }|dk(  rEdt        |      d	d
}|d|d   dd|d   ddz  }|dkD  r|d| d| dz  }|dk  r	|d| dz  }|S |dk(  rd|d	d}|dkD  r|d| d| dz  }|S d| d}|S )uX   
        Gera diagnóstico automático em texto natural com DATAS ESPECÍFICAS.
        r(   r+   rJ   r   rM   u   período recenter%   u*   📢 CONCORRENTE REDUZIU PREÇO: Queda de z.1fz% z(de R$r)   z.2fz para R$r*   z). zEstimativa de z vendas perdidas entre z. g      u   Alta correlação negativa (z).r@   u-   ⚠️ SPIKE DE VENDAS: Concorrente cresceu +z%. u   Suas vendas caíram u    un. no mesmo período (zEvento z detectado.)getr5   )	r   ro   rp   rm   r(   r=   
sales_lostrM   	diagnosiss	            r   generate_diagnosisz!ImpactAnalyzer.generate_diagnosis   s-    <(
./
ZZ 6:
zz.2DE%DS_UXDYY[\I6%"8!=XeNF[\_E``cddIA~~j\9PQ]P^^`aa	T!;K=KK	  =(G
SVGWWZ[IA~3J<?WXdWeeghh	
  #:,k:Yr   c                 L    |d   }t        |d         }|dk(  r|dkD  ry|dk(  ryy)	u0   
        Gera recomendação de ação.
        r(   r+   r%   ri   u   💡 Recomendação: Considere ajustar seu preço para manter competitividade ou destacar diferenciais (frete grátis, qualidade, reviews).r@   uq   💡 Recomendação: Investigue a causa do spike (promoção, anúncio patrocinado). Considere ações similares.u'   💡 Continue monitorando a situação.)r5   )r   ro   rp   r(   r=   s        r   generate_recommendationz&ImpactAnalyzer.generate_recommendation   sC     <(
234
%*r/ a=( G8r   c                    	 | j                  ||d         }| j                  ||      }t        |      dkD  r|d   dkD  rd}d}nt        |      dkD  r|d   dkD  rd	}d
}nd}d}| j                  |||      }| j	                  ||      }	t        d|||d   |d   d|d   v rdnd|d   |d   |d   d||||||	d}
| j                  j                  |
       | j                  j                          t        j                  d|d    d|        y# t        $ r<}t        j                  d|        | j                  j                          Y d}~yd}~ww xY w)u[   
        Analisa evento detectado e cria registro de ImpactEvent com diagnóstico.
        r,   gffffff?rJ   r   highU   g?r"   medium<   lowr   r(   r4   rA   r)   r*   r+   )r   r   r(   rD   competitor_metric_namecompetitor_metric_beforecompetitor_metric_afterr+   )correlation_scoreconfidence_levelthreat_scorert   recommendationu   ✅ Evento de impacto criado: z - Tz!Erro ao criar evento de impacto: NF )rf   rn   r5   ru   rw   r   r   addcommitloggerinfo	Exceptionerrorrollback)r   r   r   ro   rp   rm   
confidencer   rt   r   impact_eventes               r   analyze_and_create_impact_eventz.ImpactAnalyzer.analyze_and_create_impact_event
  s   4	77k"F 44]INK ;#%&1G*H1*L#
![!C'F3I,JQ,N%
!"
! //v{KI!99%HN 1 +# . %k 229U<=P2PwV]).)?(-n(="'(;"<  #.!+)#-L" GGKK%GGNNKK8|9L8MSQZP[\] 	LL<QC@AGG	s   DD 	E2EEc                 J   t         j                  d| d|        g }| j                  ||      }|r|j                  |       | j	                  ||      }|r|j                  |       |D ]  }| j                  |||        t         j                  dt        |       d       y)u@   
        Executa análise completa para um concorrente.
        u#   Iniciando análise de impacto para z vs u   Análise completa: z eventos detectadosN)r   r   r>   appendrC   r   r3   )r   r   r   eventsprice_eventsales_eventro   s          r   run_full_analysisz ImpactAnalyzer.run_full_analysisI  s     	9-YKXY 44]INMM+&--mYGMM+&  	RE00	5Q	R 	)#f+6IJKr   N)   )   )r   )__name__
__module____qualname____doc__r6   rB   VISITS_SPIKE_THRESHOLDr	   r   strr[   r   r   r>   rC   r   rf   r7   rn   ru   rw   boolr   r   r   r   r   r   r      sv    7  !	(( ( 	(
 
$(\ !	&& & 	&
 
$&X 	B
B
 "B
 	B

 
B
P  	!! ! 	!
 
!F d  SV <9T 94 9C 9== = 	=
 
=~Ls Ls Lr   r   )r   loggingtypingr   r   r   r   r   r   sqlalchemy.ormr	   
sqlalchemyr
   r   r   numpyrU   "app.models.competitor_intelligencer   r   r   	getLoggerr   r   r   r   r   r   <module>r      sP   
  . . ( " ' '   
		8	$IL ILr   