o
    ]i2                  
   @   sL  d Z ddlZejjdd 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 d-dd	Zd-d
dZdd Zdd Zd-ddZedkrdddddddgg dddddgg dddd d!ddd"d#dg d$d"d%dgg g ddgZed& eeed'd( ed) eeZeree ed* eed'd(Zeejed!d+d, dS dS ).uM   
報告產生模組

產生變更報告（文字、JSON、Telegram 格式）
    Nutf-8encoding)datetime)Path)get_changes_by_date"get_appraiser_count_by_associationget_total_appraisersc              
      sX  t  d}g }|d |d|  |d |d |d |d t }t }t| D ]e\ }t fdd| D d	}|r|d
 r|d r|d }g }	|d rf|	dt	|d   |d rv|	dt	|d   |	r}d
|	nd}
|d  d| d|
 d q6|d  d| d q6|d |d| d |d g }g }g }g }| D ]0}|d
 r|d r||d d  ||d d  ||d d  ||d dg  q|r|dt	| d |d |D ]}|dd}|d |d!  d"|d#  d$|  q|d |r`|d%t	| d |d |D ]&}|dd}|rEd&| dnd}|d |d!  d"|d#  d|  q4|d |r|d't	| d |d |D ]'}|d |d!  d"|d#  d |d(|d)   |d*|d+   qu|d |r|d,t	| d |d |d- |D ]8}|d. dd}|d/ dd}|d |d!  d"|d#  d ||kr|d0|  |d1|  q|d |s|s|s|s|d2 |d |r"|d |d3|d4d5 |d d6
|S )7u   
    產生文字報告

    Args:
        results: 各公會的處理結果列表
        scrape_duration: 抓取耗時（秒）

    Returns:
        str: 文字報告
    %Y-%m-%dz2==================================================u   估價師名冊變更報告 -  u   統計摘要z------------------------------c                 3   s     | ]}|d   kr|V  qdS )associationN .0rassocr   ZC:\Users\User\Documents\GitHub\Research_zoo\projects\taiwan-appraiser-registry\reporter.py	<genexpr>,   s    z'generate_text_report.<locals>.<genexpr>Nhas_changeschangesnew+left-z, u	   無變化  z: u    位（   ）u    位（無變化）u/     ───────────────u
     合計:     位office_changedsuspected_data_fixu   新加入 ()office   未知z  - name   （r   u   ）- u   退出 (u	   （原：u   換事務所 (u
       舊：
old_officeu
       新：
new_officeu   ⚠️ 疑似資料修正 (uO     (同名同時出現在新加入與退出，可能是公會修正重複資料)
old_record
new_recordu       舊記錄事務所：u       新記錄事務所：u   本次無任何變更u   抓取耗時: z.1fu    秒
)r   nowstrftimeappendr   r	   sorteditemsnextlenjoinextendget)resultsscrape_durationtodaylinesby_assoctotalcountresultr   Z
diff_partsZdiff_strall_newall_leftall_office_changedall_suspected_data_fixitemr!   Z
office_strr%   r&   r   r   r   generate_text_report   s   




 


&

(

 


 






rA   c              
   C   s
  t  d}g }g }g }g }g }| D ];}|d rN|d rN||d d  ||d d  ||d d  ||d dg  ||d dg  qt }	t }
|||
|	t|t|t|t|t|d	t|pr|pr|pr||||||d
dd | D d}|S )u   
    產生 JSON 報告

    Args:
        results: 各公會的處理結果列表
        scrape_duration: 抓取耗時（秒）

    Returns:
        dict: JSON 報告
    r
   r   r   r   r   r   info_updatedr   )Ztotal_appraisersZby_association	new_countZ
left_countZoffice_changed_countZinfo_updated_countZsuspected_data_fix_count)r   r   r   rB   r   c                 S   s$   g | ]}|d  |d |d dqS )r   record_countr   )r   rD   r   r   r   r   r   r   
<listcomp>   s    z(generate_json_report.<locals>.<listcomp>)report_dateZscrape_duration_secondssummaryr   r   Zresults_by_association)	r   r*   r+   r2   r3   r   r	   r0   bool)r4   r5   r6   r<   r=   r>   Zall_info_updatedr?   r;   r8   r9   reportr   r   r   generate_json_report~   sL   	rJ   c           
   	   C   sP  t  d}g }g }g }g }| D ]0}|d rA|d rA||d d  ||d d  ||d d  ||d dg  q|sL|sL|sL|sLdS g }|d	| d
 |d |d |rn|dt| d |r{|dt| d |r|dt| d |r|dt| d |d |d |r|d |d |dd D ]}|dd}	|d|d  d|d  d|	  qt|dkr|dt|d  d |r|d |d |dd D ]}|d|d  d|d  d qt|dkr|dt|d  d |rc|d |d |dd D ]"}|d|d  d|d  d |d |d!  d"|d#   q,t|dkrc|dt|d  d |r|d |d$ |d% |dd D ]}|d|d  d|d  d q{t|dkr|dt|d  d d&|S )'u   
    產生 Telegram 通知訊息

    Args:
        results: 各公會的處理結果列表

    Returns:
        str: Telegram 訊息（使用 Markdown 格式）
    r
   r   r   r   r   r   r   Nu   *估價師名冊變更通知* (r    r   u   *變更摘要：*u   • 新加入: r   u   • 退出: u   • 換事務所: u   • 疑似資料修正: u   *詳細內容：*u   📥 *新加入*   r!   r"   r   r#   r$   r   u   ）→ u     ...還有 u   📤 *退出*r   u   🔄 *換事務所*z    r%   u    → r&   u   ⚠️ *疑似資料修正*u+     (同名同時出現在新加入與退出)r)   )r   r*   r+   r2   r3   r,   r0   r1   )
r4   r6   r<   r=   r>   r?   r;   r7   r@   r!   r   r   r   generate_telegram_message   sx   






&

"

 "


$
rL   c              
   C   s   ddl }tjd}tjd}|r|std dS d| d}z"|j||| d	d
d}|jdkr8td W dS td|j  W dS  ty\ } ztd|  W Y d}~dS d}~ww )ur   
    發送 Telegram 通知

    Args:
        message: 訊息內容

    Returns:
        bool: 是否成功
    r   NZTELEGRAM_BOT_TOKENZTELEGRAM_CHAT_IDu9   警告: 未設定 TELEGRAM_BOT_TOKEN 或 TELEGRAM_CHAT_IDFzhttps://api.telegram.org/botz/sendMessageZMarkdown)chat_idtextZ
parse_mode)json   u   Telegram 通知已發送Tu   Telegram 發送失敗: u   Telegram 發送錯誤: )	requestsosenvironr3   printpoststatus_coderN   	Exception)messagerQ   Z	bot_tokenrM   urlresponseer   r   r   send_telegram_notification  s.   


r\   c                 C   s   |du rt tjd d }t |}|jddd | d }d| d}|| }t|d	d
d}tj| |ddd W d   n1 sAw   Y  td|  |S )u   
    儲存報告到檔案

    Args:
        report: JSON 報告
        report_dir: 報告目錄

    Returns:
        Path: 報告檔案路徑
    NdataZreportsT)parentsexist_okrF   Zreport_z.jsonwr   r   F   ensure_asciiindentu   報告已儲存: )r   __file__parentmkdiropenrO   dumprT   )rI   Z
report_dirZdate_strfilenamefilepathfr   r   r   save_report4  s   rm   __main__u	   台北市   Tu	   陳小明u   信義估價師事務所)r#   r   r!   u	   林美玲u
   A事務所u
   B事務所)r#   r   r%   r&   )r   r   r   rB   )r   rD   r   r   u	   新北市B   Fu	   高雄市J   u	   王大華u   高雄估價師事務所u   === 文字報告 ===gL9@)r5   u   
=== Telegram 訊息 ===u   
=== JSON 報告 ===ra   rb   )N)__doc__sysstdoutreconfigurerO   rR   r   pathlibr   databaser   r   r	   rA   rJ   rL   r\   rm   __name__Ztest_resultsrT   telegram_msgjson_reportdumpsr   r   r   r   <module>   sf    

n>R
&

%