§
    Ñ!¢j=  ã                   óü   — d 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	  ee
¦  «                             ¦   «         j        j        j        Zedz  dz  dz  Zedz  dz  dz  ZeZd	efd
„Z G d„ d¦  «        Zdad	efd„ZdS )u™   
AutoPOE2 - Offline Wiki & Game Data Database Bridge (Zero-RAM Dependency)
Æ¯u tiÃªn `poe2_ggpk.db` (trÃ­ch tá»« Content.ggpk), fallback `poe2_wiki.db`.
é    N)ÚPath)ÚAnyÚDictÚListÚOptionalÚassetsÚ	game_datazpoe2_wiki.dbzpoe2_ggpk.dbÚreturnc                  ó�  — t                                ¦   «         r§	 t          j        dt                                ¦   «         › d�d¬¦  «        } 	 |                      d¦  «                             ¦   «         }|                      ¦   «          n# |                      ¦   «          w xY w|rt           S n# t          j        $ r Y nw xY wt          S )zBPrefer GGPK-extracted SQLite when projection tables already exist.zfile:z?mode=roT)ÚurizDSELECT 1 FROM sqlite_master WHERE type='table' AND name='base_items')
ÚGGPK_DB_PATHÚis_fileÚsqlite3ÚconnectÚas_posixÚexecuteÚfetchoneÚcloseÚErrorÚWIKI_DB_PATH)ÚconnÚrows     ú2C:\Projects\AutoPOE2\src\assistant_tool\wiki_db.pyÚresolve_wiki_db_pathr      sÍ   € å×ÒÑÔð ð	Ý”?Ð#L­<×+@Ò+@Ñ+BÔ+BÐ#LÐ#LÐ#LÐRVÐWÑWÔWˆDðØ—l’lØZñô ç’(‘*”*ð ð —
’
‘”��ø�—
’
‘”��øøøØð $Ý#Ð#ð$øåŒ}ð 	ð 	ð 	ØˆDð	øøøåÐs)   ›1B, Á'B	 Á4B, Â	BÂB, Â,B>Â=B>c                   óô   — e Zd Zddee         fd„Zdej        fd„Zd„ Z	de
deee
ef                  fd„Zd	e
deee
ef                  fd
„Zde
deee
ef                  fd„Zdee
         dee
ef         fd„ZdS )Ú
Poe2WikiDBNÚdb_pathc                 ó>   — |pt          ¦   «         | _        d | _        d S ©N)r   r   Ú_conn)Úselfr   s     r   Ú__init__zPoe2WikiDB.__init__$   s    € ØÐ8Õ"6Ñ"8Ô"8ˆŒØ37ˆŒ
ˆ
ˆ
ó    r
   c                 ó  — | j         €t| j                             ¦   «         st          d| j        › d�¦  «        ‚t	          j        t          | j        ¦  «        d¬¦  «        | _         t          j        | j         _        | j         S )Nu)   KhÃ´ng tÃ¬m tháº¥y file CSDL wiki táº¡i: uX   . Cháº¡y tools/extract_ggpk_to_db.py (Content.ggpk) hoáº·c tools/sync_poe2_wiki_data.py.F)Úcheck_same_thread)	r    r   ÚexistsÚFileNotFoundErrorr   r   ÚstrÚRowÚrow_factory©r!   s    r   r   zPoe2WikiDB.connect(   s„   € ØŒ:ÐØ”<×&Ò&Ñ(Ô(ð Ý'ðmÀÄð mð mð mñô ð õ !œ­¨T¬\Ñ):Ô):ÈeÐTÑTÔTˆDŒJÝ%,¤[ˆDŒJÔ"ØŒzÐr#   c                 óX   — | j         �"| j                              ¦   «          d | _         d S d S r   )r    r   r+   s    r   r   zPoe2WikiDB.close3   s1   € ØŒ:Ð!ØŒJ×ÒÑÔÐØˆDŒJˆJˆJð "Ð!r#   Ú
name_or_idc                 ó  — |                       ¦   «         }|                     ¦   «         }|                     ¦   «         }|                     ¦   «         }|                     d||f¦  «         |                     ¦   «         }|s/|                     dd|› d�f¦  «         |                     ¦   «         }|rX|d         |d         |d         |d         |d         |d         |d         z  |d	         |d
         t          |d         ¦  «        dœ	S dS )u¦   
        Tra cá»©u thÃ´ng tin BaseItemType theo tÃªn hoáº·c ID.
        Tráº£ vá»�: id, name, item_class, width, height, drop_level, stack_size, is_currency.
        z?SELECT * FROM base_items WHERE id = ? OR name_lower = ? LIMIT 1zRSELECT * FROM base_items WHERE name_lower LIKE ? ORDER BY LENGTH(name) ASC LIMIT 1ú%ÚidÚnameÚ
item_classÚwidthÚheightÚ
drop_levelÚ
stack_sizeÚis_currency)	r0   r1   r2   r3   r4   Úinventory_slotsr5   r6   r7   N)r   ÚcursorÚstripÚlowerr   r   Úbool)r!   r-   r   r9   ÚsearchÚsearch_lowerr   s          r   Úget_item_infozPoe2WikiDB.get_item_info8   s'  € ð
 �|Š|‰~Œ~ˆØ—’‘”ˆØ×!Ò!Ñ#Ô#ˆØ—|’|‘~”~ˆð 	�ŠØMØ�\Ð"ñ	
ô 	
ð 	
ð �oŠoÑÔˆð ð 	$Ø�NŠNØdØ$�\Ð$Ð$Ð$Ð&ñô ð ð —/’/Ñ#Ô#ˆCàð 	à˜$”iØ˜FœØ! ,Ô/Ø˜WœØ˜hœ-Ø#& w¤<°#°h´-Ñ#?Ø! ,Ô/Ø! ,Ô/Ý# C¨Ô$6Ñ7Ô7ð
ð 
ð 
ð ˆtr#   Úname_or_codec           	      ód  — |                       ¦   «         }|                     ¦   «         }|                     ¦   «         }|                     ¦   «         }|                     d||f¦  «         |                     ¦   «         }|s/|                     dd|› d�f¦  «         |                     ¦   «         }|r€g }	 |d         rt          j        |d         ¦  «        ng }n# t          $ r Y nw xY w|d         |d         |d         |d         t          |d	         ¦  «        t          |d
         ¦  «        |dœS dS )u©   
        Tra cá»©u thÃ´ng tin WorldArea theo tÃªn khu vá»±c hoáº·c Area Code.
        Tráº£ vá»�: id, name, act, area_level, has_waypoint, is_town, connections.
        z@SELECT * FROM world_areas WHERE id = ? OR name_lower = ? LIMIT 1zSSELECT * FROM world_areas WHERE name_lower LIKE ? ORDER BY LENGTH(name) ASC LIMIT 1r/   Úconnectionsr0   r1   ÚactÚ
area_levelÚhas_waypointÚis_town)r0   r1   rC   rD   rE   rF   rB   N)
r   r9   r:   r;   r   r   ÚjsonÚloadsÚ	Exceptionr<   )r!   r@   r   r9   r=   r>   r   rB   s           r   Úget_area_infozPoe2WikiDB.get_area_info_   s`  € ð
 �|Š|‰~Œ~ˆØ—’‘”ˆØ×#Ò#Ñ%Ô%ˆØ—|’|‘~”~ˆà�ŠØNØ�\Ð"ñ	
ô 	
ð 	
ð �oŠoÑÔˆàð 	$Ø�NŠNØeØ$�\Ð$Ð$Ð$Ð&ñô ð ð —/’/Ñ#Ô#ˆCàð 	Ø%'ˆKðØ@CÀMÔ@RÐZ�dœj¨¨]Ô);Ñ<Ô<Ð<ÐXZ��øÝð ð ð Ø�ðøøøð ˜$”iØ˜FœØ˜5”zØ! ,Ô/Ý $ S¨Ô%8Ñ 9Ô 9Ý  I¤Ñ/Ô/Ø*ðð ð ð ˆts   Â3$C Ã
C%Ã$C%Úunique_namec                 ó‚  — |                       ¦   «         }|                     ¦   «         }|                     ¦   «                              ¦   «         }|                     d|d|› d�f¦  «         |                     ¦   «         }|r>|d         r|                      |d         ¦  «        nd}|d         |d         |d         |dœS dS )u&   Tra cá»©u thÃ´ng tin trang bá»‹ UniquezGSELECT * FROM uniques WHERE name_lower = ? OR name_lower LIKE ? LIMIT 1r/   Ú	base_itemNr0   r1   )r0   r1   rM   Ú	base_info)r   r9   r:   r;   r   r   r?   )r!   rK   r   r9   r>   r   rN   s          r   Úget_unique_infozPoe2WikiDB.get_unique_infoˆ   sÖ   € à�|Š|‰~Œ~ˆØ—’‘”ˆØ"×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2ˆà�ŠØUØÐ.˜|Ð.Ð.Ð.Ð/ñ	
ô 	
ð 	
ð �oŠoÑÔˆØð 	Ø@CÀKÔ@PÐZ˜×*Ò*¨3¨{Ô+;Ñ<Ô<Ð<ÐVZˆIà˜$”iØ˜FœØ  Ô-Ø&ð	ð ð ð ˆtr#   Ú
item_namesc           	      ó  — d}g }|D ]{}|                       |¦  «        }|rB|d         |d         }}||z  }||z  }|                     |d         ||||d         dœ¦  «         Œ[|dz  }|                     |dddddœ¦  «         Œ||||d	k    d
œS )u®   
        TÃ­nh toÃ¡n tá»•ng sá»‘ Ã´ chiáº¿m dá»¥ng trong balo cho danh sÃ¡ch váº­t pháº©m.
        Há»— trá»£ giáº£i thuáº­t Inventory Tetris tá»± Ä‘á»™ng gom Ä‘á»“.
        r   r3   r4   r1   r2   )r1   r3   r4   ÚslotsÚclassé   ÚUnknowné<   )Útotal_slots_neededÚitemsÚfits_in_standard_grid)r?   Úappend)	r!   rP   Útotal_slotsÚdetailsr1   ÚinfoÚwÚhrR   s	            r   Úcalculate_inventory_footprintz(Poe2WikiDB.calculate_inventory_footprint�   sø   € ð
 ˆØˆØð 	ð 	ˆDØ×%Ò% dÑ+Ô+ˆDØð Ø˜G”} d¨8¤n�1�Ø˜A™�Ø˜uÑ$�Ø—’Ø  œLØØØ"Ø! ,Ô/ð ð  ñ ô ð ð ð ˜qÑ �Ø—’Ø ØØØØ&ð ð  ñ ô ð ð ð #.ØØ%0°BÒ%6ð
ð 
ð 	
r#   r   )Ú__name__Ú
__module__Ú__qualname__r   r   r"   r   Ú
Connectionr   r   r(   r   r   r?   rJ   rO   r   r`   © r#   r   r   r   #   s#  € € € € € ð8ð 8 ¨¤ð 8ð 8ð 8ð 8ð	˜Ô+ð 	ð 	ð 	ð 	ðð ð ð
%¨ð %°¸¸cÀ3¸h¼Ô0Hð %ð %ð %ð %ðN'¨#ð '°(¸4ÀÀSÀ¼>Ô2Jð 'ð 'ð 'ð 'ðR¨3ð °8¸DÀÀcÀ¼NÔ3Kð ð ð ð ð*"
¸¸S¼	ð "
ÀdÈ3ÐPSÈ8Änð "
ð "
ð "
ð "
ð "
ð "
r#   r   c                  ó:   — t           €t          ¦   «         a t           S r   )Ú_wiki_db_instancer   re   r#   r   Úget_wiki_dbrh   Ä   s   € åÐ Ý&™LœLÐÝÐr#   )Ú__doc__rG   r   Úpathlibr   Útypingr   r   r   r   Ú__file__ÚresolveÚparentÚBASE_DIRr   r   ÚDB_PATHr   r   rg   rh   re   r#   r   ú<module>rq      s!  ððð ð
 €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,àˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1Ô8€Ø˜(Ñ" [Ñ0°>ÑA€Ø˜(Ñ" [Ñ0°>ÑA€Ø
€ð˜dð ð ð ð ð$\
ð \
ð \
ð \
ð \
ñ \
ô \
ð \
ð~ Ð ð�Zð ð ð ð ð ð r#   