
    $:j                        d 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  ed          Z	e	dz  Z
e	dz  dz  Ze	dz  d	z  Zd&dZd'dZd(dZd)dZd*dZd+d#Zd,d$Zed%k    r e e                      dS )-a  Personal food tolerance and histamine mapping helper.

Examples:
  nutrition_tolerance.py list-open
  nutrition_tolerance.py set-tolerance --food "Joghurt" --status unclear --notes "testweise beobachten"
  nutrition_tolerance.py map-alias --alias "feta" --canonical "Feta" --score 2 --category "Milchprodukt" --tags fermented

No raw YAZIO credentials or private payloads are read here; this only updates local
HealthManager DB mapping metadata and optionally refreshes insights/dashboard.
    )annotationsN)Pathz%/home/agent/.hermes/assets/Gesundheitzhealth_data.dbscriptsznutrition_insights.pyzhealth_pipeline.pyreturnsqlite3.Connectionc                 Z    t          j        t                    } t           j        | _        | S )N)sqlite3connectDBRowrow_factorycs    D/home/agent/.hermes/assets/Gesundheit/scripts/nutrition_tolerance.pyconnr      s    AKAMH    r   Nonec                0    |                      d           d S )Na  
    CREATE TABLE IF NOT EXISTS personal_food_tolerance (
        canonical_food TEXT PRIMARY KEY,
        personal_status TEXT NOT NULL DEFAULT 'unknown' CHECK(personal_status IN ('safe','problematic','unclear','unknown')),
        evidence_level TEXT DEFAULT 'low' CHECK(evidence_level IN ('low','medium','high')),
        notes TEXT,
        updated_at TEXT DEFAULT CURRENT_TIMESTAMP
    );
    CREATE TABLE IF NOT EXISTS nutrition_review_queue (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        normalized_name TEXT NOT NULL UNIQUE,
        example_name TEXT NOT NULL,
        occurrence_count INTEGER DEFAULT 0,
        first_seen TEXT,
        last_seen TEXT,
        suggested_canonical_food TEXT,
        suggested_score INTEGER,
        reason TEXT,
        status TEXT DEFAULT 'open' CHECK(status IN ('open','mapped','ignored')),
        updated_at TEXT DEFAULT CURRENT_TIMESTAMP
    );
    )executescriptr   s    r   ensure_schemar       s'    OO  	 	 	 	 	r   	dashboardboolc                    t          j        t          j        t	          t
                    gd           | r7t          j        t          j        t	          t                    dgd           d S d S )NT)checkr   )
subprocessrunsys
executablestrINSIGHTSPIPELINE)r   s    r   refreshr"   9   sc    NCNCMM2$???? QH{C4PPPPPPQ Qr   limitintc                   t                      }	 t          |           t          |                    d| f                    }|s&t	          d           	 |                                 d S |D ]>}t	          |d         dd|d          d|d          d	|d
          d	|d          	           ?	 |                                 d S # |                                 w xY w)NzSELECT example_name, occurrence_count, first_seen, last_seen, reason
                                 FROM nutrition_review_queue WHERE status='open'
                                 ORDER BY occurrence_count DESC,last_seen DESC LIMIT ?zKeine offenen Mapping-Reviews.occurrence_countz>3zx | 
first_seenz..	last_seenz | example_namereason)r   r   listexecuteprintclose)r#   r   rowsrs       r   	list_openr1   ?   s   AaAII Z\a[ce e f f  	2333 	
					  	~ 	~AQ)*|||1\?||an||YZ[iYj||opqyoz||}}}}	~ 	
									s   AC +AC Cfoodr   statusevidencenotes
str | Nonec           	     N   t                      }	 t          |           |                    d| |||pdf           |                                 |                                 n# |                                 w xY wt          |           t          d|  d| d| d           d S )Naw  INSERT INTO personal_food_tolerance(canonical_food,personal_status,evidence_level,notes,updated_at)
                     VALUES(?,?,?,?,CURRENT_TIMESTAMP)
                     ON CONFLICT(canonical_food) DO UPDATE SET personal_status=excluded.personal_status,
                         evidence_level=excluded.evidence_level, notes=excluded.notes, updated_at=CURRENT_TIMESTAMP zPersonal tolerance gesetzt:  -> z ()r   r   r,   commitr.   r"   r-   )r2   r3   r4   r5   r   r   s         r   set_tolerancer=   O   s    A	a			 w 5;B7		9 	9 	9
 	



									I	
H
H
H6
H
HX
H
H
HIIIIIs   ?A$ $A:alias	canonicalscorecategorytags
confidencec           	        t                      }	 t          |           |                    d|||pd|pd|pd|f           |                    d| |f           |                    d||| | f           |                                 |                                 n# |                                 w xY wt          |           t          d|  d| d| d           d S )	Na  INSERT INTO histamine_food_rules(canonical_food,sighi_score,category,tags,notes,confidence,updated_at)
                     VALUES(?,?,?,?,?,?,CURRENT_TIMESTAMP)
                     ON CONFLICT(canonical_food) DO UPDATE SET sighi_score=excluded.sighi_score,
                         category=excluded.category, tags=excluded.tags, notes=excluded.notes,
                         confidence=excluded.confidence, updated_at=CURRENT_TIMESTAMPr8   zPINSERT OR REPLACE INTO histamine_food_aliases(alias, canonical_food) VALUES(?,?)zUPDATE nutrition_review_queue SET status='mapped', suggested_canonical_food=?, suggested_score=?, updated_at=CURRENT_TIMESTAMP WHERE lower(example_name)=lower(?) OR normalized_name=lower(?)zAlias gemappt: r9   z (SIGHi r:   r;   )	r>   r?   r@   rA   rB   r5   rC   r   r   s	            r   	map_aliasrE   _   s   Aa			 Y
 eX^TZR"jY	[ 	[ 	[ 	
		dglnwfxyyy			  ReUE2	4 	4 	4	


									I	
BE
B
By
B
B%
B
B
BCCCCCs   A7B B2c            
        t          j                    } |                     dd          }|                    d          }|                    dt
          d           |                    d          }|                    d	d
           |                    dg dd           |                    dg dd           |                    d           |                    dd           |                    d          }|                    dd
           |                    dd
           |                    dt
          g dd           |                    d           |                    d           |                    d           |                    dg dd           |                    dd           |                                 }|j        dk    rt          |j	                   n|j        dk    r-t          |j        |j        |j        |j        |j                   nI|j        dk    r>t!          |j        |j        |j        |j        |j        |j        |j        |j                   d S )!NcmdT)destrequiredz	list-openz--limit   )typedefaultzset-tolerancez--food)rI   z--status)safeproblematicunclearunknown)choicesrI   z
--evidence)lowmediumhighrR   )rQ   rL   z--notesz--dashboard
store_true)actionz	map-aliasz--aliasz--canonicalz--score)r            )rK   rQ   rI   z
--categoryz--tagsz--confidencerS   r   )argparseArgumentParseradd_subparsers
add_parseradd_argumentr$   
parse_argsrG   r1   r#   r=   r2   r3   r4   r5   r   rE   r>   r?   r@   rA   rB   rC   )apsubp_listp_tolp_mapargss         r   mainrf   t   sv   		 	"	"B




6
6C^^K((F&*=*=ic[]*=*^*^*^NN?++E	x$///	z+U+U+U`deee	|-D-D-DeTTT	y!!!	}\:::NN;''E	y4000	}t444	ysIIIMMM	|$$$	x   	y!!!	~/F/F/FPXYYY	}\:::==??Dx;$*	_	$	$didmTZXXXX	[	 	 $*dndj$-TXT^`d`oquq  	A  	A  	A1r   __main__)r   r   )r   r   r   r   )r   r   r   r   )r#   r$   r   r   )r2   r   r3   r   r4   r   r5   r6   r   r   r   r   )r>   r   r?   r   r@   r$   rA   r6   rB   r6   r5   r6   rC   r   r   r   r   r   )r   r$   )__doc__
__future__r   rZ   r	   r   r   pathlibr   BASEr   r    r!   r   r   r"   r1   r=   rE   rf   __name__
SystemExit r   r   <module>ro      sZ  	 	 # " " " " "       



      t344	)55)22   	 	 	 	2Q Q Q Q    J J J J D D D D*   : z
*TTVV

 r   