
    Åi(                        d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZmZmZ  e
e          ZdZdZ eddd	          Z edd
d          Zi ddddddddddddddd	dd
ddddddd dd!d"d#d$d%d&d'd(d)i d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d7d9d:d;d<d=d<d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMZdN ZdO ZdPZdQ Zd^dRZe                    dS          dT             Ze                    dU          dV             Ze                    dW          dX             ZedYk    re                    dZd[d\]           dS dS )_    N)datetimedate	timedelta)BeautifulSoup)Flaskrender_templatejsonifyrequestz5/home/debian/.hermes/profiles/health-butler/health.dbz7/home/debian/.hermes/profiles/finance-butler/finance.dbi                 )u	   芝麻粒u   🌱      )u   扁豆u   🫘   )u   藍莓u   🫐   )u	   覆盆子   🍇	   )u   葡萄r   
   )u   草莓u   🍓)u	   無花果   🍈)u   萊姆   🍋   )u   檸檬r      )u   蘋果u   🍎   )u   甜橙   🍊)u   酪梨u   🥑   )u   石榴u   🍑   )u   甜椒u   🫑   )u   芒果u   🥭   )u   香蕉u   🍌   )u	   胡蘿蔔   🥕   )u   玉米   🌽   )u	   葡萄柚r      )u	   玉米棒r$      )u   蕪菁   🥬   )u	   花椰菜u   🥦   )u   茄子u   🍆      )u   奶油南瓜   🎃   )u	   高麗菜r(          )u	   大南瓜r-   !   )u   鳳梨u   🍍"   )u   甜瓜r   #   )u   蜜瓜r   $   )u   羅馬萵苣r(   %   )u   甜菜r"   )u   韭蔥u   🫛)u	   小西瓜   🍉)u   西瓜r6   )&   '   (   c            	      
   i } 	 t          j        t                    }t           j        |_        |                                }t          j                    t          d          z
  	                    d          }|
                    d|f                                          }d |D             }|r-t          t          |          t          |          z  d          nd | d<   d |D             | d	<   d
 |D             | d<   |
                    d                                          }|rt!          |          nd | d<   |
                    d                                          }d |D             | d<   |                                 n)# t$          $ r}t'          |          | d<   Y d }~nd }~ww xY wt)          j                    }|t,          z
  j        }	|	dz  }
|	dz  }t0          |z
  j        }t          t3          |	dz  dz  d          d          }t4                              t3          |
d          d          }t,          	                    d          t0          	                    d          |
||||d         |d         d| d<   | S )Nr   )daysz%Y-%m-%dzSELECT value, recorded_at FROM metrics WHERE person='Zami' AND metric='sleep_duration' AND recorded_at >= ? ORDER BY recorded_at ASCc                     g | ]
}|d          S )value .0rs     ./home/debian/Projects/unified-dashboard/app.py
<listcomp>z#get_health_data.<locals>.<listcomp>.   s    111q'
111       zami_sleep_avgc                 .    g | ]}|d          dd         S )recorded_atr   r   r>   r?   s     rB   rC   z#get_health_data.<locals>.<listcomp>0   s&    %K%K%Ka&6qt&<%K%K%KrD   sleep_chart_labelsc                 :    g | ]}t          |d          d          S )r=   rE   )roundr?   s     rB   rC   z#get_health_data.<locals>.<listcomp>1   s&    %I%I%IqeAgJ&:&:%I%I%IrD   sleep_chart_valuesux   SELECT value, unit, recorded_at FROM metrics WHERE person='書韋' AND metric='weight' ORDER BY recorded_at DESC LIMIT 1shuwei_weightzaSELECT name, category, default_units, unit_pills FROM medications WHERE person='Zami' ORDER BY idc                 ,    g | ]}t          |          S r>   dictr?   s     rB   rC   z#get_health_data.<locals>.<listcomp>>   s    5551tAww555rD   medicationshealth_errori  d   r9   )u	   小寶貝u   👶z%Y/%m/%dr   )lmpdue_dateweeks
extra_daysdays_to_dueprogress_pct	baby_size
baby_emoji	pregnancy)sqlite3connect	HEALTH_DBRowrow_factorycursorr   nowr   strftimeexecutefetchallrK   sumlenfetchonerP   close	Exceptionstrr   todayLMPr;   DUE_DATEminBABY_SIZE_BY_WEEKget)dataconncseven_days_agorowssleep_valuesrowerm   days_since_lmprV   rW   rX   rY   	size_infos                  rB   get_health_datar}      s   D!&y))";KKMM #,..9!+<+<+<<FFzRRyy' 	
 

 (** 	 21D111T`!js<'8'83|;L;L'La!P!P!Pfj%K%Kd%K%K%K!"%I%ID%I%I%I!" iiZ
 
 (** 	 .1 :S			d_ yyo
 

(** 	 65555]

 & & &"1vv^& JLLEck'NaE!#Je#)K^c1C7==qAAL!%%c%nn6KLLI ||J''%%j11 "$q\l	 	D Ks   FF 
F.F))F.c                     i } 	 t          j        t                    }t           j        |_        |                                }|                    d                                          }|r|d         r|d                             d          }|d         |d         }}| d| d| d<   |                    d	| d| d
f                                          }t          |d         pd          | d<   n
d| d<   d| d<   |                    d          
                                }d |D             | d<   |                    d          
                                }	d |                    d          
                                D             }
g }d}d}d}|	D ]}|d         }|
                    |i           }|                    dd          pd}|d         pd}||z  }||z  }|d         }|d         }|r|n|r||z  nd }|r||z  }d}|                    ||d         |t          |d          t          |                    dd          pdd          t          |                    dd          pdd          t          |d          |rt          |d          nd d           || d <   t          |d          | d!<   |
r;t          |
                                          d                             dd"          nd"| d#<   |r8|dk    r2||z
  }t          |d          | d$<   t          ||z  d%z  d          | d&<   n
d | d$<   d | d&<   |                                 n)# t"          $ r}t%          |          | d'<   Y d }~nd }~ww xY w| S )(Nz4SELECT date FROM expenses ORDER BY date DESC LIMIT 1r   /r   rE   u   年u   月monthly_labelzHSELECT COALESCE(SUM(amount), 0) as total FROM expenses WHERE date LIKE ?z/%totalmonthly_totalu   本月zUSELECT date, amount, category, note FROM expenses ORDER BY date DESC, id DESC LIMIT 7c                 ,    g | ]}t          |          S r>   rO   r?   s     rB   rC   z$get_finance_data.<locals>.<listcomp>t   s    "9"9"9q477"9"9"9rD   recent_expensesz&SELECT * FROM holdings ORDER BY symbolc                 :    i | ]}|d          t          |          S )symbolrO   r?   s     rB   
<dictcomp>z$get_finance_data.<locals>.<dictcomp>x   s$    ccc1!H+tAwwcccrD   zSELECT * FROM stock_pricesFr   close_pricesharescost_per_share
total_costTname   change_amountchange_percent)r   r   r   pricechange
change_pctmarket_valuecostholdingstotal_market_value 
price_date	total_pnlrS   total_pnl_pctfinance_error)r]   r^   
FINANCE_DBr`   ra   rb   re   ri   splitintrf   rr   appendrK   listvaluesrj   rk   rl   )rs   rt   ru   ry   partsymrow2rw   r   pricesholdings_listr   r   has_costhsympir   r   
market_valcptcr   pnlrz   s                             rB   get_finance_datar   Z   s
   DK'z**";KKMM iiNOOXXZZ 	-3v; 	-K%%c**E8U1XqA'(OOQOOOD!99Z  hjj  %(W(:$;$;D!!$%D!$,D! yyc
 

(** 	 #:"9D"9"9"9 99EFFOOQQcc		:V0W0W0`0`0b0bccc
 	 	AH+CC$$BFF=!,,1Ex[%AFJ*,#$B<B>22"="v++D  d"
  &	 ua : : ?aCC#BFF+;Q$?$?$D1aHH %j! 4 4*.8dAD	" 	" 	 	 	 	 )Z%*+=q%A%A!"IOWT&--//221599&"EEEUW\ 	)
Q$z1C %c1D$)#
*:S*@!$D$DD!! $D$(D!

 ' ' ' #A_' Ks   MM 
M=!M88M=z/home/debian/Projects/ai-newsc                      t           j                            t          d          } t	          t          j        |           d          }d |D             S )z6Return list of available AI news dates (newest first)./[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].htmlTreversec                 t    g | ]5}t           j                            |                              d d          6S ).htmlr   )ospathbasenamereplace)r@   fs     rB   rC   z%get_ai_news_dates.<locals>.<listcomp>   s8    DDDBGQ''44DDDrD   )r   r   joinAI_NEWS_DIRsortedglob)patternfiless     rB   get_ai_news_datesr      sH    gll;(YZZG49W%%t444EDDeDDDDrD   c                 ~   g ddt                      d}	 t          j                            t          d          }t          t          j        |          d          }|sd|d<   |S | rUt          j                            t          |  d	          }t          j                            |          r|}nd
|  d|d<   |S |d         }t          j                            |          	                    d	d          |d<   t          |dd          5 }|                                }ddd           n# 1 swxY w Y   t          |d          }g }	|                    d          D ]$}
|
                    d          }|
                    d          }|
                    d          }|
                    d          }|sZ|r|                    d          nd}|r)d                    |                    dg                     nd}d}d|v rd}nd|v rd}nd|v rd }nd!|v rd"}nd#|v rd$}|	                    |||                    d          |r|                    d          nd|r|                    d%d          ndd&           &|	dd'         |d(<   n)# t$          $ r}t'          |          |d<   Y d}~nd}~ww xY w|S ))zaParse an AI news HTML file and extract news items.
    If date is None, use the most recent file.r   N)itemsr   errordatesr   Tr   u   找不到 AI 新聞檔案r   r   u
   找不到 u    的新聞檔案r   r   rA   zutf-8)encodingzhtml.parserz
.news-itemz.tagh2pa)strip classdefaultz	tag-modelmodelztag-industryindustryz
tag-policypolicyztag-appappztag-researchresearchhref)tagtag_typetitledescurlr   r   )r   r   r   r   r   r   r   existsr   r   openreadr   select
select_oneget_textrr   r   rk   rl   )r   rs   r   r   targetlatest_filer   htmlsoupr   item_divtag_elh2_elp_ela_eltag_text	tag_classr   rz   s                      rB   get_ai_news_datar      s]    d=N=P=PQQD=',,{,]^^ty))4888 	7DMK 	#W\\+$~~~>>Fw~~f%% $ CT C C CW(Kw''44<<WbIIV+sW555 	6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 T=11 L11 	 	H((00F''--E&&s++D&&s++D 6<DvT222"H=CKGR!8!8999I !Hi''"9,,%**#i'' 9,,%LL$d3359AD111r/3;txx+++      bqb	W   AW KsK   AJ &AJ =AJ D."J .D22J 5D26EJ 
J:J55J:r   c                     t                      } t                      }t                      }t          j                    }g d}|                    d||                                                    }t          d| |||t          j	        | 
                    dg                     t          j	        | 
                    dg                               S )N)u	   星期一u	   星期二u	   星期三u	   星期四u	   星期五u	   星期六u	   星期日u   %Y年%m月%d日 z
index.htmlrI   rL   )healthfinanceai_newsrm   sleep_labelsrx   )r}   r   r   r   rc   rd   weekdayr   jsondumpsrr   )r   r   r   rm   weekdays	today_strs         rB   indexr      s    F  G  GLNNEjjjHM(5==??2KMMNNI<"(#*#*!*(,
6::>RTV3W3W(X(X(,
6::>RTV3W3W(X(XZ Z Z ZrD   z	/api/datac                  p    t          t                      t                      t                      d          S )N)r   r   r   )r	   r}   r   r   r>   rD   rB   api_datar     s.    o//<L<N<N[k[m[mnnooorD   z/api/ai-newsc                  z    t           j                            d          } t          t	          |                     S )Nr   r   )r
   argsrr   r	   r   r   s    rB   api_ai_newsr     s1    <F##D#...///rD   __main__z0.0.0.0i  F)hostportdebug)N)r]   r   r   r   r   r   r   bs4r   flaskr   r   r	   r
   __name__r   r_   r   rn   ro   rq   r}   r   r   r   r   router   r   r   runr>   rD   rB   <module>r     s     				  . . . . . . . . . .       : : : : : : : : : : : :eHooC	F

d4B4b"!689;MOPRd!3579KMOQf   2 578J MOPb 	  2	 578J	 MOPb	
  
  5
 8:;M
 PRSh   "#5 8:;P SUVh   8 ;=>S   "#8 ;=>P   2 578P   !38MSe   8 8 8vO O Od .E E EC C C CL 3Z Z Z  ;p p p >0 0 0
 zGGeG44444 rD   