o
    qh?'                     @   s  d dl Z d dlmZ d dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lm Z! d d
l"m Z# d d
l$m Z% d d
l&m Z' d dlm(Z( e) Z*de	dej+fddZ,de	dej+fddZ-dZ.de	dej+fddZ/de	dej+fddZ0de	dej+fddZ1d)de(e2 defddZ3de2de2fddZ4d e5e6 de2fd!d"Z7de	dej+fd#d$Z8e9d%kre3 Z:e;d& e:j<d'd( dS dS )*    N)escape)Dict)UpdateInlineQueryResultArticleInputTextMessageContentReplyKeyboardMarkupKeyboardButton)	ParseMode)ApplicationApplicationBuilderCommandHandlerContextTypesMessageHandlerInlineQueryHandlerfilters)logger)toggle_subscriptionis_subscribedsearch_people)run_once)Optionalupdatecontextc                    s>   d}t tdtdggdddd}| jj||dI d H  d S )Nu  안녕하세요! 대정부·전력그룹사 봇입니다.

명령어 안내:
/start - 도움말
/subscribe - 인사 알림 구독/해지
/search - 직원 검색(산업부·기재부 통합)
팁: 채팅창에서 @봇아이디 키워드 로 인라인 검색이 가능합니다.   검색   구독TF)resize_keyboardone_time_keyboard	selective)reply_markup)r   r   message
reply_text)r   r   textkb r$   %/var/www/html/bot/app/telegram/bot.pystart(   s   r&   c                    sH   | j j}t|I d H }|r| jdI d H  d S | jdI d H  d S )Nu   구독이 설정되었습니다.
- 산업부/기재부 인사발령
- 전력그룹사 인사동정
새 글이 올라오면 알림을 보내드릴게요.uG   구독이 해지되었습니다. 다시 /subscribe 하면 구독돼요.)effective_chatidr   r    r!   )r   r   chat_idnow_onr$   r$   r%   	subscribe9   s   r+   waiting_keywordc                    s"   d|j t< | jdI d H  d S )NTuH   검색할 키워드를 입력해주세요. (이름/부서/직위/업무))	user_dataSEARCH_WAITINGr    r!   )r   r   r$   r$   r%   
search_cmdI   s   
r/   c                    s   | j j   dv rt| |I d H S  dv rt| |I d H S |jtr]d|jt< t	 
d  fddI d H }|sF| j dI d H  d S t|d d }| j j|tjdd	I d H  d S d S )
N)r   )r   Fc                      s   t  S Nr   r$   msgr$   r%   <lambda>X   s    ztext_router.<locals>.<lambda>u   검색 결과가 없습니다.
   T)
parse_modedisable_web_page_preview)r    r"   stripr/   r+   r-   getr.   asyncioget_event_looprun_in_executorr!   format_staff_resultsr	   HTML)r   r   rowsmsg_textr$   r1   r%   text_routerM   s,   

r@   c                    sj  t  r| jdI d H  d S | jdI d H  t 4 I d H  t }|d tI d H }|d tI d H }|d t	I d H }|d t
I d H }t|trS|ddn|}t|tr`|ddnd}t|trm|ddn|}	t|trz|ddnd}
d| d| d| d	| d
|	 d	|
 d}| jj|tjdI d H  W d   I d H  d S 1 I d H sw   Y  d S )NuF   이미 동기화가 진행 중입니다. 잠시만 기다려주세요.uW   동기화를 시작합니다.
- MOTIE/MOEF 조직도(org)
- MOTIE/MOEF 인사발령(id)insertedr   sentu)   동기화 완료 ✅

- MOTIE 조직도: u   건 갱신
- MOEF  조직도: u   건 갱신
- MOTIE 인사: u   건 신규, u"   건 알림 발송
- MOEF  인사: u   건 알림 발송
)r5   )	SYNC_LOCKlockedr    r!   r9   r:   r;   motie_org_syncmoef_org_syncmotie_id_syncmoef_id_sync
isinstancedictr8   r	   r=   )r   r   loop	motie_orgmoef_orgmotie_idmoef_idmotie_id_insmotie_id_sentmoef_id_insmoef_id_sentsummaryr$   r$   r%   sync_allg   s>   .rU   tokenreturnc                 C   s   | d u rt jdd} | stdt |  }|tdt	 |tdt
 |tdt |ttjtj @ t |tt |S )N	BOT_TOKEN u/   BOT_TOKEN 이 설정되어 있지 않습니다.r&   r+   search)osenvironr8   RuntimeErrorr   rV   buildadd_handlerr   r&   r+   r/   r   r   TEXTCOMMANDr@   r   inline_query)rV   appr$   r$   r%   	build_app   s   rd   rawc                 C   s$   t dd| pd}|rd| S dS )Nz[^0-9+]rY   ztel:)resub)re   digitsr$   r$   r%   	_tel_href   s   ri   r>   c              	   C   s2  g }dt dB dt fdd}t| ddD ]\}}||d}t|d	p%d
}t|dp.d
}t|dp7d
}t|dp@d
}	|dpHd
}
t|
}t|
}| d| d| d| dd|rhd| nd
|	rpd|	 nd
|r|d| d| dn|rd| nd
g}|ddd |D  qd|S )u   
    rows: [{name, position, department, task, phone}, ...]
    출력 형식:
    1) 이름 / position
    department
    task
    <a href="tel:...">원문전화번호</a>
    srcNrW   c                 S   ,   | pd  }|dkrdS |dkrdS |pdS NrY   MOTIEu	   산업부MOEFu	   기재부-upperrj   sr$   r$   r%   
_src_label       z(format_staff_results.<locals>._src_label   )r&   sourcenamerY   position
departmenttaskphonez) [z] <b>z
</b> / <b>z</b> /u   🏢 u   📝 u   📞 <a href="z">z</a>u   📞 
c                 S   s   g | ]}|r|qS r$   r$   ).0br$   r$   r%   
<listcomp>   s    z(format_staff_results.<locals>.<listcomp>z

)str	enumerater8   r   ri   r7   appendjoin)r>   linesrt   irrj   rx   ry   rz   r{   phone_display
phone_hrefphone_display_escapedblockr$   r$   r%   r<      s$   	 &
r<   c                    s  | j jpd   s| j jg dddI d H  d S t }|d  fddI d H }g }|sFtddd	  d
td  dd}|	| nrdt
d B dt
fdd}t|D ]b\}}||d}	d|	 d|dpjd  d|dptd  d}
d|dpd |dpd |dpd gd}t|g}|	td| |
pd|t|tjdd d qU| j j|dddI d H  d S )!NrY   r4   T)
cache_timeis_personalc                      s   t  ddS )Nr4   )limitr   r$   queryr$   r%   r3      s    zinline_query.<locals>.<lambda>
no_resultsu   검색 결과 없음'u)   '에 해당하는 결과가 없습니다.u   검색 결과 없음: )r"   )r(   titledescriptioninput_message_contentrj   rW   c                 S   rk   rl   rp   rr   r$   r$   r%   rt      ru   z inline_query.<locals>._src_labelrw   [z] rx   z / ry   r}   z | rz   r{   r|   z |staff_u   직원)message_textr5   r6   )rb   r   r7   answerr9   r:   r;   r   r   r   r   r   r8   r   r<   r	   r=   )r   r   rK   r>   resultsresrt   r   r   rj   r   descr2   r$   r   r%   rb      sR   
8
rb   __main__z"Telegram bot starting (polling)...F)
close_loopr0   )=rf   htmlr   r[   r9   loggingtypingr   telegramr   r   r   r   r   telegram.constantsr	   telegram.extr
   r   r   r   r   r   r   app.services.supabase_servicer   !app.services.subscription_servicer   r   app.services.search_servicer   app.crawler.motie_org_sync_n8nr   rE   app.crawler.moef_org_sync_n8nrF   app.crawler.motie_n8nrG   app.crawler.moef_n8nrH   r   LockrC   DEFAULT_TYPEr&   r+   r.   r/   r@   rU   r   rd   ri   listrJ   r<   rb   __name__rc   inforun_pollingr$   r$   r$   r%   <module>   sB   $
$#,
