U
    ^¨j¿  ã                	   @   sæ   d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
mZ ddd	œZe e¡Zd
ZdZdZeeeeee dœdd„Zefeeeeee eedœdd„Zeeeeedœdd„Zeeeedœdd„Zedkrâedƒ edƒ dS )ué  
===============================================================================
 Archivo:        email_notifications.py
 Autor:          EsteBandurria
 Fecha creaciÃ³n: 2026-02-03
 VersiÃ³n:        1.0.0
===============================================================================
 DescripciÃ³n:
    MÃ³dulo de utilidades para la gestiÃ³n de listas de correos de emergencia 
    en MongoDB. Contiene lÃ³gica para lectura y escritura atÃ³mica (bulk write)
    de arrays de emails basados en identificadores compuestos (RegiÃ³n-Ã�rea-Centro).

===============================================================================
 Copyright:
    Â© 2026 ITG Chile. Todos los derechos reservados.
    Este archivo es parte del proyecto ITG Service Manager y se distribuye bajo
    los tÃ©rminos de la licencia Privada/Corporativa.

===============================================================================
 Interface Change List:
    VersiÃ³n     Fecha        Autor                DescripciÃ³n del cambio
    ---------   ----------   ------------------   ---------------------------
    v1.0.0      2026-02-03   EsteBandurria        ImplementaciÃ³n inicial lÃ³gica Mongo
    
===============================================================================
é    N)ÚListÚDict)Ú	UpdateOne)Ú
Collection)ÚPyMongoErrorÚBulkWriteErrorFÚINFO)ÚdebugZ	log_levelÚaddÚremoveÚset)Údb_collectionÚregionÚareaÚcentroÚreturnc              
   C   sš   z8t |||ƒ}|  d|idddœ¡}|r4| dg ¡ng W S  tk
r” } z>|jrX|jjnd}t d|› d|› �¡ td	t	|ƒ› �ƒ‚W 5 d
}~X Y nX d
S )z'Busca los emails asociados a un centro.Ú_idé   r   )Úemailsr   r   ÚUnknownúError ú
 en linea zDatabase Read Error: N)
Ú_generate_composite_idÚfind_oneÚgetr   Ú__traceback__Ú	tb_linenoÚloggerÚerrorÚRuntimeErrorÚstr)r   r   r   r   Z	search_idÚdocÚer   © r#   ú=/var/www/itgmanager/itgmanager/modules/email_notifications.pyÚfetch_emails_by_locationG   s    r%   )r   r   r   r   r   Ú	operationr   c              
   C   sz  zºt |||ƒ}|tkr,ddd|iii}d}nZ|tkrJddd|iii}d}n<|tkrddd|ii}d}n"td	|› d
t› dt› dt› d�	ƒ‚td|i||d�g}	| j|	dd�}
|
j|
j|
j	dœW S  t
k
�r } z<|jrÜ|jjnd}t d|› d|› �¡ td|j› �ƒ‚W 5 d}~X Y n` tk
�rt } z@|j�r8|jjnd}t d|› d|› �¡ tdt|ƒ› �ƒ‚W 5 d}~X Y nX dS )zÁ
    Actualiza la lista de emails.
    operation='set': Reemplaza la lista actual por la nueva (Snapshot).
    operation='add': Agrega elementos.
    operation='remove': Elimina elementos.
    z	$addToSetr   z$eachTz$pullz$inFz$setu   OperaciÃ³n invÃ¡lida 'z'. Use 'z', 'z' o 'z'.r   )Úupsert)Úordered)ÚmatchedÚmodifiedÚupsertedr   zError BulkWrite r   zBulk Write Error: Nr   zDatabase Write Error: )r   ÚOP_ADDÚ	OP_REMOVEÚOP_SETÚ
ValueErrorr   Ú
bulk_writeÚmatched_countÚmodified_countÚupserted_countr   r   r   r   r   r   Údetailsr   r    )r   r   r   r   r   r&   Údoc_idÚupdate_queryZ	do_upsertÚrequestsÚresultÚbwer   r"   r#   r#   r$   Úupdate_emailsR   s4    "ý r:   c              
   C   sd   z&t |||ƒ}|  d|i¡}|jdkW S  tk
r^ } zt d|› �¡ W Y ¢dS d}~X Y nX dS )u{   
    Elimina fÃ­sicamente el documento de emails asociado al centro.
    Usar cuando se elimina el centro del sistema.
    r   r   z%Error eliminando lista de contactos: FN)r   Ú
delete_oneÚdeleted_countr   r   r   )r   r   r   r   r5   r8   r"   r#   r#   r$   Údelete_contact_list}   s    r=   )r   r   r   r   c                 C   s,   |   ¡  ¡ › d|  ¡  ¡ › d|  ¡  ¡ › �S )uÔ  
    DescripciÃ³n:
        FunciÃ³n auxiliar privada para generar y normalizar el ID compuesto.
        Aplica formato Title Case y elimina espacios extra.
        Formato: Region-Area-Centro (ej. "Norte-Operaciones-Bodega1")
        
        Verbo estÃ¡ndar: generate (GeneraciÃ³n)
    
    ParÃ¡metros:
        region (str): Input regiÃ³n.
        area (str): Input Ã¡rea.
        centro (str): Input centro.

    Retorna:
        str: ID compuesto normalizado.
    Ú-)ÚstripÚtitle)r   r   r   r#   r#   r$   r   Ž   s    r   Ú__main__u,   Este mÃ³dulo es una librerÃ­a de utilidades.z>Funciones disponibles: fetch_emails_by_location, update_emails)Ú__doc__ÚloggingÚtypingr   r   Úpymongor   Úpymongo.collectionr   Úpymongo.errorsr   r   ZDEFAULT_CONFIGÚ	getLoggerÚ__name__r   r,   r-   r.   r    r%   r:   Úboolr=   r   Úprintr#   r#   r#   r$   Ú<module>   s&   	þ
"+