
    4oi              	           d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZ d dlmZ  ee          Z ej                    d	z  Zd
ddddddddZddddZ G d d          ZdS )    N)date)Path)DictListOptionalAny)	dataclass)ManualLogStorage)SupplementEntryAlcoholEntry)setup_loggerzDLibrary/Mobile Documents/iCloud~md~obsidian/Documents/obsidian/dailyzMedication 001NAC	MagnesiumzFish OilCoQ10	BerberinezVitamin B ComplexzVitamin D3+K2)MED_001nac	magnesiumfish_oilcoq10	berberine	b_complexv_d3_k2PSMFOMADz
Water Fast)r   r   	WaterFastc                   l    e Zd ZdZddee         fdZdedefdZde	de
e	ef         fd	Zdedefd
ZdS )ObsidianSyncServicez/Service to sync data from Obsidian daily notes.Nobsidian_dirc                 H    |pt           | _        t                      | _        d S N)DEFAULT_OBSIDIAN_PATHr   r
   storage)selfr   s     1/root/projects/butler/health/services/obsidian.py__init__zObsidianSyncService.__init__'   s!    (A,A'))    target_datereturnc                 D    |                                  d}| j        |z  S )z0Get the path to the daily note for a given date.z.md)	isoformatr   )r$   r(   filenames      r%   _get_note_pathz"ObsidianSyncService._get_note_path+   s*    !++--222 8++r'   contentc                    i }t          j        d|t           j                  }|s|S |                    d          }|                    d          D ]$}|                                }|r|                    d          r/d|v r|                    dd          \  }}|                                }|                                }|                                dk    rd}n|                                dk    rd	}nu|                    d
dd          	                                r4	 d
|v rt          |          nt          |          }n(# t          $ r Y nw xY w|                                dv rd}|||<   &|S )z6Parse YAML frontmatter from markdown content manually.z^---\n(.*?)\n---   
#:trueTfalseF. )nullnilr7   N)researchDOTALLgroupsplitstrip
startswithlowerreplaceisdigitfloatint
ValueError)r$   r.   frontmattermatchyaml_contentlinekeyvalues           r%   _parse_frontmatterz&ObsidianSyncService._parse_frontmatter0   s    	-w	BB 	{{1~~ !&&t,, 	) 	)D::<<D 4??3// d{{!ZZQ//
Uiikk ;;==F** EE[[]]g--!EE]]3A..6688 !03ue#e**%    [[]]&999 E#(C s   %"E
EEc                    |                      |          }|                                s"t                              d| d|            dS 	 t	          |dd          5 }|                                }ddd           n# 1 swxY w Y   |                     |          }|st                              d|            dS | j        	                    |          }d}t                                          D ]O\  }}	|                    |          d	u r3|j        |	k    r&|	|_        d	}t                              d
|	             nP|                    d          du r|j        r	 t                                          D ]\  }|                    |          d	u rnt          fd|j        D                       }
|
sLt#          ddd          }|j                            |           d	}t                              d            |                    d          d	u r|                    dd          }|r| dnd}t          d |j        D                       }
|
sPt)          dd|d| d          }|j                            |           d	}t                              d|            |r9| j                            |           t                              d|            d	S t                              d|            d	S # t,          $ r+}t                              d| d|            Y d}~dS d}~ww xY w) zSync data from Obsidian for a specific date.
        
        Returns:
            True if data was found and synced, False otherwise.
        zNo Obsidian note found for z at Frzutf-8)encodingNzNo frontmatter found in TzSynced Fasting Mode: fastingc              3   D   K   | ]}|j         k    o
|j        d k    V  dS )00:00N)supplement_nametime).0snames     r%   	<genexpr>z6ObsidianSyncService.sync_daily_note.<locals>.<genexpr>   sK       ! ! )T1Gaf6G! ! ! ! ! !r'   rS   obsidian_sync)rU   rT   dosagetimingzSynced Supplement: alcohol
alcohol_mlr   zml pure alcoholzSee Obsidianc              3   B   K   | ]}|j         d k    o
|j        dk    V  dS )rS   wineN)rU   type)rV   as     r%   rY   z6ObsidianSyncService.sync_daily_note.<locals>.<genexpr>   sI         Vw&;16V+;     r'   r`   z"Synced from Obsidian (alcohol_ml: ))rU   ra   amountnoteszSynced Alcohol: z&Successfully synced Obsidian data for zNo new data to sync for z!Failed to sync Obsidian note for z: )r-   existsloggerwarningopenreadrM   infor#   load_logFASTING_MAPPINGitemsgetfasting_modeSUPPLEMENT_MAPPINGanysupplement_entriesr   appendalcohol_entriesr   save_log	Exceptionerror)r$   r(   	note_pathfr.   datalogchanges_maderK   moderf   entryr^   
amount_strerX   s                  @r%   sync_daily_notez#ObsidianSyncService.sync_daily_noteY   s&    ''44	!! 	NNUUU)UUVVV5O	iw777 #1&&((# # # # # # # # # # # # # # # **733D ByBBCCCu,''44C L -2244  	T88C==D(('4//+/('+$BD$B$BCCCE ) xx	""e++0@+  05577 B B	T88C==D((  ! ! ! !!$!7! ! !  F
 " 	B /!(,0#'#2	! ! ! .55e<<<'+$@$$@$@AAA xx	""d**!XXlA66
?I]
;;;;~
    0    
  	A($#)P:PPP	  E '..u555#'LKK ?: ? ?@@@ %%c***R[RRSSStD{DDEEEt 	 	 	LLO[OOAOOPPP55555	sI   L
  B5L
 BL
 B	7L
 H'L
 +L
 

L? L::L?r!   )__name__
__module____qualname____doc__r   r   r&   r   r-   strr   r   rM   boolr    r'   r%   r   r   $   s        99* *Xd^ * * * *,$ ,4 , , , ,
'# '$sCx. ' ' ' 'RZ4 ZD Z Z Z Z Z Zr'   r   )r:   osdatetimer   pathlibr   typingr   r   r   r   dataclassesr	   "health.services.manual_log_storager
   health.models.manual_logr   r   health.utils.logging_configr   r   rg   homer"   rq   rm   r   r   r'   r%   <module>r      sL   				 				             , , , , , , , , , , , , ! ! ! ! ! ! ? ? ? ? ? ? B B B B B B B B 4 4 4 4 4 4	h		 "	&ll   $	 	   O O O O O O O O O Or'   