U
    —âñj¬3  ã                   @   sˆ   d dl mZ dd„ Zd dd„Zdd„ Zd	d
„ Zdd„ Zeedœdd„Zedœdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!é    ©Úensure_analytic_collectionc                 C   s   t | ƒ d S )N)Úprint)Útext© r   úW/var/www/itgmanager/itgmanager/Analytic/scapp_database/utils/analytic_database_utils.pyÚdata_analytic_logger   s    r   Údata_analyticc                 C   s
   t | |ƒS )z{ Args:
        - database: Instancia de la bd de MongoDB.
        - database_name: Nombre de la coleccion objetivo
        r   )ÚdatabaseÚdatabase_namer   r   r   Úensure_data_analytic_collection   s    r   c              
   C   sº   z,||dœ|dœ}ddi}t |  ||¡ƒ}W nB tk
rn } z$td|jj› d|› �ƒ i  W Y ¢S d}~X Y nX i }|D ]<}	|	d  d	¡}
| |
i ¡ |	 d
¡}|	 di ¡||
 |< qx|S )uu  
    Obtiene los documentos de analÃ­tica almacenados en la base de datos para un rango de dÃ­as y
    los ordena por dÃ­a y por jaula, devolviendo un diccionario con el formato:
    
        {
          'dd/mm/YYYY': {
              <jaula_id>: { ...data... },
              <jaula_id2>: { ...data... },
              ...
          },
          ...
        }
    
    @params:
      - collection: ColecciÃ³n de MongoDB donde se almacenan los datos.
      - center_id (str): ID de centro, en formato string, correspondiente al identificador Ãºnico de cada centro.
      - start_day (datetime): Fecha de inicio (incluida).
      - end_day (datetime): Fecha final (exclusiva).
    
    @returns:
      - grouped_data (dict): Datos agrupados por dÃ­a y por jaula.

      {
        'dd/mm/YYYY': {
            <jaula_id>: { ...data... },
            ...
        },
        ...
      }
    ©z$gtez$lt)Ú	timestampÚ	centro_idÚ_idr   õ'   Error leyendo documentos de analÃ­tica ú : Nr   ú%d/%m/%YÚ	camera_idÚdata)	ÚlistÚfindÚ	Exceptionr   Ú__traceback__Ú	tb_linenoÚstrftimeÚ
setdefaultÚget)Ú
collectionÚ	center_idÚ	start_dayÚend_dayÚqueryÚ
projectionÚdocsÚeÚgrouped_dataÚdocÚdayÚjaula_idr   r   r   Úfetch_analytic_data   s     þ
r*   c                 C   sr   |   |¡ t|ƒdkr$t|ƒ› d�nt|ƒ› d�}t|ƒdkrLt|ƒ› d�nt|ƒ› d�}td|› d|› �ƒ dS )	u¢   ### ? Almacena los datos de analÃ­tica en la coleccion correspondiente
     @params
     - docs_array [docs]  : Array de documentos a aÃ±adir en la colecciÃ³n, { timestamp, camera_id, data }
        - data: one_day_data (dict): Diccionario de los datos del dÃ­a:
            { jaula: { sfr_value, delivered_food, tasa_units, tasa_values,  tasa_data, fasts_count, feeding_time_range, alarms_data, alarms_count } }
    é   u    dÃ­asu    dÃ­az jaulas.z jaula.z"Almacenado correctamente datos de z, con un total de N)Úinsert_manyÚlenr   )r   Ú
docs_arrayÚ
saved_daysÚinfoZ
info_jaular   r   r   Úsave_analytics_data€   s    
((r1   c              
   C   sÎ   zt | |||ƒ}W nB tk
rT } z$td|jj› d|› �ƒ i  W Y ¢S d}~X Y nX i }|D ]j}|d  d¡}||kr€i ||< | d¡}	| d¡}
|
› d|	› �}| d	i ¡}| d|
i¡ ||| |< q^|S )
uù   Obtiene los documentos de analÃ­tica almacenados en la base de datos para un rango de dÃ­as y
    los ordena por dÃ­a y por jaula, devolviendo un diccionario con el formato:
    
        {
          'dd/mm/YYYY': {
              <jaula_id>: { ...data... },
              <jaula_id2>: { ...data... },
              ...
          },
          ...
        }
    
    @params:
      - collection: ColecciÃ³n de MongoDB donde se almacenan los datos.
      - center_id (str): ID de centro, en formato string, correspondiente al identificador Ãºnico de cada centro.
      - start_day (datetime): Fecha de inicio (incluida).
      - end_day (datetime): Fecha final (exclusiva).
    
    @returns:
      - grouped_data (dict): Datos agrupados por dÃ­a y por jaula.
    r   r   Nr   r   r   r   Ú-r   )Úget_docs_by_date_and_arear   r   r   r   r   r   Úupdate)r   Úarear    r!   r$   r%   r&   r'   r(   r)   r   Ú	object_idÚdata_to_packr   r   r   Úfetch_analytic_area_data�   s"    

r8   )r   Úprefijo_objetivoc                 C   sf   |}|}dd||dœiiddddddd	d
gidgid
ddd	d
gidgigi|giiig}t |  |¡ƒS )zÈ
    Conecta a MongoDB y devuelve los docs cuyo campo 'timestamp' caiga
    dentro del rango de fechas indicado y cuyo 'centro_id' coincida en
    los dos primeros segmentos con prefijo_objetivo.
    ú$matchr   r   z$exprz$eqz$concatz$arrayElemAtz$splitz
$centro_idr2   r   r+   ©r   Ú	aggregate)r   r9   Ú
start_dateÚend_dateÚfecha_inicialÚfecha_finalÚpipeliner   r   r   r3   À   s8    þÿ
 ÿ
 ÿû	öÿÿör3   )Úregion_prefijoc                 C   s<   dd||dœiidddd|› d�iiig}t |  |¡ƒ}|S )uŽ   
    Devuelve documentos cuyo campo 'centro_id' comienza con 'region_prefijo'
    y cuyo 'timestamp' estÃ¡ dentro del rango especificado.
    r:   r   r   r   z$regexú^r2   r;   )r   rB   r=   r>   rA   Úresultr   r   r   Úget_docs_by_regionô   s    þÿ ÿ÷rE   c           	   
   C   sÄ   z| } W nB t k
rJ } z$td|jj› d|› �ƒ i  W Y ¢S d }~X Y nX i }| D ]j}|d  d¡}||krvi ||< | d¡}| d¡}|› d|› �}| di ¡}| d|i¡ ||| |< qT|S )	Nr   r   r   r   r   r   r2   r   )r   r   r   r   r   r   r4   )	r$   r%   r&   r'   r(   r)   r   r6   r7   r   r   r   Úfetch_analytic_region_data  s"    

rF   c                
   C   s   g g g g g g g g g dœ	S )N)	Úalarms_by_tonÚalarms_countÚalarms_thresholdÚdelivered_foodÚfasts_countÚperdidos_countÚ	sfr_valueÚ
tasa_unitsÚvisitas_countr   r   r   r   r   Ú_init_value_summary,  s          ýrP   c                   C   s$   dt ƒ dœdt ƒ dœdt ƒ dœdœS )Nr   )ÚalarmÚtasas)ÚaltaÚmediaÚbaja)Úsetr   r   r   r   Ú_init_tasa_summary3  s    


ýrW   c                 C   sf   |   ¡ D ]X\}}|dkr6|r,t|ƒt|ƒ nd| |< q|dkrT|rJ|d nd | |< qt|ƒ| |< q| S )N)rM   rI   r   rN   )ÚitemsÚsumr-   Úvalidar_y_sumar)ÚresumenÚkeyÚvalsr   r   r   Ú_postprocess_values;  s    r^   c                 C   s&   |   ¡ D ]\}}t|d ƒ|d< q| S )NrR   )rX   r   )Z
ts_summaryZlvlr0   r   r   r   Ú_postprocess_tasaF  s    r_   c                 C   sh   zdd„ | D ƒ}t |ƒW S  tk
rb   zdd„ | D ƒ}t |ƒW  Y S  tk
r\   Y Y d S X Y nX d S )Nc                 S   s   g | ]}t |ƒ‘qS r   )Úint©Ú.0Úxr   r   r   Ú
<listcomp>N  s     z#validar_y_sumar.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )Úfloatra   r   r   r   rd   S  s     )rY   Ú
ValueError)ÚlistaZnumerosr   r   r   rZ   K  s    
rZ   N)r	   )Úshared_db_utilsr   r   r   r*   r1   r8   Ústrr3   rE   rF   rP   rW   r^   r_   rZ   r   r   r   r   Ú<module>   s"   
	p2þ6þ 