U
    —âñjR/  ã                   @   s  d dl mZ d dlZd dlZd dlmZmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ dd	„ Zd
d„ ZeddƒZdddddddœZeed  Zeed  Zeed  Zeed  Zeed  Zeed  ZdZdddœZd%dd„Zd&dd„Zdd „ Zd!d"„ Zd#d$„ Z e ƒ Z!dS )'é    )ÚMongoClientN)ÚdatetimeÚtimezoneé   )Úupdate_scapp_db_versionÚget_scapp_db_versionÚrefactorice_indices_camerasÚtransform_to_timeseriesÚensure_data_compose_index)Úensure_data_analytic_collection)Úensure_visitas_coll_and_indexc                 C   s   t | ƒ d S ©N©Úprint©Útext© r   úG/var/www/itgmanager/itgmanager/Analytic/scapp_database/load_scapp_db.pyÚmain_logger   s    r   c                 C   s   t | ƒ d S r   r   r   r   r   r   Údatabase_logger   s    r   zmongodb://localhost/i‰i  ÚScappDBÚcamerasÚdataÚdata_analyticZdata_visitasÚ
parameters)Údatabaser   r   Ú	analyticsÚvisitasr   r   r   r   F)Úcameras_collectionÚdata_collectionTc              
   C   sR  i }t   ¡ }zªd| |dœi}ddi}t ||¡ dd¡}d}	|D ]r}
|
d }||kr\g ||< |r¤d|
kr¤t|
d tƒr¤|
d jtjd�|
d< |
d  	¡ |
d< |	d7 }	||  
|
¡ q@W n: tk
rð } ztd|jj› d	|› �ƒ W 5 d
}~X Y nX |�rN| ¡ D ]"\}}tdt|ƒ› d|› �ƒ �q tƒ  td|	› dt   ¡ | d d›d�ƒ |S )u±   Retorna un diccionario que contiene toda la informaciÃ³n de BD entre los dÃ­as start_of_day y end_of_day
        El diccionario utiliza como llave los indices de las cÃ¡maras, teniendo como value un array con todos los datos de la BD
        Cada dato es un diccionario:
            {
                timestamp: 2024-06-27T12:03:26.000+00:00,
                camera_id = "1-A",
                                        # metadata: { -> VersiÃ³n Obsoleta, ya no existe el campo
                                        #     Dia: "2024-06-27",
                                        #     Jaula: "1-A",
                                        # },
                Detecciones: {
                    perdidos: 0,
                    detectados: 0,
                    nivel_actividad: 26.04,
                    umbral_alarma: 3,
                    perdidos_propios: 0,
                },
                Alimentacion: {
                    use_feeding_api: false,
                    detection_active: false,
                    Comida_entregada: 0,
                    Meta_dia: 0,
                    Porc_entregado: 0,
                    Tasa: 0,
                    Dia: 0,
                    Feeding_active: false,
                    Unidad_Medida: "kg/min",
                    Metodo_alimentacion: "Saciedad",
                    feeding_api_type: "AkvaControl",
                },
                Posicion: {
                    x_pos: "-",
                    y_pos: "-",
                    winche_connected: false,
                },
                Sensores: {
                    temp: "-"
                }
            }
        
    @Params
        - start_of_day (datetime): Fecha en formato datetime ( Puede obtenerse mediante datetime.now() )
        - end_of_day (datetime): Fecha en formato datetime ( Puede obtenerse mediante start_of_day + timedelta(days=1) )
        - verbose (bool): Flag para imprimir informaciÃ³n adicional por consola
    Ú	timestamp)z$gtez$ltÚ_idr   r   Ú	camera_id)Útzinfou(   Error leyendo documentos de dÃ­a de hoy z : Nz	Cargados z Datos para el canal z Se han convertido a formato iso z elementos, tardando g     @�@z.2fz ms.)Útimer   ÚfindÚsortÚ
isinstancer   Úreplacer   ÚutcÚ	isoformatÚappendÚ	Exceptionr   Ú__traceback__Ú	tb_linenoÚitemsÚlenr   )Ústart_of_dayÚ
end_of_dayÚverboseÚconvert_to_isoZdocuments_by_jaulaÚt1ÚqueryÚ
projectionÚcursorZ	parsed_tsÚdocÚjaulaÚer   r   r   r   Úfetch_data_collection9   s6    . ÿ* $r<   c           
   
   C   sê   z®|   d¡}t d|i¡}i }|D ]†}| d¡}| dg ¡}|r"|sFq"|r |D ]P}d|krxt|d tƒrx|d  ¡ |d< d|krNt|d tƒrN|d  ¡ |d< qN|||< q"|W S  tk
rä }	 ztd|› d|	› �ƒ W 5 d	}	~	X Y nX i S )
u°   ### ? Obtiene las visitas de todas las jaulas para una fecha dada en la colecciÃ³n data_visitas.
    
    @param datetime_day (datetime): Fecha para la cual recopilar datos
    @return: Diccionario con la estructura 
            { 
                'jaula1': visitas_jaula1, 
                'jaula2': visitas_jaula2, 
                ... 
            }
            
            Donde cada visita tiene el formato:
            [
                {
                    duracion: 75.04,
                    racion: 0,
                    inicio: 2024-10-17T17:23:05.000+00:00,
                    final: 2024-10-17T17:24:20.000+00:00
                },
                ...
            ]
    z%Y-%m-%dÚdayr"   ÚVisitasÚinicioÚfinalu&   Error obteniendo visitas para el dÃ­a ú: N)	ÚstrftimeÚvisitas_collectionr%   Úgetr'   r   r*   r,   r   )
Zdatetime_dayr4   Zdiar8   Zvisitas_por_jaular9   r:   r   Zvisitar;   r   r   r   Úfetch_visitas_collection”   s(    

 	
&rE   c              	   C   s@   z*t | ddd��}t |¡}W 5 Q R X |W S    i  Y S X d S )NÚrzutf-8)Úencoding)ÚopenÚyamlZ	safe_load)ÚfilenameÚfiler   r   r   r   Ú	read_yamlÓ   s    rL   c              
   C   s\   z | |   ¡  td|› d�ƒ W n6 tk
rV } ztd|› d|› �ƒ W 5 d }~X Y nX d S )Nu   ColecciÃ³n z eliminada satisfactoriamente.
u   Error eliminando colecciÃ³n: rA   )Údropr   r,   )ÚdbÚcollection_namer;   r   r   r   Údrop_collectionÛ   s
    rP   c               
   C   s´  t dƒ} |  di ¡ dd¡}|r<tƒ  tdƒ tttd ƒ d}ttƒ}| dd¡t	d k r¶z$t
tƒ ttdt	d ƒ td	ƒ W q¾ tk
r² } ztd
|› d�ƒ W 5 d }~X Y q¾X ntdƒ tttd ƒ | dd¡t	d k �rRz8td ddddœ}tt|ƒ ttdt	d ƒ tdƒ W n4 tk
�rN } ztd|› d�ƒ W 5 d }~X Y nX ntttd  ƒ tdƒ ztttd ƒ W n2 tk
�r® } ztd|› �ƒ W 5 d }~X Y nX |S )NzconfigScapp.yamlZAnalytic_delete_saved_dataÚvalueFu3   Se ha solicitado eliminar colecciÃ³n de analÃ­tica.r   r   r   u6   ActualizaciÃ³n de base de datos de cÃ¡maras correcta.
uB   Error refactorizando colecciÃ³n de cÃ¡maras en la Base de Datos: 
Ú
u'   ColecciÃ³n de cÃ¡maras ya actualizada.
r   r   r   Zdata_oldZmigration_log)Ztarget_collectionZold_collectionZlog_filer3   u'   MigraciÃ³n a series de tiempo exitosa.
u3   Error migrando colecciÃ³n data a series de tiempo: u2   ColecciÃ³n data ya actualizada a Series de Tiempo
u2   No se pudo verificar la colecciÃ³n de analÃ­tica: )rL   rD   r   r   rP   Úscapp_dbÚdatabase_namesr   Úparameters_collectionÚactual_db_versionsr   r   r   r   r,   r   r	   r
   r   )ZconfigsZdelete_analyticsÚalways_activeZreaded_db_versionr;   ÚargsÚerrorr   r   r   ÚScapp_loadDBã   sH     $ü
$ rZ   )FT)F)"Úpymongor   rI   r$   r   r   Zrefactorizationr   r   r   r	   r
   Zutils.analytic_database_utilsr   Zutils.db_colection_utilsr   r   r   ÚclientrT   rS   r   r   r   rC   rU   ÚVERBOSErV   r<   rE   rL   rP   rZ   rW   r   r   r   r   Ú<module>   sB   
úþ
[
??