§
    rŠ›j€&  ã                  óÈ   — d 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 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j        d¦  «        Z G d„ d¦  «        ZdS )z�Application Layer: Zalo AI Dispatcher & Orchestration.
Strict Hexagonal Architecture & DDD COMPLIANT (Zero direct HTTP clients).
é    )ÚannotationsN)Údatetime)Úget_settings)Ú	LLMClient)ÚTelegramBridge)ÚZaloCrmRepositoryPort)ÚZaloGatewayPort)ÚZaloHttpAdapter)ÚPostgresZaloCrmRepositoryzdscons.zalo_ai_dispatcherc                  óD   — e Zd ZdZ	 	 ddd	„Zdd„Z	 ddd„Zdd„Zdd„ZdS )ÚZaloAiDispatcherzGDispatches incoming Zalo messages to the AI Agent / Antigravity Engine.NÚzalo_gatewayúZaloGatewayPort | NoneÚcrm_repoúZaloCrmRepositoryPort | NoneÚreturnÚNonec                ó²   — t          ¦   «         | _        t          | j        ¦  «        | _        |pt	          ¦   «         | _        |pt          ¦   «         | _        d S ©N)r   Úsettingsr   Ú
llm_clientr
   r   r   r   )Úselfr   r   s      ú@C:\Projects\DSCons\app\modules\zalo_crm\application\use_cases.pyÚ__init__zZaloAiDispatcher.__init__   sJ   € õ
 %™œˆŒÝ# D¤MÑ2Ô2ˆŒØ(Ð=­OÑ,=Ô,=ˆÔØ Ð?Õ$=Ñ$?Ô$?ˆŒˆˆó    Ú	sender_idÚstrÚsender_nameÚmessageÚboolc                ó  ‡— |                      ¦   «                              ¦   «         Šg d¢}t          ˆfd„|D ¦   «         ¦  «        rdS d|v s,d|                      ¦   «         v sd|                      ¦   «         v rt          ‰¦  «        dk    S dS )	z=Determine if AI should automatically respond to this message.)z@aiÚaiÚbotz@botÚantigravityz/aiz/botz/helpz/statusz/reportz/tiendoz/vattuz/wbsu	   bÃ¡o cÃ¡oõ   tiáº¿n Ä‘á»™õ	   váº­t tÆ°u
   hÃ³a Ä‘Æ¡nu   dá»± Ã¡nõ   há»‡ thá»‘ngu
   kiá»ƒm trac              3  ó    •K  — | ]}|‰v V — Œ	d S r   © )Ú.0ÚtriggerÚ	msg_lowers     €r   ú	<genexpr>z2ZaloAiDispatcher.should_respond.<locals>.<genexpr>A   s(   øè è € Ð?Ð?¨ˆw˜)Ð#Ð?Ð?Ð?Ð?Ð?Ð?r   TÚ?u   giÃ¡m Ä‘á»‘cu   sÆ¡né   F)ÚlowerÚstripÚanyÚlen)r   r   r   r   Úai_triggersr,   s        @r   Úshould_respondzZaloAiDispatcher.should_respond&   s¨   ø€ à—M’M‘O”O×)Ò)Ñ+Ô+ˆ	ð
ð 
ð 
ˆõ. Ð?Ð?Ð?Ð?°;Ð?Ñ?Ô?Ñ?Ô?ð 	Ø�4ð �7ˆNˆNØ ×!2Ò!2Ñ!4Ô!4Ð4Ð4Ø˜×*Ò*Ñ,Ô,Ð,Ð,å�y‘>”> AÒ%Ð%àˆur   FÚis_groupú
str | Nonec              ƒ  ó�  K  — |                       |||¦  «        sdS t                               d|› d|› d|› �¦  «         |                      ¦   «         ƒ d{V —†}d}d|› d|› d|› d	�}d
}	 t	          j        | j                             d|dœd|dœgddd¬¦  «        d¬¦  «        ƒ d{V —†}	|	                     di g¦  «        d                              di ¦  «                             dd
¦  «         	                    ¦   «         }nJ# t          $ r=}
t                               d|
› �¦  «         |                      ||¦  «        }Y d}
~
nd}
~
ww xY w|s|                      ||¦  «        }d|› �}| j                             |||¬¦  «        ƒ d{V —† d|› �}t          t!          j        ¦   «         ¦  «        |dd|t%          j        ¦   «         dœ}| j                             |¦  «         	 t-          ¦   «         }|                     dd|d ¬!¦  «        ƒ d{V —† n4# t          $ r'}
t                               d"|
› �¦  «         Y d}
~
nd}
~
ww xY w|S )#zNProcess message with ERP context and dispatch reply back to Zalo and Telegram.NzAI processing message from z	 (Group: z): ut  Báº¡n lÃ  Antigravity - Trá»£ lÃ½ Ká»¹ thuáº­t & GiÃ¡m Ä‘á»‘c AI cá»§a Há»‡ thá»‘ng ERP XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n (DSCons - MST: 0202111150).
Báº¡n Ä‘ang trÃ² chuyá»‡n trá»±c tiáº¿p trong nhÃ³m Zalo 'Cty Ä�á»‹nh SÆ¡n - Dev' hoáº·c kÃªnh Ä‘iá»�u hÃ nh vá»›i GiÃ¡m Ä�á»‘c SÆ¡n vÃ  Ä‘á»™i ngÅ© ká»¹ thuáº­t.
Quy táº¯c pháº£n há»“i:
1. Phong cÃ¡ch chuyÃªn nghiá»‡p, dá»©t khoÃ¡t, am hiá»ƒu ká»¹ thuáº­t xÃ¢y dá»±ng vÃ  cÃ´ng nghá»‡ pháº§n má»�m.
2. Tuyá»‡t Ä‘á»‘i dÃ¹ng sá»‘ liá»‡u thá»±c táº¿ tá»« há»‡ thá»‘ng ERP Ä�á»‹nh SÆ¡n Ä‘Æ°á»£c cung cáº¥p trong context, khÃ´ng bá»‹a dá»¯ liá»‡u áº£o.
3. Náº¿u GiÃ¡m Ä�á»‘c SÆ¡n ra lá»‡nh, tráº£ lá»�i tÃ´n trá»�ng ('Dáº¡ sáº¿p...', 'Em Ä‘Ã£ kiá»ƒm tra...') vÃ  Ä‘Æ°a ra sá»‘ liá»‡u/hÃ nh Ä‘á»™ng chÃ­nh xÃ¡c.
4. Ä�á»‹nh dáº¡ng tin nháº¯n ngáº¯n gá»�n, rÃµ rÃ ng, phÃ¹ há»£p Ä‘á»�c trÃªn Zalo/Mobile (dÃ¹ng gáº¡ch Ä‘áº§u dÃ²ng, emoji phÃ¹ há»£p).u,   Bá»‘i cáº£nh há»‡ thá»‘ng ERP hiá»‡n táº¡i:
u   

NgÆ°á»�i gá»­i: u   
Tin nháº¯n: u%   

HÃ£y pháº£n há»“i tin nháº¯n trÃªn:Ú Úsystem)ÚroleÚcontentÚusergš™™™™™É?iô  zDev-Backend)ÚmessagesÚtemperatureÚ
max_tokensÚ
agent_codeg      @)ÚtimeoutÚchoicesr   r   r<   zLLM call timeout or error: u   ðŸ¤– [Antigravity AI]:
)Ú	target_idr   r6   Úconv_company_Úcompany_zalo_1)ÚidÚconversation_idÚsender_typer   r<   Ú	timestampu"   Antigravity AI (Pháº£n há»“i Zalo)Úai_agentT)r   r   r   Úis_internalzTelegram forward error: )r5   ÚloggerÚinfoÚ_gather_erp_contextÚasyncioÚwait_forr   Úcreate_chat_completionÚgetr1   Ú	ExceptionÚdebugÚ_generate_fallback_replyr   Úsend_messager   ÚuuidÚuuid4r   Únowr   Úinsert_messager   Úforward_inbound_message)r   r   r   r   r6   Úerp_contextÚsystem_promptÚuser_promptÚai_replyÚresÚeÚfinal_replyÚconv_idÚmsg_dataÚtbs                  r   Úprocess_and_replyz"ZaloAiDispatcher.process_and_replyN   si  è è € ð ×"Ò" 9¨k¸7ÑCÔCð 	Ø�4å�ŠØV¨+ÐVÐVÀÐVÐVÈWÐVÐVñ	
ô 	
ð 	
ð
 !×4Ò4Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆðWð 	ð3¸Kð 3ð 3Ø*ð3ð 3à"ð3ð 3ð 3ð 	ð ˆð	KÝÔ(Ø”×6Ò6à!)°mÐDÐDØ!'°KÐ@Ð@ðð !$Ø"Ø,ð 7ñ ô ð ðñ ô ð ð ð ð ð ð ˆCð —’˜	 B 4Ñ(Ô(¨Ô+ß’�Y Ñ#Ô#ß’�Y Ñ#Ô#ß’‘”ð	 ˆHøõ ð 	Kð 	Kð 	KÝ�LŠLÐ:°qÐ:Ð:Ñ;Ô;Ð;Ø×4Ò4°W¸kÑJÔJˆHˆHˆHˆHˆHˆHøøøøð	Køøøð ð 	KØ×4Ò4°W¸kÑJÔJˆHð <°Ð;Ð;ˆð Ô×,Ò,Ø¨¸xð -ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 . )Ð-Ð-ˆå•d”j‘l”lÑ#Ô#Ø&Ø!Ø)Ø"Ý!œ™œð
ð 
ˆð 	Œ×$Ò$ XÑ.Ô.Ð.ð		9ÝÑ!Ô!ˆBØ×,Ò,Ø@Ø$Ø#Ø ð	 -ñ ô ð ð ð ð ð ð ð ð øõ ð 	9ð 	9ð 	9Ý�LŠLÐ7°AÐ7Ð7Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøð Ðs1   Á*BD Ä
E	Ä3EÅE	Ç$-H È
IÈH>È>Ic              ƒ  ó¨   K  — 	 ddl m}  |¦   «         }d}t          |d¦  «        r|                     ¦   «         }d|pd› d�S # t          $ r 	 Y dS w xY w)z.Gather real live metrics from DSCons database.r   )ÚErpDatabaseClientÚget_invoices_countuQ  - CÃ´ng ty: TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n (MST: 0202111150)
- Dá»± Ã¡n trá»�ng Ä‘iá»ƒm: Dá»± Ã¡n Kiáº¿n Minh (HoÃ n thÃ nh 95% mÃ³ng), Dá»± Ã¡n Ä�áº¡i Tháº¯ng (Ä�ang triá»ƒn khai)
- Tráº¡ng thÃ¡i há»‡ thá»‘ng ERP: Hoáº¡t Ä‘á»™ng bÃ¬nh thÆ°á»�ng (FastAPI + PostgreSQL + Zalo Bridge live)
- Sá»‘ lÆ°á»£ng hÃ³a Ä‘Æ¡n GDT Ä‘Ã£ Ä‘á»“ng bá»™: éŽ   u    hÃ³a Ä‘Æ¡nuñ   - CÃ´ng ty: TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n (MST: 0202111150)
- Dá»± Ã¡n trá»�ng Ä‘iá»ƒm: Dá»± Ã¡n Kiáº¿n Minh (HoÃ n thÃ nh 95% mÃ³ng), Dá»± Ã¡n Ä�áº¡i Tháº¯ng
- Tráº¡ng thÃ¡i há»‡ thá»‘ng: Zalo CRM Bridge & Telegram Gateway Ä‘ang Online 100%)Úapp.core.postgres.erp_clientri   Úhasattrrj   rT   )r   ri   ÚclientÚinvoice_counts       r   rO   z$ZaloAiDispatcher._gather_erp_context«   s°   è è € ð	ØFÐFÐFÐFÐFÐFà&Ð&Ñ(Ô(ˆFØˆMÝ�vÐ3Ñ4Ô4ð <Ø &× 9Ò 9Ñ ;Ô ;�ðgð FSÐEYÐVYðgð gð gðøõ ð 	ð 	ð 	ðeðð ð ð	øøøs   „=A ÁAÁAc                ó®   — |                      ¦   «         }d|v sd|v sd|v sd|v r	 dS d|v sd|v rdS d	|v sd
|v sd|v rdS d|v sd|v sd|v rdS d|› d|› d�S )z6Rule-based instant response if LLM API is unavailable.u   lÃ m Ä‘Æ°á»£c gÃ¬u   hÃ´m nayu   tiáº¿n Ä‘á»™ hÃ´m nayu   káº¿t quáº£uÏ  Dáº¡ sáº¿p SÆ¡n vÃ  anh em Dev, hÃ´m nay chÃºng ta Ä‘Ã£ hoÃ n thÃ nh 5 háº¡ng má»¥c trá»�ng Ä‘iá»ƒm:
1. ðŸš€ Khá»Ÿi táº¡o & ThÃ´ng luá»“ng Zalo CRM Gateway tháº­t 100% vá»›i tÃ i khoáº£n Zalo CÃ´ng ty Ä�á»‹nh SÆ¡n.
2. ðŸ‘¥ Ä�á»“ng bá»™ Ä‘áº§y Ä‘á»§ Danh báº¡ tháº­t vÃ  NhÃ³m 'Cty Ä�á»‹nh SÆ¡n - Dev' vá»›i phÃ¢n quyá»�n VIP GiÃ¡m Ä�á»‘c.
3. ðŸ’¬ XÃ¢y dá»±ng luá»“ng nháº¯n tin 2 chiá»�u thá»�i gian thá»±c (Web Dashboard â‡„ NhÃ³m Zalo â‡„ Telegram).
4. ðŸ›¡ï¸� Thiáº¿t láº­p Kiáº¿n trÃºc Bá»�n bá»‰ (Retry Queue Buffer) giÃºp phiÃªn chat Zalo khÃ´ng bao giá»� giÃ¡n Ä‘oáº¡n khi reload server.
5. ðŸ¤– KÃ­ch hoáº¡t Antigravity AI Agent tiáº¿p nháº­n lá»‡nh Ä‘iá»�u hÃ nh & tra cá»©u ERP trá»±c tiáº¿p trong nhÃ³m Zalo!r%   u   kiáº¿n minhu¥   Dáº¡ sáº¿p, dá»± Ã¡n Kiáº¿n Minh hiá»‡n pháº§n mÃ³ng Ä‘Ã£ nghiá»‡m thu Ä‘áº¡t 95%, váº­t tÆ° thÃ©p sÃ n táº§ng 1 Ä‘Ã£ táº­p káº¿t Ä‘áº§y Ä‘á»§ táº¡i cÃ´ng trÆ°á»�ng.r&   u   thÃ©pu   giÃ¡u³   Dáº¡, báº£ng Ä‘á»‹nh má»©c váº­t tÆ° Ä�M2026 vÃ  báº£ng giÃ¡ váº­t liá»‡u xÃ¢y dá»±ng Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ng Ä‘Ã£ Ä‘Æ°á»£c cáº­p nháº­t Ä‘áº§y Ä‘á»§ trÃªn há»‡ thá»‘ng ERP.ÚstatusÚserverr'   uš   Há»‡ thá»‘ng DSCons ERP hoáº¡t Ä‘á»™ng 100%: FastAPI Backend (Port 8000), Zalo Bridge (Port 3081), CSDL PostgreSQL vÃ  Telegram Bridge Ä‘á»�u sáºµn sÃ ng.u	   Em chÃ o u.   ! Antigravity AI Ä‘Ã£ ghi nháº­n yÃªu cáº§u: 'uX   '. Em Ä‘ang Ä‘á»“ng bá»™ vÃ  theo dÃµi tiáº¿n Ä‘á»™ trÃªn há»‡ thá»‘ng ERP Ä�á»‹nh SÆ¡n.)r0   )r   r   r   r,   s       r   rV   z)ZaloAiDispatcher._generate_fallback_replyÁ   sô   € à—M’M‘O”Oˆ	à 9Ð,Ð,Ø˜YÐ&Ð&Ø&¨)Ð3Ð3Ø 	Ð)Ð)ðOðð ð ˜yÐ(Ð(¨M¸YÐ,FÐ,Fð {ð  {Ø˜IÐ%Ð%¨°IÐ)=Ð)=ÀÈ9ÐATÐATð Ið  IØ˜Ð"Ð" h°)Ð&;Ð&;¸~ÐQZÐ?ZÐ?Zð pð  pð |˜{ð  |ð  |ÐZað  |ð  |ð  |ð  |r   )NN)r   r   r   r   r   r   )r   r   r   r   r   r   r   r    )F)
r   r   r   r   r   r   r6   r    r   r7   )r   r   )r   r   r   r   r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r5   rg   rO   rV   r)   r   r   r   r      s©   € € € € € ØQÐQð 04Ø15ð@ð @ð @ð @ð @ð&ð &ð &ð &ðR PUð[ð [ð [ð [ð [ðzð ð ð ð,|ð |ð |ð |ð |ð |r   r   )rv   Ú
__future__r   rP   ÚloggingrX   r   Úapp.core.settingsr   Ú*app.modules.agents.application.llm.servicer   Ú4app.modules.integrations.application.telegram_bridger   Ú:app.modules.zalo_crm.domain.ports.zalo_crm_repository_portr   Ú3app.modules.zalo_crm.domain.ports.zalo_gateway_portr	   Ú>app.modules.zalo_crm.infrastructure.adapters.zalo_http_adapterr
   ÚDapp.modules.zalo_crm.infrastructure.repositories.zalo_crm_repositoryr   Ú	getLoggerrM   r   r)   r   r   ú<module>r�      s5  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *Ø @Ð @Ð @Ð @Ð @Ð @Ø OÐ OÐ OÐ OÐ OÐ OØ \Ð \Ð \Ð \Ð \Ð \Ø OÐ OÐ OÐ OÐ OÐ OØ ZÐ ZÐ ZÐ ZÐ ZÐ Zðð ð ð ð ð ð 
ˆÔ	Ð6Ñ	7Ô	7€ð@|ð @|ð @|ð @|ð @|ñ @|ô @|ð @|ð @|ð @|r   