
    gj                        d dl mZ d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 h dZddZddddd	Zdd
Zdddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddddZddddZy)    )annotationsN)datetimetimezone)
Connection)Any>   mutedactiveresolvedc                 d    t        j                  t        j                        j	                         S N)r   nowr   utc	isoformat     {/home/agent/.hermes/worktrees/FinanceManager-sprint14-twr-xirr-performance-attribution/src/jarvis_finance/quality/alerts.pyutc_nowr      s    <<%//11r   explicitc                   |r|}n!t        j                  | xs i ddt              }t        j                  |j                  d            j                         d d S )NTF	sort_keysensure_asciidefaultutf-8    )jsondumpsstrhashlibsha256encode	hexdigest)evidencer   payloads      r   alert_fingerprintr&      sK    **X^t%Y\]>>'..12<<>sCCr   c                    dj                  | xs d|xs d|xs d||g      }t        j                  |j                  d            j	                         d d S )N| r   (   )joinr    r!   r"   r#   )rule_identity_type	entity_idpriorityfingerprintr%   s         r   build_dedup_keyr1      sQ    hh2{'8b)/r8U`abG>>'..12<<>sCCr   )r-   r.   r,   r$   r0   c                  t               }	t        ||      }
t        |||||
      }| j                  d|f      j	                         }t        j                  |xs i ddt              }|r| j                  d|	||d   f       |d   S t        t        j                               }| j                  d	|||||||||	|	|
|f       |S )
Nr   )r,   r-   r.   r/   r0   zSELECT alert_id, status, occurrence_count FROM alerts WHERE dedup_key=? AND status IN ('active','resolved','muted') ORDER BY created_at DESC LIMIT 1TFr   zsUPDATE alerts SET last_seen_at=?, occurrence_count=COALESCE(occurrence_count,1)+1, evidence_json=? WHERE alert_id=?alert_ida"  
        INSERT INTO alerts(
            alert_id, priority, category, entity_type, entity_id, rule_id, message,
            evidence_json, status, created_at, last_seen_at, occurrence_count, fingerprint, dedup_key
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'active', ?, ?, 1, ?, ?)
        )
r   r&   r1   executefetchoner   r   r   uuiduuid4)connr/   categorymessager-   r.   r,   r$   r0   r   fp	dedup_keyexistingevidence_jsonr3   s                  r   create_alertr?      s     )C	8k	:B[T]hp  A  BI|| 	_	 hj  JJx~2E[^_M B-*!56	
 
##4::< HLL	 
8X{IwQ^`cehjlnwx Or   )notec               \    | j                  dt               |f       | j                          y )NzCUPDATE alerts SET status='resolved', resolved_at=? WHERE alert_id=?)r4   r   commit)r8   r3   r@   s      r   resolve_alertrC   E   s$    LLVY`YbdlXmnKKMr   )muted_untilc               L    | j                  d||f       | j                          y )Nz@UPDATE alerts SET status='muted', muted_until=? WHERE alert_id=?)r4   rB   )r8   r3   rD   s      r   
mute_alertrF   J   s!    LLSVackUlmKKMr   )returnr   r   )r$   dict[str, Any] | Noner   
str | NonerG   r   )r,   rI   r-   rI   r.   rI   r/   r   r0   r   rG   r   )r8   r   r/   r   r9   r   r:   r   r-   rI   r.   rI   r,   rI   r$   rH   r0   rI   rG   r   )r8   r   r3   r   r@   rI   rG   None)r8   r   r3   r   rD   rI   rG   rJ   )
__future__r   r    r   r6   r   r   sqlite3r   typingr   ACTIVE_STATUSESr   r&   r1   r?   rC   rF   r   r   r   <module>rO      s    "    '  12DX\ DD # &*"$
$ $ 	$
 $ $ $ $ $$ $ 	$N JN 
 NR r   