U
    shU4                     @   s  d Z ddlZddlZddlmZ ddlmZmZmZ ddlZddlm	Z	 ddl
mZmZ eeZG dd dZe Zdeeeeef  d	d
dZdeeeeeef  dddZeedddZeeeef dddZdee ee ee dddZd edddZdS )!z
Centralized error logging configuration for the AI Test Case Generator application.
This module provides error tracking functionality using MongoDB and email notifications.
    N)datetime)DictAnyOptional)MongoClient)MONGODB_URI
MONGODB_DBc                
   @   s,  e Zd Zdd Zd!eeeeeeef  eeeef  eeeef  dddZd"e	eeeef  dd	d
Z
d#eeeeeef  dddZeedddZeeeef dddZd$ee ee ee dddZe	edddZe	eeef dddZd%eee ee ee eeef ddd ZdS )&ErrorLoggerc              
   C   s   z<t tdd| _| j  | jt | _| jj| _t	d W nH t
k
r } z*tdt|  d| _d| _d| _W 5 d}~X Y nX dS )z3Initialize the error logger with MongoDB connectioni  )ZserverSelectionTimeoutMSz%Error logger initialized successfullyz#Failed to initialize error logger: N)r   r   clientZserver_infor   ZdbZ
error_logserror_collectionloggerinfo	Exceptionerrorstr)selfe r   ?/var/www/html/testcasegenerator.evdpl.com/utils/error_logger.py__init__   s    

zErrorLogger.__init__r   N)
error_typemessagelevelcontexttagsuser_contextc           	   
   C   s   z| j dkr0td t| d|  W dS t |||tdddd}|rZ||d< |rf||d	< |rr||d
< | j | td| d|  W nJ t	k
r } z,tdt
|  t| d|  W 5 d}~X Y nX dS )a  
        Internal method to log errors to MongoDB
        
        Args:
            error_type: Type of error (exception, message, etc.)
            message: Error message or description
            level: Log level (debug, info, warning, error, critical)
            context: Additional context data
            tags: Tags for categorization
            user_context: User information
        Nz@Error collection not available, falling back to standard loggingz: Z	FLASK_ENVdevelopmentai-test-case-generator)	timestampr   r   r   environmentservicer   r   r   zError logged to MongoDB: z - z Failed to log error to MongoDB: )r   r   r   r   utcnowosgetenvZ
insert_oner   r   r   )	r   r   r   r   r   r   r   Z	error_docr   r   r   r   
_log_error    s.    


	zErrorLogger._log_error	exceptionr   c                 C   sP   t |jt|| |d}|r*|| | jdt|d|d | || dS )z
        Capture an exception with additional context and send email notification for critical errors.
        
        Args:
            exception: The exception to capture
            context: Additional context to include
        )exception_typeexception_message	tracebackr&   r   r   r   r   r   N)type__name__r   _get_tracebackupdater$   !_send_critical_error_notification)r   r&   r   Zerror_contextr   r   r   capture_exceptionN   s    	
zErrorLogger.capture_exceptionr   r   r   r   c                 C   s   | j d|||d dS )a   
        Capture a message with specified level and context.
        
        Args:
            message: The message to capture
            level: Log level (debug, info, warning, error, critical)
            context: Additional context to include
        r   r*   N)r$   )r   r   r   r   r   r   r   capture_messagei   s    	zErrorLogger.capture_messagekeyvaluec                 C   s   t | dsi | _|| j|< dS )zz
        Set a tag for error events.
        
        Args:
            key: Tag key
            value: Tag value
        _current_tagsN)hasattrr6   )r   r4   r5   r   r   r   set_tagy   s    	
zErrorLogger.set_tagnamedatac                 C   s   t | dsi | _|| j|< dS )z
        Set context data for error events.
        
        Args:
            name: Context name
            data: Context data
        _current_contextN)r7   r<   )r   r:   r;   r   r   r   set_context   s    	
zErrorLogger.set_contextuser_idemailusernamec                 C   s6   i }|r||d< |r||d< |r(||d< |r2|| _ dS )z
        Set user context for error events.
        
        Args:
            user_id: User ID
            email: User email
            username: Username
        idr@   rA   N)Z_current_user_context)r   r?   r@   rA   Z	user_datar   r   r   set_user_context   s    
zErrorLogger.set_user_context)r&   returnc                 C   s8   ddl }zd|t|||jW S    Y dS X dS )z,Extract traceback information from exceptionr   N zUnable to extract traceback)r)   joinformat_exceptionr+   __traceback__)r   r&   r)   r   r   r   r-      s
    zErrorLogger._get_tracebackc           
         s4  zddl m} ddddddd	d
dddg}t|j}t|  ddddddddddddg}||kpt fdd|D p|ddk}|rd ksd krd}n0d ksd  krd!}nd" ksd# krd$}nd%}||t|||d& t	d'|  W n8 t
k
r. }	 ztd(t|	  W 5 d)}	~	X Y nX d)S )*z+Send email notification for critical errorsr   ) send_critical_error_notificationConnectionErrorTimeoutErrorZSSLErrorZ	HTTPErrorZAPIErrorZAuthenticationErrorPermissionErrorOSErrorMemoryErrorSystemErrorRuntimeErrorZcriticalZfatalzsystem downzservice unavailablezauthentication failedzpermission deniedzconnection refusedtimeoutZmemoryz
disk spaceZdatabasezapi keyc                 3   s   | ]}| kV  qd S )Nr   ).0Zkeywordr(   r   r   	<genexpr>   s     z@ErrorLogger._send_critical_error_notification.<locals>.<genexpr>r   ZapiZhttpZAPI_FAILUREmongodbZDATABASE_ERRORauthenticationZ
permissionZAUTHENTICATION_ERRORZSYSTEM_ERROR)r   error_messager   r&   z&Critical error notification sent for: z,Failed to send critical error notification: N)utils.email_notifierrI   r+   r,   r   loweranygetr   r   r   r   )
r   r&   r   rI   Zcritical_error_typesr'   Zcritical_keywordsZis_criticalr   r   r   rS   r   r/      sf            
         z-ErrorLogger._send_critical_error_notification   )daysr   
start_dateend_daterD   c              
   C   s  z| j dkrddiW S ddlm} |r|rz>t|d}t|d|dd }d	||d
i}|| j}W q tk
r }	 z2td|	  t ||d }
d	d|
ii}W 5 d}	~	X Y qX nt ||d }
d	d|
ii}|r||d< | j 	|}d|iddddididddiig}t
| j |}d|iddddididddiig}t
| j |}t
| j |ddddddd	dd}|||||dW S  tk
r }	 z(tdt|	  dt|	i W Y S d}	~	X Y nX dS )a  
        Get a summary of errors from MongoDB
        
        Args:
            days: Number of days to look back (used if start_date/end_date not provided)
            level: Filter by log level
            start_date: Start date in YYYY-MM-DD format
            end_date: End date in YYYY-MM-DD format
            
        Returns:
            Dictionary with error summary statistics
        Nr   zError collection not availabler   )	timedeltaz%Y-%m-%d   )r]   r   )$gtez$ltz0Error parsing date range, falling back to days: rb   r   z$matchz$groupz$levelz$sum)_idcountz$sortrd   z$error_type)rc   r   r   r   r   
   )total_errorserrors_by_levelerrors_by_typerecent_errorsZperiod_dayszError getting error summary: )r   r   r`   strptimer]   r   r   warningr!   Zcount_documentslistZ	aggregatefindsortlimitr   r   )r   r]   r   r^   r_   r`   start_datetimeend_datetimeZfilter_criteriar   Zcutoff_daterg   Zlevel_pipelinerh   Ztype_pipelineri   rj   r   r   r   get_error_summary   s^    

 

 zErrorLogger.get_error_summary)r   NNN)N)r   N)NNN)r\   NNN)r,   
__module____qualname__r   r   r   r   r   r$   r   r0   r2   r8   r=   rC   r-   r/   intrs   r   r   r   r   r	      s:         .   6    
  
r	   r%   c                 C   s   t | | dS )z-Capture an exception with additional context.N)error_loggerr0   r%   r   r   r   r0   7  s    r0   r   r1   c                 C   s   t | || dS )z3Capture a message with specified level and context.N)rw   r2   r1   r   r   r   r2   ;  s    r2   r3   c                 C   s   t | | dS )zSet a tag for error events.N)rw   r8   r3   r   r   r   r8   ?  s    r8   r9   c                 C   s   t | | dS )z"Set context data for error events.N)rw   r=   r9   r   r   r   r=   C  s    r=   r>   c                 C   s   t | || dS )z"Set user context for error events.N)rw   rC   r>   r   r   r   rC   G  s    rC   r   Zservice_namec                 C   s,   t d|  t dd td|   dS )z
    Initialize error logger (compatibility function for Sentry API)
    
    Args:
        service_name: Name of the service for tagging
    r    versionz1.0.0z&Error logger initialized for service: N)rw   r8   r   r   rx   r   r   r   init_error_loggerK  s    rz   )N)r   N)NNN)r   )__doc__loggingr"   r   Ztypingr   r   r   Zpymongor   config.settingsr   r   	getLoggerr,   r   r	   rw   r   r   r0   r2   r8   r=   rC   rz   r   r   r   r   <module>   s$   
  &  