§
    1›ªjú&  ã                  ó  — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
mZmZmZmZ 	 ddlmZ n# e$ r dZY nw xY w	 ddlZn# e$ r dZY nw xY wddlmZmZ ddlmZmZ dd	lmZ e G d
„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )u—  AutoPOE2 - Stash UI Scanner (Doc 63 / SSoT 2026).

Bá»™ quÃ©t thá»‹ giÃ¡c mÃ¡y tÃ­nh vÃ  WinOCR cho giao diá»‡n hÃ²m Ä‘á»“ (Stash):
- Nháº­n diá»‡n tráº¡ng thÃ¡i má»Ÿ/Ä‘Ã³ng cá»§a Stash UI.
- QuÃ©t thanh Tab Bar, phÃ¢n tÃ­ch danh sÃ¡ch Stash Tabs vÃ  loáº¡i Tab.
- Thá»±c hiá»‡n chuyá»ƒn Ä‘á»•i Tab chÃ­nh xÃ¡c báº±ng Click chuá»™t tuyá»‡t Ä‘á»‘i.
- Ä�Ã³ng giao diá»‡n Stash an toÃ n báº±ng phÃ­m Spacebar.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚImage)ÚStashTabTypeÚTAB_NAME_MAPPINGS)ÚclickÚdismiss_modals)Úis_inventory_openc                  ó^   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
ed<   dZded<   dS )ÚStashTabInfou9   ThÃ´ng tin chi tiáº¿t cá»§a má»™t ngÄƒn hÃ²m Ä‘á»“ (Tab).ÚintÚindexÚstrÚnamer   Útab_typeÚcenter_xÚcenter_yzTuple[int, int, int, int]Úbounding_boxFÚboolÚ	is_activeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   © ó    úAC:\Projects\AutoPOE2\src\assistant_tool\stash\stash_ui_scanner.pyr   r   #   se   € € € € € € àCÐCØ€J€J�JØ€I€I�IØÐÐÑØ€M€M�MØ€M€M�MØ+Ð+Ð+Ñ+Ø€IÐÐÐÑÐÐr$   r   c                  óh   — e Zd ZdZ	 	 	 d%d&d
„Zd'd„Zd(d„Zd)d„Zd*d„Zd+d„Z	d,d„Z
	 d-d.d!„Zd/d0d$„ZdS )1ÚStashUiScanneru¼   
    Bá»™ quÃ©t quang há»�c vÃ  Ä‘iá»�u khiá»ƒn giao diá»‡n Stash.
    Tá»± Ä‘á»™ng co giÃ£n tá»�a Ä‘á»™ theo tá»· lá»‡ mÃ n hÃ¬nh (máº·c Ä‘á»‹nh tham chiáº¿u 1920x1080 -> 2560x1440).
    é 
  é   NÚscreen_wr   Úscreen_hÚ
click_funcú#Optional[Callable[[int, int], Any]]c                óR  — || _         || _        || _        |dk    r|dz  nd| _        |dk    r|dz  nd| _        t          d| j        z  ¦  «        t          d| j        z  ¦  «        t          d| j        z  ¦  «        t          d| j        z  ¦  «        f| _        g | _        d	| _        d S )
Nr   g      ž@g      ð?g     à�@é   é#   éî  éð   éÿÿÿÿ)	r*   r+   r,   Úscale_xÚscale_yr   Útab_bar_roiÚdetected_tabsÚactive_tab_index)Úselfr*   r+   r,   s       r%   Ú__init__zStashUiScanner.__init__5   s·   € ð !ˆŒØ ˆŒØ$ˆŒØ,4°qªL¨L�x &Ñ(Ð(¸cˆŒØ,4°qªL¨L�x &Ñ(Ð(¸cˆŒõ
 ��T”\Ñ!Ñ"Ô"Ý��T”\Ñ!Ñ"Ô"Ý��d”lÑ"Ñ#Ô#Ý��d”lÑ"Ñ#Ô#ð	
ˆÔð 24ˆÔØ%'ˆÔÐÐr$   Ú	img_inputúUnion[str, Image.Image]ÚreturnúOptional[Image.Image]c                ó8  — |€d S t          |t          ¦  «        rZt          j                             |¦  «        sd S 	 t          j        |¦  «                             d¦  «        S # t          $ r Y d S w xY w	 |                     d¦  «        S # t          $ r |cY S w xY w)NÚRGB)	Ú
isinstancer   ÚosÚpathÚexistsr   ÚopenÚconvertÚ	Exception)r9   r;   s     r%   Ú	_load_pilzStashUiScanner._load_pilN   s¿   € ØÐØ�4Ý�i¥Ñ%Ô%ð 	Ý”7—>’> )Ñ,Ô,ð Ø�tðÝ”z )Ñ,Ô,×4Ò4°UÑ;Ô;Ð;øÝð ð ð Ø�t�tðøøøð	Ø×$Ò$ UÑ+Ô+Ð+øÝð 	ð 	ð 	ØÐÐÐð	øøøs#   ¼&A# Á#
A1Á0A1Á5B
 Â
BÂBr   c           	     ó8  — |                       |¦  «        }|�t          €dS t          |¦  «        sdS 	 |                     t	          d| j        z  ¦  «        t	          d| j        z  ¦  «        t	          d| j        z  ¦  «        t	          d| j        z  ¦  «        f¦  «        }t          j        |¦  «        }d                     d„ | 	                    d	g ¦  «        D ¦   «         ¦  «         
                    ¦   «         }g d
¢}|D ]	}||v r dS Œ
n# t          $ r Y nw xY wdS )uÉ  
        Kiá»ƒm tra xem giao diá»‡n Stash cÃ³ Ä‘ang má»Ÿ trÃªn mÃ n hÃ¬nh hay khÃ´ng (SSoT 2026).
        TiÃªu chuáº©n báº¥t biáº¿n:
        1. Báº¯t buá»™c Inventory bÃªn pháº£i mÃ n hÃ¬nh pháº£i Ä‘ang má»Ÿ (is_inventory_open).
        2. VÃ¹ng Stash bÃªn trÃ¡i (header hoáº·c tab bar) pháº£i chá»©a tá»« khÃ³a UI Stash (STASH, CURRENCY, GEM, MAP...).
        TrÃ¡nh hoÃ n toÃ n False Positive do nhÃ£n 3D 'STASH' cá»§a hÃ²m Ä‘á»“ dÆ°á»›i Ä‘áº¥t.
        NFr/   é   r1   éÈ   ú c              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS )ÚtextÚ N)Úget)Ú.0Úlines     r%   ú	<genexpr>z/StashUiScanner.is_stash_open.<locals>.<genexpr>v   s0   è è € ÐRÐR°T˜DŸHšH V¨RÑ0Ô0ÐRÐRÐRÐRÐRÐRr$   Úlines)ÚSTASHÚTASHÚCURRENCYÚCURRÚWAYSTONEÚMAPÚGEMSÚGEMÚRITUALÚ	FRAGMENTSÚDUMPÚQUADT)rH   Úwinocrr   Úcropr   r4   r5   Úrecognize_pil_syncÚjoinrP   ÚupperrG   )r9   r;   ÚimgÚ
crop_stashÚresÚblobÚstash_keywordsÚkws           r%   Úis_stash_openzStashUiScanner.is_stash_open]   sN  € ð �nŠn˜YÑ'Ô'ˆØˆ;�&˜.Ø�5õ ! Ñ%Ô%ð 	Ø�5ð	àŸšÝ�B˜œÑ%Ñ&Ô&Ý�B˜œÑ%Ñ&Ô&Ý�C˜$œ,Ñ&Ñ'Ô'Ý�C˜$œ,Ñ&Ñ'Ô'ð	#ñ ô ˆJõ Ô+¨JÑ7Ô7ˆCØ—8’8ÐRÐR¸S¿WºWÀWÈbÑ=QÔ=QÐRÑRÔRÑRÔR×XÒXÑZÔZˆDðð ð ˆNð %ð  ð  �Ø˜�:�:Ø˜4˜4ð ð øõ ð 	ð 	ð 	ØˆDð	øøøàˆus   ³CD
 ÄD
 Ä

DÄDúList[StashTabInfo]c                óº  — |                       |¦  «        }|�t          €g S g }| j        \  }}}}	 |                     ||||f¦  «        }t          j        |¦  «        }	|	                     dg ¦  «        }
d}h d£}|
D �]’}|                     dg ¦  «        }|sŒ|D �]r}|                     dd¦  «                             ¦   «         }|r)|                     ¦   «         |v st          |¦  «        dk    rŒW|                     d	i ¦  «        }||                     d
d¦  «        z   }||                     dd¦  «        z   }|                     dd¦  «        }|                     dd¦  «        }t          ||dz  z   ¦  «        }t          ||dz  z   ¦  «        }|  
                    |¦  «        }t          |||||t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        fd¬¦  «        }|                     |¦  «         |dz  }�Œt�Œ”|                     d„ ¬¦  «         t          |¦  «        D ]\  }}||_        Œ|| _        |S # t"          $ r g cY S w xY w)u¿   
        QuÃ©t vÃ¹ng thanh Tab Bar vÃ  trÃ­ch xuáº¥t danh sÃ¡ch cÃ¡c Tab Stash hiá»‡n cÃ³.
        Tráº£ vá»� danh sÃ¡ch StashTabInfo Ä‘Ã£ Ä‘Æ°á»£c sáº¯p xáº¿p tá»« trÃ¡i qua pháº£i.
        NrT   r   >   rO   ÚEÚOÚXÚNEWrU   ÚwordsrN   rO   é   Úbounding_rectÚxÚyÚwidthÚheighté   F)r   r   r   r   r   r   r   c                ó   — | j         S )N)r   )Úts    r%   ú<lambda>z0StashUiScanner.scan_stash_tabs.<locals>.<lambda>¸   s   €  A¤J€ r$   )Úkey)rH   ra   r6   rb   rc   rP   Ústripre   Úlenr   Ú_classify_tab_namer   ÚappendÚsortÚ	enumerater   r7   rG   )r9   r;   rf   ÚtabsÚrx1Úry1Úrx2Úry2Útab_croprh   rT   ÚidxÚnoise_tokensrR   rs   ÚwÚtxtÚrectÚabs_xÚabs_yÚabs_wÚabs_hr   r   r   Útab_infoÚir|   s                               r%   Úscan_stash_tabszStashUiScanner.scan_stash_tabsƒ   s”  € ð
 �nŠn˜YÑ'Ô'ˆØˆ;�&˜.ØˆIà#%ˆØ!Ô-ÑˆˆS�#�sð1	Ø—x’x  c¨3°Ð 4Ñ5Ô5ˆHÝÔ+¨HÑ5Ô5ˆCØ—G’G˜G RÑ(Ô(ˆEàˆCàBÐBÐBˆLàð ñ �ØŸš ¨"Ñ-Ô-�Øð Øàð ñ �AØŸ%š% ¨Ñ+Ô+×1Ò1Ñ3Ô3�CØð ! #§)¢)¡+¤+°Ð"=Ð"=ÅÀSÁÄÈQÂÀØ àŸ5š5 °"Ñ5Ô5�DØ $§(¢(¨3°Ñ"2Ô"2Ñ2�EØ $§(¢(¨3°Ñ"2Ô"2Ñ2�EØ ŸHšH W¨aÑ0Ô0�EØ ŸHšH X¨qÑ1Ô1�EÝ" 5¨E°Q©JÑ#7Ñ8Ô8�HÝ" 5¨E°Q©JÑ#7Ñ8Ô8�Hà#×6Ò6°sÑ;Ô;�Hå+Ø!Ø Ø!)Ø!)Ø!)Ý&)¨%¡j¤jµ#°e±*´*½cÀ%¹j¼jÍ#ÈeÉ*Ì*Ð%UØ"'ð ñ  ô  �Hð —K’K Ñ)Ô)Ð)Ø˜1‘H�C‘Cñ3ð8 �IŠIÐ.Ð.ˆIÑ/Ô/Ð/Ý! $™œð ð ‘��1Ø�”�à!%ˆDÔØˆKøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøs   °HI ÉIÉIr   r   r   c                ó¨   — |                      ¦   «                              ¦   «         }t          j        ¦   «         D ]\  }}||v r|c S Œt          j        S )u7   PhÃ¢n loáº¡i StashTabType dá»±a trÃªn chuá»—i tÃªn Tab.)re   r   r   Úitemsr   ÚGENERAL)r9   r   Úcleanedrk   r   s        r%   r�   z!StashUiScanner._classify_tab_nameÁ   sW   € à—*’*‘,”,×$Ò$Ñ&Ô&ˆÝ-Ô3Ñ5Ô5ð 	 ð 	 ‰LˆB�Ø�Wˆ}ˆ}Ø���ð åÔ#Ð#r$   r   úOptional[StashTabInfo]c                ó8   — | j         D ]}|j        |k    r|c S ŒdS )u:   TÃ¬m tab phÃ¹ há»£p nháº¥t theo phÃ¢n loáº¡i StashTabType.N)r7   r   )r9   r   Útabs      r%   Úfind_tab_by_typezStashUiScanner.find_tab_by_typeÉ   s4   € àÔ%ð 	ð 	ˆCØŒ|˜xÒ'Ð'Ø�
�
�
ð (àˆtr$   c                ó€   — |                      ¦   «         }| j        D ]!}||j                              ¦   «         v r|c S Œ"dS )uH   TÃ¬m tab theo chuá»—i kÃ½ tá»± tÃªn (khÃ´ng phÃ¢n biá»‡t hoa thÆ°á»�ng).N)Úlowerr7   r   )r9   r   r    r�   s       r%   Úfind_tab_by_namezStashUiScanner.find_tab_by_nameÐ   sK   € à—
’
‘”ˆØÔ%ð 	ð 	ˆCØ˜œŸšÑ(Ô(Ð(Ð(Ø�
�
�
ð )àˆtr$   ç      Ð?Ú
tab_targetú+Union[int, str, StashTabType, StashTabInfo]Údelay_afterÚfloatc                ó8  — d}t          |t          ¦  «        r|}�n	t          |t          ¦  «        rŸd|cxk    rt          | j        ¦  «        k     rn n| j        |         }nÄt          d|dz  z   | j        z  ¦  «        }t          d| j        z  ¦  «        }| j        r|                      ||¦  «         nt          ||dd|¬¦  «         || _	        d	S t          |t          ¦  «        r|                      |¦  «        }n*t          |t          ¦  «        r|                      |¦  «        }|rs| j        r!|                      |j        |j        ¦  «         nt          |j        |j        dd|¬¦  «         |j        | _	        | j        D ]}|j        |j        k    |_        Œd	S d
S )u`  
        Thá»±c hiá»‡n click chuyá»ƒn sang Tab chá»‰ Ä‘á»‹nh báº±ng Click chuá»™t trÃ¡i cÃ³ chá»§ Ä‘Ã­ch.
        
        Args:
            tab_target: CÃ³ thá»ƒ lÃ  index (0, 1..), chuá»—i tÃªn ("Currency"), StashTabType, hoáº·c StashTabInfo.
            delay_after: Thá»�i gian chá»� giao diá»‡n chuyá»ƒn Ä‘á»•i xong (máº·c Ä‘á»‹nh 250ms).
        Nr   é´   éF   éŒ   Úleftg{®Gáz¤?)ÚbuttonÚhold_msr¥   TF)rA   r   r   r€   r7   r4   r5   r,   r   r8   r   rž   r   r¡   r   r   r   r   )r9   r£   r¥   Útarget_infoÚ
fallback_xÚ
fallback_yr|   s          r%   Úswitch_to_tabzStashUiScanner.switch_to_tabØ   sÃ  € ð /3ˆå�j¥,Ñ/Ô/ð 	<Ø$ˆK‰KÝ˜
¥CÑ(Ô(ð 	<Ø�JÐ8Ð8Ò8Ð8¥ TÔ%7Ñ!8Ô!8Ò8Ð8Ð8Ð8Ð8Ø"Ô0°Ô<��õ ! #¨
°R©Ñ"7¸4¼<Ñ!GÑHÔH�
Ý   t¤|Ñ!3Ñ4Ô4�
Ø”?ð hØ—O’O J°
Ñ;Ô;Ð;Ð;å˜* j¸ÈÐ[fÐgÑgÔgÐgØ(2�Ô%Ø�tÝ˜
¥LÑ1Ô1ð 	<Ø×/Ò/°
Ñ;Ô;ˆKˆKÝ˜
¥CÑ(Ô(ð 	<Ø×/Ò/°
Ñ;Ô;ˆKàð 	ØŒð xØ—’ Ô 4°kÔ6JÑKÔKÐKÐKå�kÔ*¨KÔ,@ÈÐY]ÐkvÐwÑwÔwÐwØ$/Ô$5ˆDÔ!ØÔ'ð =ð =�Ø œw¨+Ô*;Ò;�”�Ø�4àˆur$   çš™™™™™É?ÚNonec                ó(   — t          d|¬¦  «         dS )uV   Ä�Ã³ng báº£ng giao diá»‡n Stash an toÃ n báº±ng phÃ­m Spacebar chuáº©n ngÆ°á»�i chÆ¡i.rt   )Úcountr¥   N)r   )r9   r¥   s     r%   Úclose_stashzStashUiScanner.close_stash  s   € å˜Q¨KÐ8Ñ8Ô8Ð8Ð8Ð8r$   )r(   r)   N)r*   r   r+   r   r,   r-   )r;   r<   r=   r>   )r;   r<   r=   r   )r;   r<   r=   rm   )r   r   r=   r   )r   r   r=   r›   )r   r   r=   r›   )r¢   )r£   r¤   r¥   r¦   r=   r   )r²   )r¥   r¦   r=   r³   )r   r   r    r!   r:   rH   rl   r–   r�   rž   r¡   r±   r¶   r#   r$   r%   r'   r'   /   sô   € € € € € ðð ð ØØ:>ð	(ð (ð (ð (ð (ð2ð ð ð ð$ð $ð $ð $ðL<ð <ð <ð <ð|$ð $ð $ð $ðð ð ð ðð ð ð ð "ð,ð ,ð ,ð ,ð ,ð\9ð 9ð 9ð 9ð 9ð 9ð 9r$   r'   )r!   Ú
__future__r   rB   ÚtimeÚdataclassesr   r   Útypingr   r   r   r	   r
   r   ÚPILr   ÚImportErrorra   Ú(src.assistant_tool.stash.stash_constantsr   r   Úsrc.common.win32_inputr   r   Úsrc.common.vision_ocrr   r   r'   r#   r$   r%   ú<module>rÀ      s³  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ðØÐÐÐÐÐÐøØð ð ð Ø€E€E€EðøøøðØ€M€M€M€MøØð ð ð Ø€F€F€Fðøøøðð ð ð ð ð ð ð ð 9Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ð ðð ð ð ð ñ ô ñ „ððY9ð Y9ð Y9ð Y9ð Y9ñ Y9ô Y9ð Y9ð Y9ð Y9s   ª1 ±;º;¿A ÁAÁA