§
     ’jj  ã                  ó�   — d Z ddlmZ ddlZddlmZ ddlmZ ddlZddl	m
Z
 ddlmZ  ej        d¦  «        Z G d	„ d
¦  «        ZdS )zÂVision & Multimodal AI Reasoning Engine for Automated Engineering Takeoff.
Leverages Google Gemini 3.1 Pro High Reasoning, dual CAD & HSMT pairing,
and 2026 construction legal norms compliance.
é    )ÚannotationsN)ÚPath)ÚAny)Ú	LLMClient)Ú"get_vietnamese_cad_font_transcoderzdscons.takeoff.vision_reasoningc                  ó8   — e Zd ZdZdd„Z	 	 ddd„Zdd„Zdd„ZdS )ÚTakeoffVisionReasoningEnginez=Engine handling Gemini 3.1 Pro high reasoning vision takeoff.Ú
erp_clientr   Ú
llm_clientr   c                óH   — || _         || _        t          ¦   «         | _        d S ©N)Ú_erp_clientÚ_llm_clientr   Ú_font_transcoder)Úselfr
   r   s      úFC:\Projects\DSCons\app\modules\takeoff\application\vision_reasoning.pyÚ__init__z%TakeoffVisionReasoningEngine.__init__   s&   € Ø%ˆÔØ%ˆÔÝ BÑ DÔ DˆÔÐÐó    NÚdrawing_filenameÚstrÚhintú
str | NoneÚsearch_dirsúlist[Path | str] | NoneÚreturnútuple[str | None, str | None]c                ón  — |€Ht          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        g}g }|                     ¦   «         }d|v sd|v sd	|v sd
|v r|                     g d¢¦  «         d|v sd|v r|                     g d¢¦  «         |r1|                     d„ |                     ¦   «         D ¦   «         ¦  «         g d¢}|D �]S}t          |¦  «        }|                     ¦   «         sŒ'	 |                     d¦  «        D ]á}	|	                     ¦   «         sŒ|	j                             ¦   «         |vrŒ3|	j                             ¦   «         |                     ¦   «         k    rŒc|	j                             ¦   «         }
d|
v sd|
v sd|
v sd|
v sd|
v sd|
v rM|D ]J}||
v rD|  	                    |	¦  «        }t                               d|	j        ¦  «         |	j        |fc c c S ŒKŒâ�Œ!# t          $ r'}t                               d||¦  «         Y d}~�ŒMd}~ww xY wdS )zDAuto-discover matching HSMT / BoQ Excel / PDF tender specifications.Nu   HÄ�-2026u!   HÄ�-2026/TTDVSNC Kiáº¿n Minh-2026u    HÄ�-2026/NVH Ä�áº¡i Tháº¯ng-2026zstorage/secure_vaultzapp/static/drawingsú	kien minhzkenh ong denúong denÚttdvsnc)r   r   Úbieu_mauõ   má»�i tháº§uúmoi thauÚhsmtúdu toanú	dai thangÚnvh)r&   r'   r"   r$   c                ó€   — g | ];}t          |¦  «        d k    ¯|                     ¦   «                              ¦   «         ‘Œ<S )é   )ÚlenÚstripÚlower)Ú.0Úws     r   ú
<listcomp>zFTakeoffVisionReasoningEngine.discover_related_hsmt.<locals>.<listcomp>D   s6   € ÐSÐSÐS°1ÍÈAÉÌÐQRÊ
È
˜QŸWšW™YœYŸ_š_Ñ.Ô.È
È
È
r   )ú.pdfz.xlsxz.xlsz.docz.docxÚ*r"   r#   r$   r!   u   báº£ng tiÃªn lÆ°á»£ngr%   uC   [TAKEOFF] Ä�Ã£ tá»± Ä‘á»™ng phÃ¡t hiá»‡n HSMT Ä‘á»‘i soÃ¡t kÃ©p: %su'   [TAKEOFF] Lá»—i quÃ©t HSMT táº¡i %s: %s©NN)r   r,   ÚextendÚsplitÚexistsÚrglobÚis_fileÚsuffixÚnameÚ_read_hsmt_sample_textÚloggerÚinfoÚ	ExceptionÚwarning)r   r   r   r   ÚkeywordsÚ
name_lowerÚhsmt_extensionsÚs_dirÚp_dirÚ	file_pathÚf_lowerÚkwÚcontent_summaryÚes                 r   Údiscover_related_hsmtz2TakeoffVisionReasoningEngine.discover_related_hsmt   sñ  € ð Ðå�ZÑ Ô ÝÐ8Ñ9Ô9ÝÐ7Ñ8Ô8ÝÐ+Ñ,Ô,ÝÐ*Ñ+Ô+ðˆKð ˆØ%×+Ò+Ñ-Ô-ˆ
à˜:Ð%Ð%Ø Ð+Ð+Ø˜JÐ&Ð&Ø˜JÐ&Ð&à�OŠOðð ð ñ
ô 
ð 
ð ˜*Ð$Ð$¨°Ð(;Ð(;Ø�OŠOÐHÐHÐHÑIÔIÐIØð 	UØ�OŠOÐSÐS¸¿
º
¹¼ÐSÑSÔSÑTÔTÐTàDÐDÐDˆà ð 	Tñ 	TˆEÝ˜‘K”KˆEØ—<’<‘>”>ð ØðTØ!&§¢¨SÑ!1Ô!1ð Gð G�IØ$×,Ò,Ñ.Ô.ð !Ø Ø Ô'×-Ò-Ñ/Ô/°ÐFÐFØ Ø ”~×+Ò+Ñ-Ô-Ð1A×1GÒ1GÑ1IÔ1IÒIÐIØ à'œn×2Ò2Ñ4Ô4�Gà&¨'Ð1Ð1Ø%¨Ð0Ð0Ø! WÐ,Ð,Ø%¨Ð0Ð0Ø2°gÐ=Ð=Ø$¨Ð/Ð/à"*ð Gð G˜BØ! W˜}˜}Ø26×2MÒ2MÈiÑ2XÔ2X Ý &§¢Ø$iØ$-¤Nñ!"ô !"ð !"ð (1¤~°Ð'FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fð  -øñ%Gøõ2 ð Tð Tð TÝ—’ÐHÈ%ÐQRÑSÔSÐSÐSÐSÐSÐSÑSøøøøðTøøøð ˆzs   ÄC2HÇ=HÈ
H2ÈH-È-H2rD   r   c                ó  — |j                              ¦   «         }|dk    rí	 t          j        t	          |¦  «        ¦  «        }g }t          t          dt          |¦  «        ¦  «        ¦  «        D ]4}||                              d¦  «        }|r| 	                    |¦  «         Œ5| 
                    ¦   «          d                     |¦  «        dd…         S # t          $ r,}t                               d|j        |¦  «         Y d}~dS d}~ww xY wdS )	z.Read text summary from HSMT PDF or Excel file.r0   é   Útextú
Ni   u7   [TAKEOFF] KhÃ´ng thá»ƒ Ä‘á»�c text tá»« PDF HSMT %s: %sÚ )r8   r,   ÚfitzÚopenr   ÚrangeÚminr*   Úget_textÚappendÚcloseÚjoinr=   r;   r>   r9   )r   rD   ÚextÚdocÚ
text_partsÚp_idxÚ	page_textrH   s           r   r:   z3TakeoffVisionReasoningEngine._read_hsmt_sample_textk   s  € àÔ×$Ò$Ñ&Ô&ˆØ�&Š=ˆ=ðÝ”i¥ I¡¤Ñ/Ô/�Ø�
Ý"¥3 q­#¨c©(¬(Ñ#3Ô#3Ñ4Ô4ð 5ð 5�EØ # E¤
× 3Ò 3°FÑ ;Ô ;�IØ ð 5Ø"×)Ò)¨)Ñ4Ô4Ð4øØ—	’	‘”�Ø—y’y Ñ,Ô,¨U¨d¨UÔ3Ð3øÝð ð ð Ý—’ØMÈyÌ~Ð_`ñô ð ð �r�r�r�r�røøøøð	øøøð
 ˆrs   ¡B2C Ã
D
Ã!DÄD
ú
Path | strúdict[str, Any]c                óL  ‡— t          |¦  «        }|                     ¦   «         r|j                             ¦   «         dk    rdg dœS g }	 t	          j        t          |¦  «        ¦  «        }t          t          |¦  «        ¦  «        D �]D}||         }| 	                    d¦  «        }| j
                             |¦  «        }| 	                    d¦  «        }	g }
d}|	D ]‘}|d                              ¦   «         }|sŒ| j
                             |¦  «        Št          ˆfd„dD ¦   «         ¦  «        r|
                     ‰d	d
…         ¦  «         t          ˆfd„dD ¦   «         ¦  «        r|dz  }Œ’|                     |dz   t          |j        j        ¦  «        t          |j        j        ¦  «        |
d	d…         ||d	d…         dœ¦  «         �ŒF|                     ¦   «          n2# t(          $ r%}t*                               d|¦  «         Y d	}~nd	}~ww xY wt          |¦  «        |dœS )zWExtract structured headings, tables, blocks, and CAD text to maximize AI comprehension.r0   r   )Ú
page_countÚ	structurerL   Úblocksé   c              3  óD   •K  — | ]}|‰                      ¦   «         v V — Œd S r   )Úupper©r-   rF   Úclean_bs     €r   ú	<genexpr>zQTakeoffVisionReasoningEngine.extract_ai_friendly_pdf_structure.<locals>.<genexpr>˜   sD   øè è € ð ð àð ˜gŸmšm™oœoÐ-ðð ð ð ð ð r   )u   Máº¶T Báº°NGu   Máº¶T Cáº®Tu
   CHI TIáº¾Tu   THá»�NG KÃŠu   Báº¢NG TIÃŠN LÆ¯á»¢NGu
   Dá»° TOÃ�Nu	   BÃŠ TÃ”NGu   Cá»�T THÃ‰PNéx   c              3  ó    •K  — | ]}|‰v V — Œ	d S r   © re   s     €r   rg   zQTakeoffVisionReasoningEngine.extract_ai_friendly_pdf_structure.<locals>.<genexpr>¦   s;   øè è € ð 
ð 
àð ˜g˜ð
ð 
ð 
ð 
ð 
ð 
r   )ÚSTTu   Ä�VTu   Khá»‘i lÆ°á»£ngu
   Ä�Æ¡n giÃ¡u   ThÃ nh tiá»�nu
   KÃ½ hiá»‡ué   é   iX  )Úpage_numberÚwidthÚheightÚheadersÚtables_detectedÚclean_text_previewu4   [TAKEOFF] Lá»—i trÃ­ch xuáº¥t cáº¥u trÃºc AI PDF: %s)r   r5   r8   r,   rO   rP   r   rQ   r*   rS   r   Údecode_cad_textr+   ÚanyrT   ÚfloatÚrectro   rp   rU   r=   r;   Úerror)r   rD   ÚpÚ
pages_datarX   Úpage_idxÚpageÚraw_textÚ
clean_textra   rq   rr   ÚbÚ
block_textrH   rf   s                  @r   Ú!extract_ai_friendly_pdf_structurez>TakeoffVisionReasoningEngine.extract_ai_friendly_pdf_structure   s…  ø€ õ �‰OŒOˆØ�xŠx‰zŒzð 	6˜QœXŸ^š^Ñ-Ô-°Ò7Ð7Ø"#°"Ð5Ð5Ð5àˆ
ð7	TÝ”)�C ™FœFÑ#Ô#ˆCÝ!¥# c¡(¤(™OœOð 2ñ 2�Ø˜8”}�ØŸ=š=¨Ñ0Ô0�Ø!Ô2×BÒBÀ8ÑLÔL�
àŸš xÑ0Ô0�Ø�Ø"#�àð -ð -�AØ!" 1¤§¢¡¤�JØ%ð !Ø Ø"Ô3×CÒCÀJÑOÔO�GÝð ð ð ð ð	#ðñ ô ñ ô ð 6ð  Ÿš w¨t°¨t¤}Ñ5Ô5Ð5Ýð 
ð 
ð 
ð 
ð#ð
ñ 
ô 
ñ 
ô 
ð -ð (¨1Ñ,˜øà×!Ò!à'/°!¡|Ý!& t¤y¤Ñ!7Ô!7Ý"'¨¬	Ô(8Ñ"9Ô"9Ø#*¨2¨A¨2¤;Ø+:Ø.8¸¸#¸Ô.>ðð ñ	ô 	ð 	ñ 	ð �IŠI‰KŒKˆKˆKøÝð 	Tð 	Tð 	TÝ�LŠLÐOÐQRÑSÔSÐSÐSÐSÐSÐSÐSøøøøð	Tøøøõ ˜j™/œ/Ø#ð
ð 
ð 	
s   Á
FG" Ç"
HÇ,HÈH)r
   r   r   r   r2   )r   r   r   r   r   r   r   r   )rD   r   r   r   )rD   r\   r   r]   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rI   r:   r�   rj   r   r   r	   r	      s‡   € € € € € ØGÐGðEð Eð Eð Eð  Ø/3ð	Kð Kð Kð Kð KðZð ð ð ð(E
ð E
ð E
ð E
ð E
ð E
r   r	   )r…   Ú
__future__r   ÚloggingÚpathlibr   Útypingr   rO   Ú)app.modules.agents.application.llm_clientr   Ú>app.modules.takeoff.application.vietnamese_cad_font_transcoderr   Ú	getLoggerr;   r	   rj   r   r   ú<module>r�      sÚ   ððð ð
 #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð 
ˆÔ	Ð<Ñ	=Ô	=€ðn
ð n
ð n
ð n
ð n
ñ n
ô n
ð n
ð n
ð n
r   