U
    ^¨j�  ã                   @   sä  d dl Z d dlZd dlmZ d dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZ ed	eƒZeej d
d¡ƒZddhZ dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)d d!„ Z*d"d#„ Z+d$d%„ Z,d&d'„ Z-d(d)„ Z.d*d+„ Z/d,d-„ Z0d.d/„ Z1d0d1„ Z2d2d3„ Z3d4d5„ Z4d6d7„ Z5d8d9„ Z6d:d;„ Z7d<d=„ Z8d>d?„ Z9d@dA„ Z:dBdC„ Z;dDdE„ Z<dFdG„ Z=dzdIdJ„Z>dKdL„ Z?d{dMdN„Z@dOdP„ ZAdQdR„ ZBdSdT„ ZCdUdV„ ZDejEdWdXgdY�dZd[„ ƒZFejEd\dXgdY�d]d^„ ƒZGejEd_dXgdY�d`da„ ƒZHejEdbdXgdY�dcdd„ ƒZIejEdedXgdY�dfdg„ ƒZJejEdhdXgdY�didj„ ƒZKejEdkdXgdY�dldm„ ƒZLejEdndXgdY�dodp„ ƒZMejEdqdXgdY�drds„ ƒZNejEdtdXgdY�dudv„ ƒZOejEdwdXgdY�dxdy„ ƒZPdS )|é    N)Údefaultdict)ÚdatetimeÚ	timedelta)Ú	BlueprintÚjsonifyÚrequest)ÚSCAPP_DATABASE_NAMEÚUSER_DATABASE_NAMEÚget_db)Úcompute_analytic_area_dataÚ!compute_analytic_area_versus_dataÚcompute_analytics_by_regionÚcompute_multiple_analytic_days)Úbuild_centro_id)ÚFEEDER_SCORE_COLLECTION_NAMEÚcompute_feeder_score_by_areaÚcompute_feeder_score_by_regionÚfetch_feeder_score_dataZ
agent_dataZSCAPP_MAX_SNAPSHOT_ROWSZ1000000ZgerenciaZsuperusuarioc                   C   s   t j dd¡ ¡ S )NZAGENT_INTERNAL_SHARED_SECRETÚ )ÚosÚenvironÚgetÚstrip© r   r   ú7/var/www/itgmanager/itgmanager/blueprints/agent_data.pyÚ_read_internal_secret"   s    r   c                 C   s
   t | tƒS ©N©Ú
isinstanceÚdict©Úvaluer   r   r   Ú_is_plain_object&   s    r"   c                 C   s   t | pdƒ ¡ S )Nr   )Ústrr   r    r   r   r   Ú_normalize_text*   s    r$   c                 C   s   t | ƒ ¡ S r   )r$   Úlowerr    r   r   r   Ú_normalize_lookup_key.   s    r&   c                 C   s*   t | ƒ}|sdS d dd„ | d¡D ƒ¡S )Nr   Ú-c                 s   s   | ]}|  ¡ V  qd S r   )Ú
capitalize)Ú.0Úpartr   r   r   Ú	<genexpr>6   s     z(_normalize_title_part.<locals>.<genexpr>)r$   ÚjoinÚsplit)r!   Úcleanedr   r   r   Ú_normalize_title_part2   s    r/   c                 C   s   d  t|ƒt|ƒt| ƒg¡S ©Nr'   )r,   r&   ©ÚregionÚareaÚcentror   r   r   Ú_build_center_lookup9   s    ýÿr5   c                 C   s   t t| ƒt|ƒt|ƒƒS r   )r   r/   r1   r   r   r   Ú_build_center_displayC   s
    ýr6   c                  C   s   t jdd�} t| tƒr| S i S )NT)Úsilent)r   Úget_jsonr   r   )Úpayloadr   r   r   Ú_read_json_payloadK   s    r:   c                  C   s@   t ƒ } | sd S tj dd¡ ¡ }|| kr,d S tddddœƒdfS )NzX-Agent-Secretr   FÚ	forbiddenzInvalid internal agent secret.©ÚokÚerrorÚdetailé“  )r   r   Úheadersr   r   r   )Zconfigured_secretZprovided_secretr   r   r   Ú_authorize_internal_requestP   s    ýÿørB   c                 C   s   |   d¡}t|tƒr|S i S )NÚquery©r   r   r   )r9   rC   r   r   r   Ú_extract_querye   s    
rE   c                 C   s   |   d¡}t|tƒr|S i S )NZviewContextrD   )r9   Úview_contextr   r   r   Ú_extract_view_contextj   s    
rG   c                 C   s   |   d¡}t|tƒr|S i S )NZclientContextrD   )r9   Úclient_contextr   r   r   Ú_extract_client_contexto   s    
rI   c                 C   s`   t | ƒ}|  d¡}t|tƒr6t| d¡tƒr6| d¡ni }t| d¡pX| d¡pX|  d¡ƒ}|S )NZvisibleDigestÚidentityÚusername)rI   r   r   r   r$   )r9   rH   Zvisible_digestrJ   rK   r   r   r   Ú_extract_usernamet   s    
(ÿrL   c                 C   s&   t ƒ }|t j}| r"| d| i¡S d S )NrK   )r
   r	   ÚusersÚfind_one)rK   ÚclientrM   r   r   r   Ú
_load_user~   s    
rP   c                 C   sÚ   t | tƒr|  d¡ni }tƒ }tƒ }tƒ }t |tƒs>|||fS | ¡ D ]ˆ\}}t|ƒ}t |tƒsbqF|rp| |¡ | ¡ D ]T\}}	t|ƒ}
|
sŽqx| |› d|
› �¡ t |	tƒrx|	D ]}t|ƒ}|r°| |¡ q°qxqF|||fS )NÚpermisosr'   )r   r   r   ÚsetÚitemsr&   ÚaddÚlist)Úuser_documentrQ   Úallowed_centersÚallowed_areasÚallowed_regionsr2   Zarea_mapÚ
region_keyr3   ÚcentersÚarea_keyÚ	center_idÚ
center_keyr   r   r   Ú _flatten_user_center_permissions„   s.    




r_   c                 C   s^   t | ƒ}|s&d d tddddœƒdffS t|ƒ}|sTd d tddd|› d�dœƒd	ffS ||d fS )
NFZmissing_usernamezBA username is required in visibleDigest.identity or clientContext.r<   é�  Zunknown_userúUser 'z' was not found.é”  )rL   r   rP   )r9   rK   rV   r   r   r   Ú_ensure_user_and_permissions¡   s.    ýÿø
ýÿørc   c                 C   s   t | ƒ\}}}t|||ƒ|kS r   )r_   r5   )rV   r2   r3   r4   rW   Ú_r   r   r   Ú_check_center_permission¿   s    re   c                 C   s(   t | ƒ\}}}t|ƒ› dt|ƒ› �|kS r0   )r_   r&   )rV   r2   r3   rd   rX   r   r   r   Ú_check_area_permissionÄ   s    rf   c                 C   s0   t | ƒ\}}}t|  d¡ƒ}|tkp.t|ƒ|kS )NÚcargo)r_   r&   r   ÚREGION_ANALYTICS_ROLES)rV   r2   rd   rY   rg   r   r   r   Ú_check_region_permissionÉ   s    ri   c                 C   sT  t | ƒ}t| ƒ}t| d¡tƒr*| d¡ni }t| d¡tƒrH| d¡ni }t| d¡tƒrf| d¡ni }t| d¡p~| d¡ƒt| d¡p”| d¡ƒt| d¡pª| d¡ƒt| d¡pÀ| d¡ƒt| d¡pÖ| d¡ƒ| d	¡pî| d	¡pîd
t| d¡�p| d¡ƒt| d¡ƒt| d¡tƒ�r.| d¡ng t| d¡tƒ�rL| d¡ng dœ
S )NÚentitiesÚfiltersÚdiasr2   r3   r4   Ú	startDateÚendDateÚdayRangeé   ÚselectedDayÚ
entityNamer[   Úareas)
r2   r3   r4   rm   rn   ro   rq   rr   r[   rs   )rE   rG   r   r   r   r$   rU   )r9   rC   rF   rj   rk   rl   r   r   r   Ú_resolve_scope_queryÏ   s     ört   c                 C   s@   z$t  t| ƒd¡}t |j|j|jƒW S  tk
r:   Y d S X d S )Nú%d-%m-%Y)r   Ústrptimer$   ÚyearÚmonthÚdayÚ
ValueError)Zstart_day_textZ
date_valuer   r   r   Ú_parse_start_dayä   s
    r{   c              	   C   s:   zt | ƒ}|dkr|nd W S  ttfk
r4   Y d S X d S ©Nr   )ÚintÚ	TypeErrorrz   )r!   Úparsedr   r   r   Ú_parse_day_rangeì   s
    r€   c                 C   sn   t |  d¡ƒ}t|  d¡ƒ}|r$|s>d d tddddœƒdffS |t|d d	� }||  d¡| d
¡|dœd fS )Nrm   ro   FZinvalid_time_rangezFstartDate must use DD-MM-YYYY and dayRange must be a positive integer.r<   r`   rp   ©Údaysru   ©rm   rn   ro   )r{   r   r€   r   r   Ústrftime)rC   Ú	start_dayZ	day_rangeÚend_dayr   r   r   Ú_build_time_rangeô   s(    ýÿøýùr‡   c                 C   sV   t | tƒsi S t| ƒ}d|kr4d|kr4| d¡|d< d|krRd|krR| d¡|d< |S )NZvisitas_coutÚvisitas_countZperdidos_coutÚperdidos_count)r   r   Úpop)r!   Z
next_valuer   r   r   Ú_normalize_metric_value  s    
r‹   c              	   C   sŒ   t | tƒr| }n"t | tƒr.dd„ |  ¡ D ƒ}ng S g }|D ]@}t |tƒsJq:t| d¡ƒ}|s^q:| |t| di ¡ƒdœ¡ q:t|dd„ d�S )	Nc                 S   s   g | ]\}}||d œ‘qS ©©ry   r!   r   )r)   ry   r!   r   r   r   Ú
<listcomp>  s     z-_normalize_values_summary.<locals>.<listcomp>ry   r!   r�   c                 S   s   | d S ©Nry   r   ©Úitemr   r   r   Ú<lambda>,  ó    z+_normalize_values_summary.<locals>.<lambda>©Úkey)	r   rU   r   rS   r$   r   Úappendr‹   Úsorted)Úvalues_summaryÚentriesÚ
normalizedÚentryry   r   r   r   Ú_normalize_values_summary  s    


rœ   c              	   C   s‚   |   |¡}t|tƒrT|  d¡d k	r4t|  d¡p0dƒS |  d¡d k	rTt|  d¡pPdƒS zt|p^dƒW S  ttfk
r|   Y dS X d S )Nr!   r   Úalarmg        )r   r   r   Úfloatr~   rz   )r!   r•   Zbandr   r   r   Ú_read_alarm_band_value/  s    

rŸ   c              	   C   sª   t | tƒr| }n"t | tƒr.dd„ |  ¡ D ƒ}ng S g }|D ]^}t |tƒsJq:t| d¡ƒ}| d¡}|r:t |tƒsrq:| |t|dƒt|dƒt|dƒdœ¡ q:t|d	d
„ d�S )Nc                 S   s   g | ]\}}||d œ‘qS rŒ   r   )r)   ry   Úinnerr   r   r   rŽ   @  s     z*_normalize_alarm_bands.<locals>.<listcomp>ry   r!   ÚbajaÚmediaÚalta)ry   r¡   r¢   r£   c                 S   s   | d S r�   r   r�   r   r   r   r’   U  r“   z(_normalize_alarm_bands.<locals>.<lambda>r”   )	r   rU   r   rS   r$   r   r–   rŸ   r—   )r!   r™   rš   r›   ry   r    r   r   r   Ú_normalize_alarm_bands<  s*    



üÿ	r¤   c                 C   sd   t | tƒsg S g }| D ]H}t |tƒs&qt| d¡ƒ}| d¡}|rt |tƒsNq| ||dœ¡ q|S )Nry   r!   r�   )r   rU   r   r$   r   r–   )r™   rš   r›   ry   Úvaluesr   r   r   Ú_normalize_time_seriesX  s    


r¦   c              	   C   sh   g }|   ¡ D ]V\}}| d¡rt|tƒr| |t| d¡p<|ƒt| d¡tƒrX| d¡ng dœ¡ q|S )NZgraph_activityÚnameÚdata)r•   r§   r¨   )rS   Ú
startswithr   r   r–   r$   r   rU   )ÚnodeÚseriesr•   r!   r   r   r   Ú_pick_graph_activityh  s    ýÿr¬   Úrootc                    s0   g ‰ ‡ ‡‡fdd„‰ˆt | tƒr$| ni g ƒ ˆ S )Nc                    sô   t ˆ tƒsd S t‡ fdd„dD ƒƒrÄtˆ  d¡pB|r<|d nˆpBˆƒ}ˆ d |¡pZ|pZˆ|tˆ  d¡ƒtˆ  d¡p|ˆ  d	¡ƒt	ˆ ƒt
ˆ  d
¡ƒt
ˆ  d¡ƒt
ˆ  d¡ƒt
ˆ  d¡ƒdœdœ¡ d S ˆ  ¡ D ]"\}}t |tƒrÌˆ|||g ƒ qÌd S )Nc                 3   s   | ]}|ˆ kV  qd S r   r   ©r)   r•   ©rª   r   r   r+   }  s     z9_collect_nested_entities.<locals>.walk.<locals>.<genexpr>)r˜   Úalarms_by_tasaÚtasa_summaryr§   éÿÿÿÿú:r˜   r°   r±   Zgraph_feedingZgraph_perdidosZtasa_valuesZalarms_data)ÚgraphActivityÚgraphFeedingÚgraphPerdidosÚ
tasaValuesÚ
alarmsData)ÚentityIdrr   ÚvaluesSummaryÚ
alarmBandsÚtimeline)r   r   Úanyr$   r   r–   r,   rœ   r¤   r¬   r¦   rS   )rª   ÚpathÚentity_namer•   r!   ©rj   Úscope_labelÚwalkr¯   r   rÂ   y  s*    
"ûûÿ
z&_collect_nested_entities.<locals>.walkr   )Úanalytic_datarÁ   r   rÀ   r   Ú_collect_nested_entitiesv  s    rÄ   c                 C   s´   g }| D ]¦}dd„ |  dg ¡D ƒ}|  dg ¡D ]~}||  d¡|  d¡|  d¡dœ}| |  d	i ¡¡ |  |  d¡¡}|r¢|  d
¡|d< |  d¡|d< |  d¡|d< | |¡ q.q|S )Nc                 S   s   i | ]}|d  |“qS ©ry   r   ©r)   r‘   r   r   r   Ú
<dictcomp>›  s      z%_build_daily_rows.<locals>.<dictcomp>r»   rº   rr   r¹   ry   )Úscoperr   r¹   ry   r!   r¡   Zalarm_band_bajar¢   Zalarm_band_mediar£   Zalarm_band_alta)r   Úupdater–   )rj   Ú
scope_nameÚrowsÚentityZalarm_by_dayr‘   ÚrowZ	alarm_rowr   r   r   Ú_build_daily_rows˜  s"    ürÎ   c                 C   sÊ   |d t … }tdd„ |D ƒƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}	t|ƒt|ƒt|ƒt|	ƒdœ}
| ||||| d¡| d¡| d¡d	œ||
t|ƒt|ƒkt|ƒ|d d
… dœ}t|tƒrÆ|rÆ| |¡ |S )Nc                 S   s   h | ]}|  ¡ D ]}|’qqS r   )Úkeys)r)   rÍ   r•   r   r   r   Ú	<setcomp>¯  s     
  z"_build_snapshot.<locals>.<setcomp>c                 S   s    h | ]}|  d ¡r|  d ¡’qS ©rr   ©r   ©r)   rÍ   r   r   r   rÐ   °  s     
 c                 S   s    h | ]}|  d ¡r|  d ¡’qS rÅ   rÒ   rÓ   r   r   r   rÐ   ±  s     
 ©ÚrowCountZreturnedRowCountZentityCountZdayCountrm   rn   ro   rƒ   é   ©ÚschemaÚsourcerC   rË   ÚcolumnsZ	timeRangeZentityScopeÚstatsÚ	truncatedrÕ   Úsample)ÚMAX_SNAPSHOT_ROWSr—   Úlenr   r   r   rÉ   )rØ   rÙ   rC   Zentity_scoperË   ÚextraZlimited_rowsrÚ   Zentity_namesZ
day_valuesrÛ   Úsnapshotr   r   r   Ú_build_snapshot­  s6    üý
ñ
râ   c              	      s„   | sg S ddddddg}g }|D ]V‰ ‡ fdd„| D ƒ}|s<q t |‡ fd	d
„d�}| ˆ | d¡| d¡| ˆ ¡dœ¡ q |d d… S )NÚalarms_countr‰   rˆ   Ú	sfr_valueÚalarms_by_tonÚalarms_by_visitsc                    s$   g | ]}t | ˆ ¡ttfƒr|‘qS r   )r   r   r}   rž   rÓ   r”   r   r   rŽ   ß  s      z%_build_highlights.<locals>.<listcomp>c                    s   |   ˆ ¡pdS r|   rÒ   )rÍ   r”   r   r   r’   â  r“   z#_build_highlights.<locals>.<lambda>r”   rr   ry   )Úmetricrr   ry   r!   é   )Úmaxr–   r   )rË   Znumeric_keysÚ
highlightsZrankedÚtopr   r”   r   Ú_build_highlightsÑ  s.    úüÿrì   c                    s:   g ‰ ‡ ‡‡fdd„‰| pi   ¡ D ]\}}ˆ||g ƒ q ˆ S )Nc                    s
  t ˆ tƒsd S t‡ fdd„dD ƒƒrÔˆ| d |¡|r<|d nˆˆ  d¡dœ}ˆ  ¡ D ]*\}}t |tttt	fƒsv|d krT|||< qTˆ  d¡}t |tƒrÆd	D ],}t | |¡ttfƒr˜| |¡|d
|› �< q˜ˆ 
|¡ d S ˆ  ¡ D ](\}}t |tƒrÜˆ| ||t|ƒg ƒ qÜd S )Nc                 3   s   | ]}|ˆ kV  qd S r   r   r®   r¯   r   r   r+   õ  s     z9_build_feeder_score_rows.<locals>.walk.<locals>.<genexpr>)ÚscoreÚstatusrÈ   Zn_jaulas_scoredr³   r²   rÈ   )rÈ   ry   r¹   rr   ZfeederScopeÚreaction_time)ÚminÚavgZmean_secZp95_secZmax_secré   ÚnZreaction_time_)r   r   r½   r,   r   rS   r#   r}   rž   Úboolr–   )ry   rª   r¾   rÍ   r•   r!   rï   ©rË   rÊ   rÂ   r¯   r   rÂ   ñ  s,    
û




z&_build_feeder_score_rows.<locals>.walk)rS   )Úfeeder_score_datarÊ   ry   r9   r   rô   r   Ú_build_feeder_score_rowsî  s
    rö   c           	   	   C   s€  g }|   di ¡}dD ]z}|  |g ¡D ]h}|r<|  d¡|kr<q$|  dg ¡D ]B}|   d¡|   d¡|  d¡|dœ}t|tƒr€| |¡ | |¡ qHq$q|  dg ¡D ]h}|r´|  d¡|kr´qœ|  dg ¡D ]B}|   d¡|   d¡|  d¡ddœ}t|tƒrø| |¡ | |¡ qÀqœ|  d	g ¡D ]h}|  d
g ¡D ]T}|   d¡|   d¡|�p>d |  d¡|  d¡dœ}t|tƒ�rj| |¡ | |¡ �q"�q|S )Nr¼   )rµ   r¶   r·   ry   r!   rr   r¹   )rr   r¹   ry   r«   r¸   r´   r¨   r•   r§   )rr   r¹   ry   r«   ZactivityLabel)r   r   r   rÉ   r–   )	rÌ   Zselected_dayrË   r¼   Zseries_namer«   ÚpointrÍ   Zactivityr   r   r   Ú_build_time_window_rows  sN    ü

ü

û
rø   c                 C   sH   | sd S |s| d S t |ƒ}| D ]}t | d¡ƒ|kr |  S q | d S )Nr   rr   )r&   r   )rj   r¿   Zentity_name_lowerrÌ   r   r   r   Ú_pick_entity_for_time_windowB  s    
rù   z!/internal/agent-data/scapp/schemaÚPOST)Úmethodsc                  C   s  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| 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œg}d d!i |d"d#d$d%gd d&d'it|ƒt|ƒd(d(d)œdt|ƒg d*œ}|d+ d d,… |d-< td.||d/œƒd0fS )1NÚtraceIdZdelivered_foodzAlimento entregadoÚsum)rç   ÚlabelÚaggregationrä   ÚSFRÚaveragerã   ZAlarmasr‰   ZPPArˆ   ZVisitasrå   zAlarmas por toneladaZsum_of_visible_daily_metricræ   zAlarmas por visitaF)rç   rþ   rÿ   ÚformulaConfirmedzfeeder_score.scorezPuntuacion de alimentadorzfeeder_score.QzCalidad FeederScorezfeeder_score.sfr_bonuszBono SFR FeederScorezfeeder_score.porc_entregadozPorcentaje entregadozfeeder_score.reaction_time_avgzTiempo de reaccion promediozscapp.schema.v1zinternal.agent.schemarç   rþ   rÿ   r  ÚkindrØ   r   rÔ   r×   rË   rÖ   rÝ   T©r=   rü   rá   éÈ   )rB   r:   rc   r$   r   rß   r   )Ú
auth_errorr9   rd   Ú
user_errorÚtrace_idrË   rá   r   r   r   Úscapp_schemaO  s�    ýýýýýýüýýýýýÇ@
õr	  z+/internal/agent-data/scapp/center-analyticsc               
   C   s‚  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }|d }	t|||	gƒsztddddœƒd	fS t||||	ƒsªtdd
d|› d|	› d�dœƒdfS t	|ƒ\}
}}|rÀ|S z t
t|||	ƒ|
|d i dƒ}W n@ tk
�r  } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t| d|¡|	ƒ}t|dƒ}tdd|d|||	dœ|t|ƒdd„ |D ƒdœƒ}td||dœƒdfS )Nrü   r2   r3   r4   FÚinvalid_scopeú%region, area and centro are required.r<   r`   r;   ra   ú' has no Scapp access to Ú.r@   ro   TÚbackend_failureéô  rÃ   Úcenterzscapp.analytics.center.v1zinternal.agent.center©r  r2   r3   r4   c                 S   s   g | ]}|  d ¡‘qS rÑ   rÒ   ©r)   rÌ   r   r   r   rŽ   á  s     z*scapp_center_analytics.<locals>.<listcomp>©rê   ZentityNamesr  r  )rB   r:   rc   r$   r   rt   Úallr   re   r‡   r   r6   Ú	Exceptionr#   rÄ   rÎ   râ   rì   )r  r9   rK   rV   r  r  rC   r2   r3   r4   r…   Ú
time_rangeÚ
time_errorÚraw_datar>   rj   rË   rá   r   r   r   Úscapp_center_analytics¬  s\    "
û.
üþõr  z)/internal/agent-data/scapp/area-analyticsc               
   C   sr  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }t||gƒsptddddœƒdfS t|||ƒsžtdd	d
|› d|› d�dœƒdfS t	|ƒ\}	}
}|r´|S z&t
t|ƒ› dt|ƒ› �|	|
d ƒ}W n@ tk
�r } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t||ƒ}t|dƒ}tdd|
d||dœ|t|ƒdd„ |D ƒdœƒ}td||dœƒdfS )Nrü   r2   r3   Fr
  úregion and area are required.r<   r`   r;   ra   ú' has no Scapp access to area r  r@   r'   ro   r  r  zscapp.analytics.area.v1zinternal.agent.area©r  r2   r3   c                 S   s   g | ]}|  d ¡‘qS rÑ   rÒ   r  r   r   r   rŽ     s     z(scapp_area_analytics.<locals>.<listcomp>r  Tr  r  )rB   r:   rc   r$   r   rt   r  r   rf   r‡   r   r/   r  r#   rÄ   rÎ   râ   rì   )r  r9   rK   rV   r  r  rC   r2   r3   r…   r  r  r  r>   rj   rË   rá   r   r   r   Úscapp_area_analyticsè  sT    "ý.

ýþör  z+/internal/agent-data/scapp/region-analyticsc               
   C   s`  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|s`tddddœƒdfS t||ƒsŒtddd	|› d
|› d�dœƒdfS t|ƒ\}}	}
|
r¢|
S z(t	ƒ }|t
 }t|t|ƒ||	d ƒ}W n@ tk
�r
 } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t||ƒ}t|dƒ}tdd|	d|dœ|t|ƒdd„ |D ƒdœƒ}td||dœƒdfS )Nrü   r2   Fr
  úregion is required.r<   r`   r;   ra   ú ' has no Scapp access to region r  r@   ro   r  r  zscapp.analytics.region.v1zinternal.agent.region©r  r2   c                 S   s   g | ]}|  d ¡‘qS rÑ   rÒ   r  r   r   r   rŽ   P  s     z*scapp_region_analytics.<locals>.<listcomp>r  Tr  r  )rB   r:   rc   r$   r   rt   r   ri   r‡   r
   r   r   r/   r  r#   rÄ   rÎ   râ   rì   )r  r9   rK   rV   r  r  rC   r2   r…   r  r  rO   Úscapp_dbr  r>   rj   rË   rá   r   r   r   Úscapp_region_analytics  sV    
"ü.

þþ÷r"  z./internal/agent-data/scapp/feeder-score-centerc               
   C   st  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }|d }	t|||	gƒsztddddœƒd	fS t||||	ƒsªtdd
d|› d|	› d�dœƒdfS t	|ƒ\}
}}|rÀ|S z:t
ƒ }|t }t|t t|||	ƒ|
|
t|d d� ƒ}W n@ tk
�r: } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t|dƒ}tdd|d|||	dœ|ƒ}td||dœƒdfS )Nrü   r2   r3   r4   Fr
  r  r<   r`   r;   ra   r  r  r@   ro   r�   r  r  zfeeder-score-centerzscapp.feeder-score.center.v1z"internal.agent.feeder-score-centerr  r  Tr  r  )rB   r:   rc   r$   r   rt   r  r   re   r‡   r
   r   r   r   r6   r   r  r#   rö   râ   )r  r9   rK   rV   r  r  rC   r2   r3   r4   r…   r  r  rO   r!  Úfeeder_scorer>   rË   rá   r   r   r   Úscapp_feeder_score_centerW  sN    "
ü.
ûr$  z,/internal/agent-data/scapp/feeder-score-areac               
   C   sb  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }t||gƒsptddddœƒdfS t|||ƒsžtdd	d
|› d|› d�dœƒdfS t	|ƒ\}	}
}|r´|S z6t
ƒ }|t }t|t|ƒ› dt|ƒ› �|	|
d ƒ}W n@ tk
�r* } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t|dƒ}tdd|
d||dœ|ƒ}td||dœƒdfS )Nrü   r2   r3   Fr
  r  r<   r`   r;   ra   r  r  r@   r'   ro   r  r  zfeeder-score-areazscapp.feeder-score.area.v1z internal.agent.feeder-score-arear  Tr  r  )rB   r:   rc   r$   r   rt   r  r   rf   r‡   r
   r   r   r/   r  r#   rö   râ   )r  r9   rK   rV   r  r  rC   r2   r3   r…   r  r  rO   r!  r#  r>   rË   rá   r   r   r   Úscapp_feeder_score_area‰  sL    "ü.

ûr%  z./internal/agent-data/scapp/feeder-score-regionc               
   C   s@  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|s`tddddœƒdfS t||ƒsŒtddd	|› d
|› d�dœƒdfS t|ƒ\}}	}
|
r¢|
S z(t	ƒ }|t
 }t|t|ƒ||	d ƒ}W n@ tk
�r
 } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t|dƒ}tdd|	d|dœ|ƒ}td||dœƒdfS )Nrü   r2   Fr
  r  r<   r`   r;   ra   r  r  r@   ro   r  r  zfeeder-score-regionzscapp.feeder-score.region.v1z"internal.agent.feeder-score-regionr   Tr  r  )rB   r:   rc   r$   r   rt   r   ri   r‡   r
   r   r   r/   r  r#   rö   râ   )r  r9   rK   rV   r  r  rC   r2   r…   r  r  rO   r!  r#  r>   rË   rá   r   r   r   Úscapp_feeder_score_regionº  sJ    
"ü.
ûr&  z*/internal/agent-data/scapp/compare-centersc               
      s°  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}dd„ | dg ¡D ƒ}t|ƒdk rvtdddd	œƒd
fS t|ƒ\‰ }}‡ fdd„|D ƒ}	|	rÂtddd|› dd 	|	¡› d�d	œƒdfS t
|ƒ\}
}}|rØ|S z\g }|D ]N}t||
|d i dƒ}t| d|¡|ƒ}t|dƒD ]}||d< | |¡ �qqâW n@ tk
�rt } z tddt|ƒd	œƒdf W Y ¢S d }~X Y nX tdd|d|i–ddi|dt|ƒiƒ}td||dœƒdfS )Nrü   c                 S   s   g | ]}t |ƒrt |ƒ‘qS r   ©r$   rÆ   r   r   r   rŽ   ö  s      z)scapp_compare_centers.<locals>.<listcomp>r[   é   Fr
  z"At least two centers are required.r<   r`   c                    s   g | ]}t |ƒˆ kr|‘qS r   ©r&   rÆ   ©rW   r   r   rŽ   û  s      r;   ra   ú' has no Scapp access to: ú, r  r@   ro   TrÃ   zcompare-centersÚcomparisonTargetr  r  z"scapp.analytics.compare-centers.v1zinternal.agent.compare-centersr  rê   r  r  )rB   r:   rc   r$   r   rt   rß   r   r_   r,   r‡   r   rÄ   rÎ   r–   r  r#   râ   rì   )r  r9   rK   rV   r  r  rC   Z
center_idsrd   Údeniedr…   r  r  rË   r]   r  rj   rÍ   r>   rá   r   r*  r   Úscapp_compare_centersé  sL    (.

ú	r/  z(/internal/agent-data/scapp/compare-areasc               
      s¼  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}dd„ | dg ¡D ƒ}t|ƒdk rvtdddd	œƒd
fS t|ƒ\}‰ }‡ fdd„|D ƒ}	|	rÂtddd|› dd 	|	¡› d�d	œƒdfS t
|ƒ\}
}}|rØ|S zhtƒ }|t }|d }g }|D ]D}t|||
|d ƒ}t||ƒ}t|dƒD ]}||d< | |¡ �q"qøW n@ tk
�r€ } z tddt|ƒd	œƒdf W Y ¢S d }~X Y nX tdd|d|i–ddi|dt|ƒiƒ}td||dœƒdfS )Nrü   c                 S   s   g | ]}t |ƒrt |ƒ‘qS r   r'  rÆ   r   r   r   rŽ   '  s      z'scapp_compare_areas.<locals>.<listcomp>rs   r(  Fr
  z At least two areas are required.r<   r`   c                    s   g | ]}t |ƒˆ kr|‘qS r   r)  rÆ   ©rX   r   r   rŽ   ,  s      r;   ra   r+  r,  r  r@   Údata_analyticro   zcompare-areasr-  r  r  z scapp.analytics.compare-areas.v1zinternal.agent.compare-areasr  rê   Tr  r  )rB   r:   rc   r$   r   rt   rß   r   r_   r,   r‡   r
   r   r   rÄ   rÎ   r–   r  r#   râ   rì   )r  r9   rK   rV   r  r  rC   Zarea_idsrd   r.  r…   r  r  rO   r!  Ú
collectionrË   Úarea_idr  rj   rÍ   r>   rá   r   r0  r   Úscapp_compare_areas  sR    (
.

ú	r4  z'/internal/agent-data/scapp/live-summaryc                   C   s   t ddddœƒdfS )NFÚgonez,Live summary fue dado de baja el 2026-07-29.r<   iš  )r   r   r   r   r   Úscapp_live_summaryN  s    ýür6  z&/internal/agent-data/scapp/time-windowc                  C   sº  t ƒ } | r| S tƒ }t|ƒ\}}}|r*|S t| d¡ƒ}t|ƒ}|d }|d }|d }	t|||	gƒsztddddœƒd	fS t||||	ƒsªtdd
d|› d|	› d�dœƒdfS t	|ƒ\}
}}|rÀ|S z t
t|||	ƒ|
|d i dƒ}W n@ tk
�r  } z tddt|ƒdœƒdf W Y ¢S d }~X Y nX t| d|¡|	ƒ}t|| d¡ƒ}|�s^tddddœƒdfS t|| d¡ƒ}tdd|| d¡| d¡dœ–d|||	| d¡dœ|ƒ}td||dœƒdfS ) Nrü   r2   r3   r4   Fr
  r  r<   r`   r;   ra   r  r  r@   ro   Tr  r  rÃ   rr   Úemptyz5No timeline data was found for the current selection.rb   rq   zscapp.analytics.time-window.v1zinternal.agent.time-window)rq   rr   ztime-window)r  r2   r3   r4   rr   r  r  )rB   r:   rc   r$   r   rt   r  r   re   r‡   r   r6   r  r#   rÄ   rù   rø   râ   )r  r9   rK   rV   r  r  rC   r2   r3   r4   r…   r  r  r  r>   rj   rÌ   rË   rá   r   r   r   Úscapp_time_windowW  s^    "
û.ûõr8  )r­   )N)QÚjsonr   Úcollectionsr   r   r   Úflaskr   r   r   Úshared_db_utilsr   r	   r
   ÚAnalytic.Scapp_analyticsr   r   r   r   ÚAnalytic.centro_idsr   ÚAnalytic.Scapp_feeder_scorer   r   r   r   Ú__name__Úagent_data_bpr}   r   r   rÞ   rh   r   r"   r$   r&   r/   r5   r6   r:   rB   rE   rG   rI   rL   rP   r_   rc   re   rf   ri   rt   r{   r€   r‡   r‹   rœ   rŸ   r¤   r¦   r¬   rÄ   rÎ   râ   rì   rö   rø   rù   Úrouter	  r  r  r"  r$  r%  r&  r/  r4  r6  r8  r   r   r   r   Ú<module>   sŠ   



"
$#1
\
;
6
7
1
0
.
0
3
