o
    GHhe                     @  s   d dl mZ d dlmZmZmZmZ d dlZd dlmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZmZmZmZ e Zeedd	Zd*ddZd*ddZd+ddZd,d-ddZd,d.dd Zd/d"d#Zejd$ed%d0d(d)ZdS )1    )annotations)datedatetime	timedeltatimezoneN)DictListOptional)	APIRouterRequest)HTMLResponse)	templatessb_today_items_from_ping_status_count_last_24h	   )hoursdr   returnstrc                 C  
   |  dS )Nz%Y-%m-%dstrftimer    r   (/var/www/html/bot/app/web/pages/index.py	_yyyymmdd      
r   c                 C  r   )Nz%m-%dr   r   r   r   r   _mmdd   r   r   dt_isoOptional[str]c                 C  sL   | sdS zt t| dd}|tdW S  ty%   t|  Y S w )uE   ISO8601 문자열(UTC/오프셋 포함)을 KST 'YYYY-MM-DD HH:MM'로.NZz+00:00z%Y-%m-%d %H:%M)r   fromisoformatr   replace
astimezoneKSTr   	Exception)r    dtr   r   r   _to_kst_str   s   r)      tabledaysintDict[str, int]c           
        s   t  t|d d }t| d}zt| dd|d	 }|j
p)g }W n ty6   g }Y nw i }|D ]}|d}|sEq;t|dd }	||	dd ||	< q;|S )	ud   테이블에서 최근 N일(created_at 기준) 일자별 건수를 dict[YYYY-MM-DD]=count 로 반환   r,   z	T00:00:00
created_ati N  N
   r   )r   todayr   r   r   r+   selectgtelimitexecutedatar'   getr   )
r+   r,   start	start_isoresrowsbucketsrtskeyr   r   r   _counts_last_n_days!   s,   
rB   r>   Dict[str, List]c                 C  sn   g g }}t  t|d d }t|D ]}|t|d }t|}|t| || |d q||dS )u@   연속된 N일 라벨과 해당 카운트(없으면 0)를 반환r/   r0   r   )labelscounts)r   r3   r   ranger   appendr   r9   )r>   r,   rD   rE   r:   ir   ymdr   r   r   _series_fill9   s   

rJ   targetc                 C  sv   z0t ddd| ddjddjdddd	 }|j	p$g }|r.|d
 d W S dW S  t
y:   Y dS w )uI   crawler_run에서 status='passed'이면서 finished_at 최근 1건 반환crawler_runfinished_atrK   statuspassednullTdescr/   r   N)r   r+   r4   eqnot_is_orderr6   r7   r8   r'   )rK   r<   r=   r   r   r   _last_run_finished_atD   s    


rW   /)response_classrequestr   c                   s  t dddddd}t ddddd	d}t d
dddd	d}|| | }ztddjdddd }|jp9g }W n tyF   g }Y nw g }t	
  }|D ])}	t|	dp_|	dp_dd	d }
|
|krz||	dpqd|	d|
d qQtdtddtdtddtdtddtdtd dtd!tddd"}ttdttd#d$ttdttd%d$ttd
ttd&d$d'ttd id(ttd)id"}tdd*d+I d	H }tdd*d+I d	H }tdd*d+I d	H }i }t	
 td,d+   fd-d.td*D }|D ]}
t|
}||d/||d/ ||< qt|d*d+}t|d*d+}td0| ||||||tj|d1d2tj|d1d2d3	S )4u<   홈 대시보드: 오늘자 스냅샷 + 상태 + 7일 추이moef_idMOEFtitleurltag)	title_keyurl_keytag_keymotie_idMOTIENme_idMEkepco_idz'department,posted_at,pdf_url,created_atidTrQ      	posted_atr1    r2   
department-pdf_url)rl   r^   r   zhttps://www.moef.go.kr)pingcount24zhttps://www.motie.go.krzhttps://me.go.krme_org_snapshotzhttps://www.assembly.go.krcongress_memberzhttps://www.alio.go.kr)r\   rd   rf   CONGRESSALIOmoef_org)insadongjeongjikwon	motie_orgme_orguieongongsi	group_n8nr*   r0      c                   s   g | ]	} t |d  qS )r0   )r   ).0rH   r:   r   r   
<listcomp>   s    zindex.<locals>.<listcomp>r   z
index.htmlF)ensure_ascii)	rZ   	gov_todaygroup_todayrN   last	chart_govchart_groupchart_gov_jsonchart_group_json)r   r   r+   r4   rV   r6   r7   r8   r'   r   r3   	isoformatr   r9   rG   r   r   r)   rW   rB   r   rF   r   rJ   r   TemplateResponsejsondumps)rZ   
moef_todaymotie_todayme_todayr   res_kk_rowsr   	today_strr?   r   rN   r   moef_bmotie_balio_bgov_bdays7rI   r   r   r   r   r   indexV   s   $	





 r   )r   r   r   r   )r    r!   r   r!   )r*   )r+   r   r,   r-   r   r.   )r>   r.   r,   r-   r   rC   )rK   r   r   r!   )rZ   r   ) 
__future__r   r   r   r   r   r   typingr   r   r	   fastapir
   r   fastapi.responsesr   app.web.depsr   r   r   r   r   routerr&   r   r   r)   rB   rJ   rW   r9   r   r   r   r   r   <module>   s"   




