U
    ^¨jT  ã                   @   s`   d dl m Z mZmZ d dlmZ ddlmZ dZdZdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ ZdS )é    )ÚdatetimeÚ	timedeltaÚtimezone)ÚCollectionInvalidé   )Ú_to_utc_datetimeZgenerador_comap_timeseriesé   c                 C   s   |   d¡\}}}|› dt› �S )u>   Construye el nombre de la colecciÃ³n COMAP dedicada al centro.Ú-Ú_)ÚsplitÚCOMAP_COLLECTION_SUFFIX)Ú	centro_idr
   Úcentro© r   ú3/var/www/itgmanager/itgmanager/nanoox/comap_data.pyÚget_comap_collection_name   s    r   c              
   C   sœ   ||   ¡ kr”zr| j|ddddœd�}z|jddgdd	� W n@ tk
rz } z"td
|› d|jj› d|› �ƒ W 5 d}~X Y nX W n tk
r’   Y nX | | S )u0   Crea la time-series COMAP si todavÃ­a no existe.Ú	timestampÚcomap_idÚminutes)Ú	timeFieldÚ	metaFieldÚgranularity)Ú
timeseries)r   r   )r   éÿÿÿÿZidx_comap_latest)Únameu&   No fue posible crear Ã­ndice COMAP en ú linea ú: N)Úlist_collection_namesÚcreate_collectionÚcreate_indexÚ	ExceptionÚprintÚ__traceback__Ú	tb_linenor   )ÚdbÚcollection_nameÚ
collectionÚer   r   r   Ú_ensure_comap_collection   s*    ýþþ
ÿr(   c                 C   sö  �z¬|rt |tƒs&td|› �ƒ W dS | d¡}t |tƒr>|sRtd|› �ƒ W dS t|ƒ}g }| ¡ D ]ü\}}|r|t |tƒs’td|› d|› �ƒ qf| d¡}|s¶td|› d	|› �ƒ qfzt|ƒ}	W nP tk
�r }
 z0td
|› d|› d|
jj	› d|
› �ƒ W Y ¢qfW 5 d}
~
X Y nX t
|dƒ�r(| ¡ nt|ƒ}t|ƒ}| |	||||› d|› �dœ¡ | |¡ qf|�spW dS t| |ƒ}|j|dd� tdt|ƒ› d|› d|› �ƒ t|ƒW S  tk
�rð }
 z"td|
jj	› d|
› �ƒ W Y ¢dS d}
~
X Y nX dS )u-  
    Guarda un documento por generador y recepciÃ³n en la time-series del centro.

    No deduplica: si el centro reenvÃ­a una mediciÃ³n, se conserva nuevamente.
    La fecha visible se mantiene en ``timestamp_str`` y ``timestamp`` contiene
    el BSON Date UTC requerido por MongoDB time-series.
    u   Sin bloque COMAP vÃ¡lido para r   Ú
generatorszSin generadores COMAP para u#   Generador COMAP vacÃ­o o invÃ¡lido z para r   zGenerador COMAP z sin timestamp para u   Timestamp COMAP invÃ¡lido para ú/r   r   NÚ	isoformatr	   )r   Útimestamp_strr   Úgenerador_namer   F)Úorderedz
Guardados z documentos COMAP en zError en save_comap_data linea )Ú
isinstanceÚdictr!   Úgetr   Úitemsr   r    r"   r#   Úhasattrr+   ÚstrÚupdateÚappendr(   Úinsert_manyÚlen)r$   r   Úgenerators_comapr)   r%   Ú	documentsÚgenerator_nameÚgenerator_dataÚreceived_timestampZtimestamp_utcr'   r,   Údocumentr&   r   r   r   Úsave_comap_data4   sl    
ÿ
ÿÿÿýûÿ	
ÿ
r?   c                 C   sH   t | tƒsdS |  d¡}t |tƒs&dS dd„ | ¡ D ƒ}|rDt|ƒS dS )zÚDevuelve el timestamp mas reciente del bloque COMAP, o None.

    Un centro COMAP puro no tiene modulos ni bombas, asi que la hora del
    endpoint no puede salir de ahi: se toma del ultimo snapshot del generador.
    Nr)   c                 S   s0   g | ](}t |tƒrt | d ¡tƒr| d ¡‘qS )r   )r/   r0   r1   r4   )Ú.0Údatar   r   r   Ú
<listcomp>�   s   
 þz.get_latest_comap_timestamp.<locals>.<listcomp>)r/   r0   r1   ÚvaluesÚmax)r9   r)   Z
timestampsr   r   r   Úget_latest_comap_timestampƒ   s    


þrE   c              
   C   sX  di i}�zt |ƒ}||  ¡ kr&|W S t tj¡ttd� }ddd|iiidddd	œid
dddidœig}| | j|dd�D ]–}| 	d¡}| 	d¡}|r|t
|tƒs¤q|t|ƒ}	|	 dd¡}
|	 dd¡ |	 dd¡ |	 dd¡ |	 dd¡ |	 dd¡ |
dk	�r|
|	d< |	|d |< q|W n< tk
�rR } ztd|jj› d|› �ƒ W 5 d}~X Y nX |S )uJ   Devuelve el Ãºltimo snapshot de cada generador con el contrato del emisor.r)   )Údaysz$matchr   z$gtez$sortr   r   )r   r   z$groupz$generador_namez$firstz$$ROOT)Ú_idÚsnapshotT)ÚallowDiskUserG   rH   r,   Nr   r-   r   z%Error en get_latest_comap_data linea r   )r   r   r   Únowr   Úutcr   ÚCOMAP_LATEST_WINDOW_DAYSÚ	aggregater1   r/   r0   Úpopr    r!   r"   r#   )r$   r   Úresponser%   Zfecha_limiteÚpipelineÚresultr;   rH   r<   Zoriginal_timestampr'   r   r   r   Úget_latest_comap_data™   sD    ÿþÿý


*rR   N)r   r   r   Úpymongo.errorsr   Ú	save_datar   r   rL   r   r(   r?   rE   rR   r   r   r   r   Ú<module>   s   O