
    !+i/                     P   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
m
Z
mZ ddlmZ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      Zi ddddddddddddddddddddddddddddddddddddddddddddddddddddddd dd!d"dddd dd#dd$ddd dd%ddddd&dd'ddddd&dd(d$dd&dd)dd*ddddddd+dddd"ddd,ddddddd-ddddddddddddddddddd.ddd/dddd&d d)d"dddd d)d/dd d d d ddd d d d ddd d d d ddd d d d ddd d d d d0dd d d d d dd1Zi d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^
Z G d_ d`      ZdadaefdbZdgdceddedae fdeZ!dae fdfZ"y)hz
Smart Weather Service - Advanced Weather Impact Analysis
Analyzes weather in buyer regions and applies category-specific multipliers
    N)OptionalDictListTuple)Counter)datetime	timedelta)funcand_)SessionLocal)SystemConfig)MlOrder)Adpiscinagffffff?g333333?gffffff?g      ?)hotwarmcoolcoldrainu	   inflávelg?gffffff?g333333?g?boiag333333?praiag?u   biquíni皙?u   maiôsunga
ventiladorg333333?      ?zar condicionadog      ?climatizadorg      ?zfiltro piscinag?zbomba piscinaclorog?zprotetor solar	aquecedorcobertoredredomg?g?HzG?)casacojaquetalareirazguarda-chuvaz
capa chuvau   decoraçãou   móveisu   eletrôniconotebookcelular_defaultACzRio Branco,BRALz	Maceio,BRAPz	Macapa,BRAMz	Manaus,BRBAzSalvador,BRCEzFortaleza,BRDFzBrasilia,BRESz
Vitoria,BRGOz
Goiania,BRMAzSao Luis,BRMTz	Cuiaba,BRMSzCampo Grande,BRMGzBelo Horizonte,BRPAzBelem,BRPBzJoao Pessoa,BRPRzCuritiba,BRPEz	Recife,BRzTeresina,BRzRio de Janeiro,BRzNatal,BRzPorto Alegre,BRzPorto Velho,BRzBoa Vista,BRzFlorianopolis,BRSao Paulo,BRz
Aracaju,BRz	Palmas,BR)
PIRJRNRSRORRSCSPSETOc            
           e Zd ZdZdZd Zd Zddededee	e
ef      fdZd	e
dee   fd
ZdefdZdede
de
fdZdde
dee
   defdZdefdZy)SmartWeatherServicez
    Intelligent weather service that:
    1. Analyzes where buyers are located
    2. Fetches weather for those regions
    3. Applies category-specific multipliers
    z/https://api.openweathermap.org/data/2.5/weatherc                 N    d | _         | j                          i | _        d | _        y N)api_key_load_config_weather_cache_cache_time)selfs    J/var/www/hypershopcomercio.com.br/hyper-ai/app/services/weather_service.py__init__zSmartWeatherService.__init__S   s%         c                    t               }	 |j                  t              j                  t        j                  dk(  t        j
                  dk(        j                         }|r|j                  r|j                  | _        |j                          y# t        $ r"}t        j                  d|        Y d}~7d}~ww xY w# |j                          w xY w)z#Load API key from database settingsintegracoesopenweather_api_keyzError loading weather config: N)r   queryr   filtergroupkeyfirstvaluerH   	Exceptionloggererrorclose)rL   dbconfiges       rM   rI   z SmartWeatherService._load_configY   s    ^
	XXl+22""m3  $99 eg  &,,%|| HHJ  	?LL9!=>>	? HHJs*   A4B 	B<B72B? 7B<<B? ?Cdayslimitreturnc                    t               }	 t        j                         t        |      z
  }|j	                  t
              j                  t
        j                  |k\  t
        j                  j                  g d            j                         }g }|D ]  }|j                  st        |j                  t              s+|j                  j                  di       }|j                  di       }	|	j                  di       }
t        |
t              r|
j                  d      nd}|s|j                  |        t!        |      }|j#                  |      }t$        j'                  d| d	|        ||j)                          S # t*        $ r4}t$        j-                  d
|        g cY d}~|j)                          S d}~ww xY w# |j)                          w xY w)z
        Analyze order history to find where buyers come from
        
        Returns:
            List of (state, order_count) tuples
        )r`   )paid	deliveredshippedshippingreceiver_addressstateidNz"[WEATHER] Top buyer regions (last zd): zError analyzing buyer regions: )r   r   nowr	   rS   r   rT   date_createdstatusin_allraw_data
isinstancedictgetappendr   most_commonrZ   infor\   rY   r[   )rL   r`   ra   r]   cutoffordersstatesorderrg   receiverri   state_idstate_counts
top_statesr_   s                  rM   get_top_buyer_regionsz)SmartWeatherService.get_top_buyer_regionsh   sx    ^	\\^iT&::F XXg&--$$.""#CD ce  F 0>>j&F$~~11*bAH'||,>CH$LL"5E2<UD2IuyytHh/0 #6?L%11%8JKK<TF$zlST HHJ	  	LL:1#>?IHHJ		 HHJsD   BF $F ?A%F %AF 	F>
F9#F>$G 9F>>G Gcityc                 |   | j                   sy|j                         }|| j                  v r8| j                  |   \  }}t        j                         |z
  t        d      k  r|S 	 || j                   ddd}t        j                  | j                  |d      }|j                          |j                         }|d	   d
   |d	   d   |d	   d   |d   d   d   |d   d   d	   |d   d}t        j                         |f| j                  |<   |S # t        $ r%}	t        j                  d| d|	        Y d}	~	yd}	~	ww xY w)z(Fetch weather for a specific city/regionN   )minutesmetricpt_br)qappidunitslang   )paramstimeoutmaintemp
feels_likehumidityweatherr   descriptionname)r   r   r   r   r   r   z[WEATHER] Failed to fetch for z: )rH   lowerrJ   r   rk   r	   requestsrs   BASE_URLraise_for_statusjsonrY   rZ   r[   )
rL   r   	cache_keycached_timecached_datar   responsedataresultr_   s
             rM   get_weather_for_regionz*SmartWeatherService.get_weather_for_region   sJ   || JJL	+++'+':':9'E$K||~+i.CC""	!	F  ||DMM&!LH%%'==?D VV,"6l<8 L4#Iq1-@Y*62VF /7llnf-ED	*M 	LL9$r!EF	s   %B'D 	D;D66D;c                    | j                  dd      }|s| j                  d      }|xs dddS t        d |D              }d	}g }|D ]V  \  }}t        j	                  || d
      }| j                  |      }|s3||z  }	||d   |	z  z  }|j                  |d          X t        |      }
|r|
j                  d      d	   d	   nd}||t        |      dS )za
        Get weather averaged across top buyer regions,
        weighted by order volume
           r   )r`   ra   r9      Clear)r   r   c              3   &   K   | ]	  \  }}|  y wrG    ).0_counts      rM   	<genexpr>z;SmartWeatherService.get_weighted_weather.<locals>.<genexpr>   s     =XQ5=s   r   z,BRr   r      )r   r   regions_analyzed)	r   r   sumSTATE_CAPITALSrs   rt   r   ru   len)rL   top_regionsr   total_ordersweighted_temp
conditionsri   order_countr   weightcondition_countsmain_conditions               rM   get_weighted_weatherz(SmartWeatherService.get_weighted_weather   s   
 00b0B11.AG;r7;;===
"- 	3E;!%%ewc];D11$7G$|36!99!!'&/2	3 #:.BL)55a8;A>RY "" #K 0
 	
rO   r   r   c                 6    |dv }|ry|dk\  ry|dk\  ry|dk\  ryy	)
zClassify weather into category)RainDrizzleThunderstormr   r   r      r      r   r   r   )rL   r   r   is_rains       rM   classify_weatherz$SmartWeatherService.classify_weather   s4    ==RZRZRZrO   Nproduct_titlecategoryc                    | j                         }| j                  |j                  dd      |j                  dd            }|xs dj                         }|xs dj                         }| d| }t        d   }t        j                         D ]  \  }	}
|	dk7  s|	|v s|
} n |j                  |d      }t        j                  d	| d
|j                  dd      dd|dd  d|dd	       |S )z
        Get weather multiplier for a specific product
        
        Args:
            product_title: Product title to analyze keywords
            category: Optional category name
        
        Returns:
            Multiplier (0.3 - 1.5)
        r   r   r   r     r'   r   z
[WEATHER] z (r   z.1fu
   °C) → 'Nr   u	   ...' → z.2fx)r   r   rs   r   WEATHER_SENSITIVITY_KEYWORDSitemsrZ   rv   )rL   r   r   r   weather_classtitle_lowercategory_lowersearch_textsensitivitykeywordsens
multipliers               rM   get_category_multiplierz+SmartWeatherService.get_category_multiplier   s    ++---gkk&".Ew{{SY[bGcd %*113".b//1$Q~&672:>9??A 	MGT*$K)?"	
 !__]C8
jr'++fa2H1M N$Sb)*)Js3C1F 	G rO   c                     | j                         }| j                  |j                  dd      |j                  dd            }ddddd	}|j                  |d      S )
zl
        Get overall weather multiplier for general sales
        Uses an average across categories
        r   r   r   r   r   r   gffffff?r!   )r   r   r   r   )r   r   rs   )rL   r   r   base_multiplierss       rM   get_overall_multiplierz*SmartWeatherService.get_overall_multiplier  sg    
 ++---gkk&".Ew{{SY[bGcd 	
  ##M377rO   )r   r   rG   )__name__
__module____qualname____doc__r   rN   rI   intr   r   strr   r   r   r   r   floatr   r   r   r   rO   rM   rE   rE   I   s     AH '# '3 'tERUWZRZOG\ 'R'3 '8D> 'R!
d !
FU # # S HSM ]b @8 8rO   rE   rb   c                  .    t         
t               a t         S rG   )_servicerE   r   rO   rM   get_smart_weather_servicer   "  s    &(OrO   titler   c                 6    t               j                  | |      S )z4Convenience function for product-specific multiplier)r   r   )r   r   s     rM   "get_weather_multiplier_for_productr   (  s    $&>>uhOOrO   c                  2    t               j                         S )z3Convenience function for overall weather multiplier)r   r   r   rO   rM   get_overall_weather_multiplierr   ,  s    $&==??rO   rG   )#r   loggingr   typingr   r   r   r   collectionsr   r   r	   
sqlalchemyr
   r   app.core.databaser   app.models.system_configr   app.models.ml_orderr   app.models.adr   	getLoggerr   rZ   r   r   rE   r   r   r   r   r   r   r   rO   rM   <module>r      s     . .  ( ! * 1 ' 			8	$$ sCc3O$  tS#sS$  D$S#N	$ 
 S$S#N$  S#sCP$  S#sCM$  S#sCM$  $S#sS$  sCcSVW$  CsCQTU$  dCcSVW$  S$SRUV$  T3S#N$  c3SRUV$ $ c3SQ%$ & S#sCP'$ ( sCc3O)$ * 3S#NCc3OCc3Oc3PSTsCcR S#tTCc3OS#sSS#sCPCc4P S#sCPG$  N/.2KAE{-~/3]DH, 	, m .2; AEFW 	
	  $Z	 267G	 JN}	
 	+
 +2EZ
#3>Qc
KS8 S8n #6 Pc PS PE P@ @rO   