
    ie              	           d 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 ddlZ ej        d           ddlmZ ddlZddlmZ ddlmZ ddlZddlZddlZddlZddlmZ ddl m!Z! ddl"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*Z* e*j+        d	           d
Z,dZ-dZ.dZ/dZ0 e"j1        e/d            e"j1        e0d            G d d          Z2 G d de!          Z3d Z4e5dk    rddl6Z6 e7e#j8                  dk    re#j8        d         dk    r e4             dS  e2            5 Z9e9:                                Z;e;r4 e<de;d          de;d         dd            e<de;d           d!           e9=                                Z>e>r' e<d" e$j?        e>d#d$%          dd&                     e9@                                ZAeAr e<d'eA            e9B                                ZCeCr e<d(eC            e9D                                ZEeEr e<d)eE            e9F                                ZGeGr e<d*eG            e9H                                ZIeIr e<d+eI             e<d,           ddd           dS # 1 swxY w Y   dS dS )-u  
CHIEF MEDICAL DATA OFFICER — Gesundheitsmanager
Delegierter Subagent für alle Gesundheitsdaten-Analysen.

Rolle:
- Verarbeitet und analysiert alle Gesundheitsdaten
- Extrahiert Laborwerte aus PDFs (Camelot, PyMuPDF, pdfplumber, pytesseract)
- Führt statistische Analysen durch (scipy, statsmodels, pandas)
- Erstellt Visualisierungen (matplotlib, seaborn, plotly)
- Generiert Reports und Korrelationen
- Überwacht Health_Inbox via watchdog für automatische PDF-Verarbeitung

Datenbank: /home/agent/.hermes/assets/Gesundheit/health_data.db
Archiv: /home/agent/.hermes/assets/Gesundheit/archiv/
Inbox: /home/agent/.hermes/assets/Gesundheit/inbox/
    N)create_enginetextAgg)Observer)FileSystemEventHandler)datetime	timedelta)Pathignorez4/home/agent/.hermes/assets/Gesundheit/health_data.dbz,/home/agent/.hermes/assets/Gesundheit/archivz+/home/agent/.hermes/assets/Gesundheit/inboxz-/home/agent/.hermes/assets/Gesundheit/reportsz-/home/agent/.hermes/assets/Gesundheit/exportsTexist_okc                       e Zd ZdZd Zd Zd ZddZddZd Z	d	 Z
d
 Zd ZddZddZddZddZddZddZd Zd Zd Zd ZdS )HealthManageru>   Hauptklasse für die Gesundheitsdaten-Verwaltung und -Analyse.c                     t          dt                     | _        | j                                        | _        |                                  d S )Nz
sqlite:///)r   DB_PATHengineconnectconn_validate_schemaselfs    ?/home/agent/.hermes/assets/Gesundheit/scripts/health_manager.py__init__zHealthManager.__init__=   sG    #$:$:$:;;K''))	    c                     g d}t          j        d| j                  }t          |d                   fd|D             }|r)t	          d|            |                     |           dS dS )u2   Prüfe ob alle erforderlichen Tabellen existieren.)
laborwertehealth_events	dokumentemedikamentedokumente_statussymptomesymptom_logvitalzeichenarztbesuche
ernaehrungauswertungenz1SELECT name FROM sqlite_master WHERE type='table'namec                     g | ]}|v|	S  r)   ).0texisting_tabless     r   
<listcomp>z2HealthManager._validate_schema.<locals>.<listcomp>M   s#    JJJ/1I1I11I1I1Ir   z[WARN] Fehlende Tabellen: N)pdread_sqlr   setprint_create_missing_tables)r   required_tablesexistingmissingr,   s       @r   r   zHealthManager._validate_schemaB   s    
 
 
 ;RTXT]^^hv.//JJJJoJJJ 	18w88999''00000	1 	1r   c                     ddddddd}|D ]_}||v rY| j                             t          ||                              | j                                          t	          d| d	           `d
S )zErstelle fehlende Tabellen.a  
                CREATE TABLE IF NOT EXISTS symptome (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    datum DATE NOT NULL,
                    symptombeschreibung TEXT,
                    schwerigkeit INTEGER CHECK(schwerigkeit BETWEEN 1 AND 10),
                    bereich TEXT,
                    dokumentiert BOOLEAN DEFAULT 1
                )
            a  
                CREATE TABLE IF NOT EXISTS symptom_log (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    datum TIMESTAMP NOT NULL,
                    symptombeschreibung TEXT NOT NULL,
                    schwerigkeit INTEGER CHECK(schwerigkeit BETWEEN 1 AND 10),
                    bereich TEXT,
                    einflussfaktoren TEXT,
                    medikamente_eingenommen TEXT,
                    notizen TEXT,
                    status TEXT DEFAULT 'aktiv'
                )
            a  
                CREATE TABLE IF NOT EXISTS vitalzeichen (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    datum TIMESTAMP NOT NULL,
                    typ TEXT NOT NULL,
                    wert REAL NOT NULL,
                    einheit TEXT,
                    referenzbereich TEXT,
                    gerat TEXT,
                    notizen TEXT
                )
            a  
                CREATE TABLE IF NOT EXISTS arztbesuche (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    datum DATE NOT NULL,
                    arzt_name TEXT,
                    spezialisation TEXT,
                    grund TEXT,
                    zusammenfassung TEXT,
                    naechster_termin DATE,
                    notizen TEXT
                )
            a  
                CREATE TABLE IF NOT EXISTS ernaehrung (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    datum DATE NOT NULL,
                    mahlzeit TEXT,
                    kalorien INTEGER,
                    protein_g REAL,
                    kohlenhydrate_g REAL,
                    fett_g REAL,
                    ballaststoffe_g REAL,
                    histamin_score INTEGER CHECK(histamin_score BETWEEN 0 AND 10),
                    notizen TEXT
                )
            a  
                CREATE TABLE IF NOT EXISTS auswertungen (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    datum TIMESTAMP NOT NULL,
                    typ TEXT NOT NULL,
                    name TEXT NOT NULL,
                    ergebnis TEXT,
                    dateipfad TEXT,
                    parameter TEXT,
                    metadata TEXT
                )
            )r!   r"   r#   r$   r%   r&   z[INFO] Tabelle 'z' erstellt.N)r   executer   commitr1   )r   missing_tablestable_definitionstables       r   r2   z$HealthManager._create_missing_tablesR   s    	}J
 J
X $ 	= 	=E)))	!!$'8'?"@"@AAA	  """;;;;<<<		= 	=r   Nc                     d}i }|r|dz  }d| d|d<   |r
|dz  }||d<   |r
|dz  }||d<   t          j        || j        |	          }t          j        |d
                   |d<   d|d<   |S )z3Laborwerte aus der Datenbank laden (FRIDAY-Schema).z"SELECT * FROM laborwerte WHERE 1=1z AND parameter_name LIKE :param%paramz AND ermittlung_datum >= :startstartz AND ermittlung_datum <= :endendparamsermittlung_datumdatumNreferenzbereich)r.   r/   r   to_datetime)r   	parameter
start_dateend_datequeryrB   dfs          r   get_laborwertezHealthManager.get_laborwerte   s    4 	/66E.)...F7O 	)66E(F7O 	%44E$F5M[F;;;nR(:%;<<7 $	r   c                 r    d}i }|r
|dz  }||d<   |r
|dz  }||d<   t          j        || j        |          S )z2Dokumente aus der Datenbank laden (FRIDAY-Schema).z!SELECT * FROM dokumente WHERE 1=1z AND status = :statusstatusz AND kategorie = :kategorie	kategorierA   )r.   r/   r   )r   rN   rO   rJ   rB   s        r   get_dokumentezHealthManager.get_dokumente   s_    3 	&,,E%F8 	,22E"+F;{5$+f====r   c           
         g }	 t          j        |d          }|D ]}|j        }t          |          dk    rt	          dt          |                    D ]b}|j        |         }t          |          dk    r>t          j        |d                   r't          |d                   	                                nd}t          j        |d                   r't          |d                   	                                nd}	t          j        |d                   r't          |d                   	                                nd}
t          |          dk    rAt          j        |d                   r't          |d                   	                                nd}|r|	r|
                    ||	|
||d           dn)# t          $ r}t          d	|            Y d}~nd}~ww xY w|s	 t          j        |          }d
}|D ]}||                                z  }ddl}d}|                    ||          }|D ]}|
                    |d         	                                |d         	                                |d         	                                |d         r|d         	                                nd|d           n)# t          $ r}t          d|            Y d}~nd}~ww xY w|S )z9Laborwerte aus einem PDF extrahieren (Camelot + PyMuPDF).all)pages         r   NrG   werteinheitrE   quellez[WARN] Camelot fehlgeschlagen:  ?(\w[\w\s\.]*)\s+([\d\.]+)\s*(\w+/\w*|\w+|\d+)\s*([<>=\d\.\s]+)?z[WARN] PyMuPDF fehlgeschlagen: )camelotread_pdfrK   lenrangeilocr.   notnastrstripappend	Exceptionr1   fitzopenget_textrefindall)r   pdf_pathextracted_valuestablesr;   df_tableirowrG   rX   rY   referenzedocpdf_textpagerj   patternmatchesmatchs                       r   extract_laborwerte_from_pdfz)HealthManager.extract_laborwerte_from_pdf   s9   	9%he<<<F # # 8x==1$$"1c(mm44 # #&mA.s88q==?AxA?O?O(YCF(9(9(;(;(;UYI:<(3q6:J:J#T3s1v;;#4#4#6#6#6PTD=?Xc!f=M=M&Wc#a&kk&7&7&9&9&9SWG>A#hhllrxX[\]X^O_O_ls3q6{{'8'8':':':eiH( #T # 0 7 71:,0/67?.69" 9" !# !# !##(  	9 	9 	97A7788888888	9   	==i)) 0 0D/HH 			\**Wh77$  E$++%*1X^^%5%5 %a 0 0#(8>>#3#3?DQx+Q58>>+;+;+;T"*- -      = = =;;;<<<<<<<<=  s1   F9F> >
G$GG$+CK 
K*K%%K*c                 F   g }	 t          j        |          5 }|j        D ]}|                                }|rddl}d}|                    ||          }|D ]}	|                    |	d                                         |	d                                         |	d                                         |	d         r|	d                                         nd|d           	 ddd           n# 1 swxY w Y   n)# t          $ r}
t          d|
            Y d}
~
nd}
~
ww xY w|S )	u)   Fallback: pdfplumber für PDF-Extraktion.r   Nr\   rU   rT   rV   rW   z"[WARN] pdfplumber fehlgeschlagen: )

pdfplumberrh   rS   extract_textrj   rk   re   rd   rf   r1   )r   rl   rm   pdfrv   	page_textrj   rw   rx   ry   rs   s              r   #extract_laborwerte_from_pdf_plumberz1HealthManager.extract_laborwerte_from_pdf_plumber   s   	<** cI  D $ 1 1 3 3I  !			"d"$**Wi"@"@%,  E,33-21X^^-=-=(-a(8(8+08>>+;+;GLQx3Y58>>3C3C3CUY*25 5                    	< 	< 	<:q::;;;;;;;;	<s;   C8 CC, C8 ,C00C8 3C04C8 8
DDDc                    ddl }g }	  |j        |          }t          t          |                    D ]`}||         }|                    d          }|                    d          }t          j        |d          }	|                    |	           an)# t          $ r}
t          d|
            Y d}
~
nd}
~
ww xY wd	                    |          S )
u&   OCR für gescannte PDFs (pytesseract).r   Ni,  dpipngzdeu+eng)langz[WARN] OCR fehlgeschlagen: 
)rg   rh   r`   r_   
get_pixmaptobytespytesseractimage_to_stringre   rf   r1   join)r   rl   rg   extracted_textrt   page_numrv   piximg_dataocr_textrs   s              r   extract_from_scanned_pdfz&HealthManager.extract_from_scanned_pdf  s    		5$)H%%C!#c((OO 0 08}oo#o..;;u--&6xiPPP%%h////0  	5 	5 	533344444444	5yy(((s   BB 
B< B77B<c                    |                      d          }|j        rdS |                    d          }d }|d                             |          |d<   |d         }t	          |          dk     r0d|                                t          |j        d	                   d
S t          j	        t	          |                    }t          j        ||          \  }}}}}	|dk    rdn	|dk     rdnd||dz  ||                                t          |j        d	                   t          |t	          |          z  |z             dS )zCRP-Trend berechnen.CRPNrC   c                 r    	 t          t          |                               d                    S #  Y dS xY wN<>=g        floatrc   lstripvs    r   	parse_valz2HealthManager.compute_crp_trend.<locals>.parse_val.  7    SVV]]511222ss   .1 6rX   
wert_floatrT   zunzureichend Daten)trendwerteaktuellg?steigendgfallendstabil)r   slope	r_squaredp_valuer   r   
vorhersage)rL   emptysort_valuesapplyr_   tolistr   ra   nparangestats
linregress)
r   rK   r   valuesxr   	interceptr_valuer   std_errs
             r   compute_crp_trendzHealthManager.compute_crp_trend%  sO     ''8 	4^^.//	 	 	 f:++I66<L!v;;??- R11   Ic&kk""6;6Fq&6Q6Q3y'7G $)3;;ZZ%$,,YYT\ A]]__V[_--F 3i ?@@
 
 	
r   c           	      4   |                                  }|j        ri S d }|d                             |          |d<   |                    ddd          }|                    dt          dt          |          d	z            
          }|j        ri S |                                }|rY||j        v rP||         	                    |          
                    d          }|d |                                D             dS d|                                iS )z-Korrelationsanalyse zwischen Laborparametern.c                     	 t          t          |                               d                    S #  t          j        cY S xY wNr   r   rc   r   r   nanr   s    r   r   z5HealthManager.compute_correlations.<locals>.parse_valS  ;    SVV]]511222v	   .1 ArX   r   rD   parameter_nameindexcolumnsr   rU            ?axisthreshF)	ascendingc                 v    i | ]6\  }}t          |          d k    |t          t          |          d          7S )333333?rV   )absroundr   )r*   colvals      r   
<dictcomp>z6HealthManager.compute_correlations.<locals>.<dictcomp>i  sE     " " " S3xx#~~ uSzz1--%~~r   )targetkorrelationenkorrelationsmatrix)rL   r   r   pivot_tabledropnamaxr_   corrr   dropr   itemsto_dict)r   target_parameterrK   r   pivotcorr_matrixtarget_corrss          r   compute_correlationsz"HealthManager.compute_correlationsL  sH     ""8 	I	 	 	 f:++I66< W6F|\\!C3u::3C,D,DEE; 	Ijjll 
	 0K4G G G&'78==>NOO[[fk[llL*" "$0$6$6$8$8" " "   !+"5"5"7"7
 	
r   c           	          |                      d          }|j        rt          d           dS |                    d          }d }|d                             |          |d<   t          j        d	          \  }}|                    |d
         |d         ddd           |                    dddd           |	                    |d
         |d         d|d         dk    ddd           |
                    dd           |                    d           |                    d           |                                 |                    dd           t          j        d            t          j                     |r,|                    |d!"           t          j                     |S t&          j                            t,          d#          }|                    |d!"           t          j                     |S )$zCRP-Trend-Diagramm erstellen.r   z [WARN] Keine CRP-Werte gefunden.NrC   c                 r    	 t          t          |                               d                    S #  Y dS xY wr   r   r   s    r   r   z3HealthManager.generate_crp_chart.<locals>.parse_val~  r   r   rX   r         figsizerD   zb-or   )
markersizelabelr   green--zReferenz: <5 mg/lycolor	linestyler   g?redu   Erhöht)wherealphar   r   u0   C-reaktives Protein (CRP) — Entzündungsmarker   fontsizeDatumz
CRP (mg/l)Tr   r   -   rotation   r   zcrp_trend.png)rL   r   r1   r   r   pltsubplotsplotaxhlinefill_between	set_title
set_xlabel
set_ylabellegendgridxtickstight_layoutsavefigcloseospathr   REPORTS_DIR)r   output_pathrK   r   figaxr
  s          r   generate_crp_chartz HealthManager.generate_crp_chartt  s     ''8 	45554^^.//	 	 	 f:++I66<,w///R
7R-u%PPP


Qg=P
QQQ
7R%5q<@PTU@U!i 	 	A 	A 	A
GRTUUU
g
l###
		
C   
B 	KKK---IKKK7<<_==DKK#K&&&IKKKKr   c           	      b   |                      d          }|j        rt          d           dS |                    d          }d }|d                             |          |d<   t          j        d	          \  }}|d
                                         D ]n}||d
         |k                                 d          }d|v rdnd|v rdnd}|dk    rdn	|dk    rdnd}	|                    |d         |d         dd||	           o|	                    dddd           |
                    dd           |                    d           |                    d           |                                 |                    dd !           t          j        d"#           t          j                     |r,|                    |d$%           t          j                     |S t&          j                            t,          d&          }
|                    |
d$%           t          j                     |
S )'zCholesterin-Diagramm erstellen.Cholesterinz([WARN] Keine Cholesterin-Werte gefunden.NrC   c                 r    	 t          t          |                               d                    S #  Y dS xY wr   r   r   s    r   r   z;HealthManager.generate_cholesterol_chart.<locals>.parse_val  r   r   rX   r   r   r   r   LDLHDLGesamtr   r   bluerD   z-or   )r   r   r   g      @oranger   zReferenz: <5.0 mmol/lr   zCholesterin-Profiler   r   r   zmmol/lTr   r   r   r   r   r   zcholesterin_profile.png)rL   r   r1   r   r   r   r   uniquer   r   r   r  r  r  r  r  r  r  r  r	  r
  r   r  )r   r  rK   r   r  r  r>   subsetr   r   r
  s              r   generate_cholesterol_chartz(HealthManager.generate_cholesterol_chart  s>     //8 	<===4^^.//	 	 	 f:++I66<,w///R ()0022 	i 	iE+,56BBCUVVF"e^^EE5E>>%%xE"e^^EEUe^^''QWEGGF7OVL%94AUZbgGhhhh


SD@W
XXX
*R888
g
h
		
C   
B 	KKK---IKKK7<<-FGGDKK#K&&&IKKKKr   c           	      r   |                                  }|j        rt          d           dS d }|d                             |          |d<   |                    ddd                              d	t          d
t                    dz                      |rfd|D                      j        rt          d           dS t          j	        d          \  }}t          j        dd|d           |                    dd           t          j        d           t          j                     |r,|                    |d           t          j                     |S t"          j                            t(          d          }|                    |d           t          j                     |S )z'Heatmap der wichtigsten Laborparameter.z![WARN] Keine Laborwerte gefunden.Nc                     	 t          t          |                               d                    S #  t          j        cY S xY wr   r   r   s    r   r   z1HealthManager.generate_heatmap.<locals>.parse_val  r   r   rX   r   rD   r   r   rU   r   r   r   c                 &    g | ]}|j         v |S r)   )r   )r*   pr   s     r   r-   z2HealthManager.generate_heatmap.<locals>.<listcomp>  s%    KKKU]8J8J18J8J8Jr   u    [WARN] Keine Daten für Heatmap.)r      r   FRdYlGn_r)annotcmapr  
linewidthszLaborparameter Heatmapr   r   r   r   r   r   zlabor_heatmap.png)rL   r   r1   r   r   r   r   r_   r   r   snsheatmapr   r  r  r  r  r	  r
  r   r  )	r   parameter_listr  rK   r   r  r  r
  r   s	           @r   generate_heatmapzHealthManager.generate_heatmap  s     ""8 	56664	 	 	 f:++I66<W6F|\\!C3u::3C,D,DEE 	MKKKKnKKKLE; 	45554,w///REZB3OOOO
-;;;
B 	KKK---IKKK7<<-@AADKK#K&&&IKKKKr   c                 r   |                                  }|j        rt          d           dS t          j        |ddddddd	d
          }|                    dddd           |r|                    |           |S t          j        	                    t          d          }|                    |           |S )u:   Interaktiver Plotly-Dashboard für langfristige Verläufe.u'   [WARN] Keine Laborwerte für Dashboard.NrD   rX   r   u    Laborwert-Verläufe (Interaktiv)Wertr   	Parameter)rX   rD   r   )r   r   r   titlelabelsz	x unifiediX  )xaxis_titleyaxis_title	hovermodeheightzlabor_dashboard.html)rL   r   r1   pxlineupdate_layout
write_htmlr	  r
  r   r  )r   r  rK   r  r
  s        r   generate_plotly_dashboardz'HealthManager.generate_plotly_dashboard  s      ""8 	;<<<4g'V+;4"WTT
 
 

 	!	 	 	
 	
 	
  	NN;'''7<<-CDDDNN4   Kr   c                     	 ddl m} n # t          $ r t          d           Y dS w xY w|                                 }|j        rt          d           dS  ||dd          }|pd	}|                    |           t          d
|            |S )z'ydata-profiling HTML-Report generieren.r   )ProfileReportz)[WARN] ydata-profiling nicht installiert.Nu&   [WARN] Keine Daten für Profil-Report.zGesundheitsdaten-ProfilF)r+  progress_barzA/home/agent/.hermes/assets/Gesundheit/reports/health_profile.htmlz[INFO] ydata-profiling Report: )ydata_profilingr7  ImportErrorr1   rL   r   to_file)r   r  r7  rK   reports        r   generate_profiling_reportz'HealthManager.generate_profiling_report  s    	5555555 	 	 	=>>>44	   ""8 	:;;;4r)BQVWWW!h%h{###===>>>s   	 &&c                    t          d|            |                     |          }|s|                     |          }|s:|                     |          }t          dt	          |           d           d|dS |D ]s}| j                            t          d          |d         |d         |                    d	d
          t          j
                                        d          d           tt          j        t          |d                                                                                    }| j                            t          d          t"          j                            |          ||dddt          j
                                        d          d           | j                                         t"          j                            t,          dt"          j                            |                    }t#          j        t"          j                            |          d           t#          j        ||           dt	          |          |dd         dS )z!Verarbeite ein PDF aus der Inbox.z[INFO] Verarbeite: z[INFO] OCR-Text extrahiert (z	 Zeichen)ocr)rN   r   z
                    INSERT INTO laborwerte (parameter_name, wert, einheit, ermittlung_datum)
                    VALUES (:param, :wert, :einheit, :datum)
                rG   rX   rY   r[   z%Y-%m-%d %H:%M:%S)r>   rX   rY   rD   rbz
                INSERT OR REPLACE INTO dokumente (datei_name, dateipfad, datei_hash, status, kategorie, daten_typ, upload_datum)
                VALUES (:name, :pfad, :hash, :status, :kategorie, :datentyp, :datum)
            eingearbeitetLABORr~   z%Y-%m-%d)r'   pfadhashrN   rO   datentyprD   laborberichteTr   successNr   )rN   extrahierte_werter   )r1   rz   r   r   r_   r   r7   r   getr   nowstrftimehashlibmd5rh   read	hexdigestr	  r
  basenamer8   r   
ARCHIV_DIRmakedirsdirnamerename)r   rl   	extractedr   r   	file_hashdests          r   process_inbox_pdfzHealthManager.process_inbox_pdf"  sY   .H../// 44X>>	 	K@@JJI 	744X>>HIXIIIJJJ#X666  	 	CI   
 !-K"wwy"55%\^^445HII	     KXt 4 4 9 9 ; ;<<FFHH		   
 ((22 !)$!!00<< 	
 	
 	
 		 w||J9I9I(9S9STT
BGOOD))D9999
	(D!!!  !$Yrr]
 
 	
r   c                 j    | j                                          | j                                         dS )zVerbinde Datenbank.N)r   r  r   disposer   s    r   r  zHealthManager.close^  s.    	r   c                     | S Nr)   r   s    r   	__enter__zHealthManager.__enter__c  s    r   c                 .    |                                   d S r\  )r  )r   argss     r   __exit__zHealthManager.__exit__f  s    

r   )NNN)NNr\  )__name__
__module____qualname____doc__r   r   r2   rL   rP   rz   r   r   r   r   r  r  r'  r5  r=  rX  r  r]  r`  r)   r   r   r   r   :   sj       HH     
1 1 1 R= R= R=h   (> > > >5  5  5 n     .) ) ) %
 %
 %
N&
 &
 &
 &
P' ' ' 'R+ + + +Z( ( ( (T   6   &:
 :
 :
x  
      r   r   c                   (     e Zd ZdZ fdZd Z xZS )HealthInboxHandleru4   Watchdog-Handler für automatische PDF-Verarbeitung.c                 V    t                                                       || _        d S r\  )superr   manager)r   health_manager	__class__s     r   r   zHealthInboxHandler.__init__m  s$    %r   c                 6   |j         rd S |j                            d          rut          d|j                    	 | j                            |j                  }t          d|            d S # t          $ r}t          d|            Y d }~d S d }~ww xY wd S )Nz.pdfz[WATCHDOG] Neues PDF erkannt: z'[WATCHDOG] Verarbeitung abgeschlossen: z[WATCHDOG] Fehler: )is_directorysrc_pathendswithr1   ri  rX  rf   )r   eventresultrs   s       r   
on_createdzHealthInboxHandler.on_createdq  s     	F>""6** 	1C5>CCDDD177GGHHHIIIII 1 1 1/A//0000000001	1 	1s   1A/ /
B9BB)ra  rb  rc  rd  r   rr  __classcell__)rk  s   @r   rf  rf  j  sM        >>& & & & &	1 	1 	1 	1 	1 	1 	1r   rf  c                     t                      } t          |           }t                      }|                    |t          d           |                                 t          dt                      	 	 t          j        d           # t          $ r |
                                 Y nw xY w|                                 dS )u*   Starte den Watchdog für die Health-Inbox.F)	recursivez[WATCHDOG] Beobachte: TrU   N)r   rf  r   schedule	INBOX_DIRr?   r1   timesleepKeyboardInterruptstopr   )ri  handlerobservers      r   start_watchdogr~  }  s    ooG ))GzzHgyE:::NN	
.9
.
.///	JqMMM	   MMOOOOOs   5B B,+B,__main__rU   watchdogz
[INFO] CRP-Trend: r   z (P=r   z.4f)z	Aktuell: r   z mg/lz
[INFO] Korrelationen: rT   F)indentensure_asciii  z
[INFO] CRP-Diagramm: z[INFO] Cholesterin-Diagramm: z[INFO] Heatmap: z[INFO] Plotly-Dashboard: z[INFO] ydata-Profile: z"
[INFO] Gesundheitsmanager bereit.)Jrd  pandasr.   numpyr   
sqlalchemyr   r   scipy.statsr   statsmodels.apiapism
matplotlibusematplotlib.pyplotpyplotr   seabornr$  plotly.expressexpressr1  	plotly.ioiopior]   rg   r|   r   watchdog.observersr   watchdog.eventsr   r	  sysjsonrL  r   r	   pathlibr
   warningsfilterwarningsr   rQ  rw  r  EXPORTS_DIRrR  r   rf  r~  ra  rx  r_   argvhmr   crpr1   r   r   dumpsr  crp_pathr  	chol_pathr'  heatmap_pathr5  dashboard_pathr=  profile_pathr)   r   r   <module>r     s   "             * * * * * * * *                 
u                                    ' ' ' ' ' ' 2 2 2 2 2 2 				 



   ( ( ( ( ( ( ( (          ! ! ! A;
9	== K$ ' ' ' ' K$ ' ' ' 'm m m m m m m m`1 1 1 1 1/ 1 1 1&  $ zKKK
s38}}qSXa[J66]__ !	9&&((C 9TS\TTs9~TTTTUUU7#i.777888 **,,D igDY^1_1_1_`dad`d1egghhh ,,..H <:::;;;5577I CAiAABBB..00L 977788899;;N DB.BBCCC7799L ?=|==>>>E7888C!	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 !	9 s   -EJJJ