§
    ÊU®jè+  ã                  óì   — d Z ddlmZ ddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZmZ ddlmZmZmZmZmZ e G d	„ d
¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )u  AutoPOE2 - Faustus Order Queue Manager & Auto-Restock Cycle (Doc 70 Má»¥c 5.5 / Chu Ká»³ 8).
======================================================================================
Bá»™ quáº£n trá»‹ hÃ ng Ä‘á»£i 10 slots sÃ n Faustus Currency Exchange (phÃ­m '/'):
1. Quáº£n lÃ½ 10 vá»‹ trÃ­ Ä‘áº·t lá»‡nh (Pending Order Slots 0..9) trÃªn sÃ n giao dá»‹ch.
2. Tá»± Ä‘á»™ng nháº­n tiá»�n tá»‡ Ä‘Ã£ khá»›p (Claim Completed Trades) giáº£i phÃ³ng slot.
3. Tá»± Ä‘á»™ng Ä‘áº·t lá»‡nh mua Waystone cáº¥p cao (Tier 15-16) báº±ng Chaos Orb khi sá»‘ lÆ°á»£ng
   kháº£ dá»¥ng trong hÃ²m Ä‘á»“ vÃ  tÃºi Ä‘á»“ <= 3 viÃªn (Báº¥t biáº¿n INV-WAYSTONE-RESTOCK-MIN).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Cold Path Tier 2 (Python 3.11).
- Rule 4: Module hÃ³a Ä‘á»™c láº­p, tráº§n file < 500 dÃ²ng.
- Rule 5: BÃ¡o cÃ¡o gáº¯n nhÃ£n [MÃ” PHá»ŽNG THUáº¬T TOÃ�N HEADLESS - KHÃ”NG PHáº¢I LIVE GAME].
- Rule 7: PhÃ­m '/' má»Ÿ sÃ n Faustus, Spacebar Ä‘Ã³ng sÃ n.
- Báº¥t biáº¿n: INV-EXCHANGE-GOLD-TAX, INV-EXCHANGE-RESERVE-SAFE, INV-WAYSTONE-RESTOCK-MIN.
é    )ÚannotationsN)Ú	dataclassÚfield)Údatetime)ÚEnum)ÚAnyÚDictÚListÚOptionalÚTuple)ÚCurrencyTierÚExchangeActionTypeÚExchangeOrderÚExchangeOrderStatusÚExchangePortfolioConfigc                  ón   — e Zd ZU dZded<   dZded<   dZded<   d	Zd
ed<   dZded<   e	dd„¦   «         Z
dS )ÚFaustusOrderSlotuV   MÃ´ táº£ má»™t slot Ä‘áº·t lá»‡nh trÃªn sÃ n Faustus (Tá»•ng cá»™ng 10 slots: 0 -> 9).ÚintÚslot_idNúOptional[ExchangeOrder]Úorderr   Úfilled_amountFÚboolÚis_ready_to_claimzOptional[str]Úsubmitted_atÚreturnc                ó   — | j         d u S ©N)r   ©Úselfs    úRC:\Projects\AutoPOE2\src\assistant_tool\currency_exchange\faustus_order_manager.pyÚis_emptyzFaustusOrderSlot.is_empty+   s   € àŒz˜TÐ!Ð!ó    )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   Úpropertyr"   © r#   r!   r   r   "   sˆ   € € € € € € à`Ð`Ø€L€L�LØ%)€EÐ)Ð)Ð)Ñ)Ø€MÐÐÐÑØ#ÐÐ#Ð#Ð#Ñ#Ø"&€LÐ&Ð&Ð&Ñ&àð"ð "ð "ñ „Xð"ð "ð "r#   r   c                  ój   — e Zd ZU dZded<   ded<   ded<   ded<   ded<    ed	„ ¬
¦  «        Zded<   dS )ÚClaimTradeResultuH   Káº¿t quáº£ nháº­n tiá»�n tá»‡ Ä‘Ã£ khá»›p tá»« má»™t slot sÃ n Faustus.r   r   ÚstrÚorder_idÚclaimed_currencyÚclaimed_amountÚfreed_slot_idc                 óL   — t          j        ¦   «                              ¦   «         S r   )r   ÚnowÚ	isoformatr*   r#   r!   ú<lambda>zClaimTradeResult.<lambda>8   s   € µ8´<±>´>×3KÒ3KÑ3MÔ3M€ r#   )Údefault_factoryÚ	timestampN)r$   r%   r&   r'   r(   r   r7   r*   r#   r!   r,   r,   0   sp   € € € € € € àRÐRØ€L€L�LØ€M€M�MØÐÐÑØÐÐÑØÐÐÑØ�UÐ+MÐ+MÐNÑNÔN€IÐNÐNÐNÑNÐNÐNr#   r,   c                  ó´   — e Zd ZU dZdZded<   dZded<   	 	 d.d/d„Zed0d„¦   «         Z	ed0d„¦   «         Z
d1d„Zd2d„Zd3d4d„Zd5d„Z	 	 d6d7d"„Z	 	 d8d9d+„Zd:d-„ZdS );ÚFaustusOrderManageruL   Bá»™ quáº£n trá»‹ hÃ ng Ä‘á»£i 10 slots vÃ  bá»• sung Waystone tá»± Ä‘á»™ng.é
   r   Ú	MAX_SLOTSé   ÚWAYSTONE_RESTOCK_MIN_THRESHOLDNç      $@Úconfigú!Optional[ExchangePortfolioConfig]Úwaystone_price_in_chaosÚfloatc                ó’   — |pt          ¦   «         | _        || _        d„ t          | j        ¦  «        D ¦   «         | _        g | _        d S )Nc                ó.   — g | ]}t          |¬ ¦  «        ‘ŒS )©r   )r   )Ú.0Úis     r!   ú
<listcomp>z0FaustusOrderManager.__init__.<locals>.<listcomp>H   s1   € ð .
ð .
ð .
Ø,-Õ QÐ'Ñ'Ô'ð.
ð .
ð .
r#   )r   r?   rA   Úranger;   ÚslotsÚclaim_history)r    r?   rA   s      r!   Ú__init__zFaustusOrderManager.__init__A   sY   € ð
 Ð9Õ 7Ñ 9Ô 9ˆŒØ'>ˆÔ$ð.
ð .
Ý16°t´~Ñ1FÔ1Fð.
ñ .
ô .
ˆŒ
ð 68ˆÔÐÐr#   r   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )u3   Sá»‘ lÆ°á»£ng slot Ä‘ang chá»©a lá»‡nh giao dá»‹ch.c              3  ó(   K  — | ]}|j         °	d V — ŒdS )é   N)r"   )rF   Úss     r!   ú	<genexpr>z;FaustusOrderManager.occupied_slots_count.<locals>.<genexpr>P   s)   è è € Ð;Ð;˜°´
Ð;�1Ð;Ð;Ð;Ð;Ð;Ð;r#   )ÚsumrJ   r   s    r!   Úoccupied_slots_countz(FaustusOrderManager.occupied_slots_countM   s#   € õ Ð;Ð;˜dœjÐ;Ñ;Ô;Ñ;Ô;Ð;r#   c                ó    — | j         | j        z
  S )u;   Sá»‘ lÆ°á»£ng slot trá»‘ng sáºµn sÃ ng nháº­n lá»‡nh má»›i.)r;   rS   r   s    r!   Úavailable_slots_countz)FaustusOrderManager.available_slots_countR   s   € ð Œ~ Ô 9Ñ9Ð9r#   úOptional[int]c                ó:   — | j         D ]}|j        r	|j        c S ŒdS )u1   TÃ¬m chá»‰ sá»‘ slot trá»‘ng Ä‘áº§u tiÃªn (0..9).N)rJ   r"   r   )r    rP   s     r!   Úget_first_empty_slotz(FaustusOrderManager.get_first_empty_slotW   s5   € à”ð 	!ð 	!ˆAØŒzð !Ø”yÐ Ð Ð ð!àˆtr#   r   r   úTuple[bool, str, Optional[int]]c                óF  — |                       ¦   «         }|€+t          j        |_        d|j        › d�|_        d|j        dfS t          j        |_        t          ||ddt          j	        ¦   «          
                    ¦   «         ¬¦  «        | j        |<   dd|j        › d	|› d�|fS )
u    
        Ná»™p má»™t lá»‡nh giao dá»‹ch má»›i vÃ o slot trá»‘ng cá»§a Faustus.
        Tá»« chá»‘i náº¿u cáº£ 10 slots Ä‘á»�u Ä‘Ã£ bá»‹ chiáº¿m dá»¥ng.
        Nz3San Faustus da day 10/10 slots. Khong the nop lenh ú.Fr   )r   r   r   r   r   TúLenh z da nop thanh cong vao slot )rX   r   Ú	CANCELLEDÚstatusr.   ÚreasonÚ	SUBMITTEDr   r   r3   r4   rJ   )r    r   Úempty_slot_ids      r!   Úsubmit_orderz FaustusOrderManager.submit_order^   s¶   € ð
 ×1Ò1Ñ3Ô3ˆØÐ Ý.Ô8ˆEŒLØbÐQVÔQ_ÐbÐbÐbˆEŒLØ˜%œ,¨Ð,Ð,å*Ô4ˆŒÝ$4Ø!ØØØ#Ý!œ™œ×1Ò1Ñ3Ô3ð%
ñ %
ô %
ˆŒ
�=Ñ!ð ÐY˜Uœ^ÐYÐYÈÐYÐYÐYÐ[hÐhÐhr#   r   r   r   c                óø   — |dk     s|| j         k    rdS | j        |         }|j        s|j        sdS |�|n|j        j        }||_        |j        |j        j        k    rt          j        |j        _        d|_	        dS )ut   
        MÃ´ phá»�ng sá»± kiá»‡n lá»‡nh Ä‘Æ°á»£c khá»›p (Fill Order) phá»¥c vá»¥ Headless Runner vÃ  Tests.
        r   FNT)
r;   rJ   r"   r   Úexpected_buy_amountr   r   Ú	COMPLETEDr^   r   )r    r   r   ÚslotÚfills        r!   Úsimulate_order_fillz'FaustusOrderManager.simulate_order_fills   sŠ   € ð �QŠ;ˆ;˜' T¤^Ò3Ð3Ø�5àŒz˜'Ô"ˆØŒ=ð 	 ¤
ð 	Ø�5à -Ð 9ˆ}ˆ}¸t¼zÔ?]ˆØ!ˆÔØÔ ¤Ô!?Ò?Ð?Ý 3Ô =ˆDŒJÔØ%)ˆDÔ"Øˆtr#   úList[ClaimTradeResult]c                óX  — g }| j         D ]Ÿ}|j        s–|j        r�|j        rˆt	          |j        |j        j        |j        j        |j        |j        ¬¦  «        }| 	                    |¦  «         | j
         	                    |¦  «         t          |j        ¬¦  «        | j         |j        <   Œ |S )u—   
        QuÃ©t toÃ n bá»™ cÃ¡c slots Ä‘Ã£ khá»›p (COMPLETED / READY_TO_CLAIM),
        tá»± Ä‘á»™ng nháº­n tiá»�n tá»‡ vÃ  giáº£i phÃ³ng slot.
        )r   r.   r/   r0   r1   rE   )rJ   r"   r   r   r,   r   r.   Úbuy_currencyr   ÚappendrK   r   )r    Úclaimed_resultsrf   Úclaimeds       r!   Úclaim_all_completed_tradesz.FaustusOrderManager.claim_all_completed_trades…   s¿   € ð
 35ˆØ”Jð 	Rð 	RˆDØ”=ð R TÔ%;ð RÀÄ
ð RÝ*Ø œLØ!œZÔ0Ø%)¤ZÔ%<Ø#'Ô#5Ø"&¤,ðñ ô �ð  ×&Ò& wÑ/Ô/Ð/ØÔ"×)Ò)¨'Ñ2Ô2Ð2å+;ÀDÄLÐ+QÑ+QÔ+Q�”
˜4œ<Ñ(øàÐr#   ç     €f@Úmax_ttl_secr3   úOptional[datetime]úList[Tuple[int, str, str]]c                ó  — g }|pt          j        ¦   «         }| j        D ]â}|j        sÙ|j        rÒ|j        sË|j        rÄ	 t          j        |j        ¦  «        }||z
                       ¦   «         }n# t          $ r d}Y nw xY w||k    rz|j        j
        }t          j        |j        _        d|› d|d›d|› d�}	|	|j        _        |                     |j        ||	f¦  «         t#          |j        ¬¦  «        | j        |j        <   Œã|S )u   
        QuÃ©t vÃ  tá»± Ä‘á»™ng há»§y cÃ¡c lá»‡nh treo quÃ¡ thá»�i gian cho phÃ©p (Time-To-Live TTL = 180s ~ 1 Map).
        Thu há»“i vá»‘n vÃ  giáº£i phÃ³ng slot trÃªn sÃ n Faustus Ä‘á»ƒ trÃ¡nh káº¹t tÃ i sáº£n.
        Tráº£ vá»� danh sÃ¡ch: [(slot_id, order_id, reason), ...]
        g        r\   z het han TTL (z.1fzs >= zs). Tu dong huy de thu hoi von.rE   )r   r3   rJ   r"   r   r   r   ÚfromisoformatÚtotal_secondsÚ	Exceptionr.   r   r]   r^   r_   rl   r   r   )
r    rq   r3   Úcancelled_listÚcurrent_timerf   Úsub_dtÚelapsedÚoidr_   s
             r!   Úcancel_expired_ordersz)FaustusOrderManager.cancel_expired_orders›   s<  € ð 68ˆØÐ,�hœl™nœnˆØ”Jð 	Zð 	ZˆDØ”=ð Z T¤Zð Z¸Ô8Nð ZØÔ$ð Zð&Ý!)Ô!7¸Ô8IÑ!JÔ!J˜Ø#/°&Ñ#8×"GÒ"GÑ"IÔ"I˜˜øÝ$ð &ð &ð &Ø"%˜˜˜ð&øøøð  +Ò-Ð-Ø"œjÔ1˜Ý,?Ô,I˜œ
Ô)Ø!z¨Ð!zÐ!z¸GÐ!zÐ!zÐ!zÈkÐ!zÐ!zÐ!z˜Ø,2˜œ
Ô)Ø&×-Ò-¨t¬|¸SÀ&Ð.IÑJÔJÐJå3CÈDÌLÐ3YÑ3YÔ3Y˜œ
 4¤<Ñ0øàÐs   ¾0A/Á/A>Á=A>é   é   Útotal_waystones_ownedÚavailable_chaosÚcurrent_goldÚtarget_tierÚ	buy_countr   c                ó˜  — || j         k    rdS | j        dk    rdS t          || j        z  ¦  «        }|| j        j        z
  }||k     rdS |dz  }||z
  | j        j        k     rdS d|› d�}	t          dt          j	        ¦   «         j
        dd…         › �t          j        d||	|d	| j        z  |t          j        d
|› d| j         › �¬¦
  «
        }
|
S )u¢  
        Kiá»ƒm tra báº¥t biáº¿n INV-WAYSTONE-RESTOCK-MIN:
        Khi tá»•ng Waystone sá»Ÿ há»¯u <= 3 viÃªn:
        - Tá»± Ä‘á»™ng sinh lá»‡nh mua Waystone cáº¥p cao (Tier 15-16) báº±ng Chaos Orb.
        - Báº£o Ä‘áº£m quá»¹ VÃ ng duy trÃ¬ >= 5,000 Gold (INV-EXCHANGE-GOLD-TAX).
        - Báº£o Ä‘áº£m Chaos Orb cÃ²n láº¡i >= min_chaos_reserve (50 Chaos).
        - Kiá»ƒm tra cÃ²n slot trá»‘ng trÃªn sÃ n.
        Nr   é2   zWaystone (Tier ú)Úorder_restock_ws_é   z	Chaos Orbg      ð?z0INV-WAYSTONE-RESTOCK-MIN: So luong Waystone con z <= )
r.   Úaction_typeÚsell_currencyÚsell_amountrk   rd   Úmarket_rateÚestimated_gold_taxr^   r_   )r=   rU   r   rA   r?   Úmin_chaos_reserveÚmin_gold_reserver   ÚuuidÚuuid4Úhexr   ÚSELL_TO_CHAOSr   ÚPENDING)r    r€   r�   r‚   rƒ   r„   Útotal_cost_chaosÚsurplus_chaosÚestimated_taxÚwaystone_namer   s              r!   Ú#check_and_generate_waystone_restockz7FaustusOrderManager.check_and_generate_waystone_restock»   s  € ð  ! 4Ô#FÒFÐFØ�4àÔ%¨Ò*Ð*Ø�4å˜y¨4Ô+GÑGÑHÔHÐØ'¨$¬+Ô*GÑGˆØÐ+Ò+Ð+Ø�4à! B™ˆØ˜=Ñ(¨D¬KÔ,HÒHÐHØ�4à8¨+Ð8Ð8Ð8ˆÝØ?­¬©¬Ô)9¸"¸1¸"Ô)=Ð?Ð?Ý*Ô8Ø%Ø(Ø&Ø )Ø˜dÔ:Ñ:Ø,Ý&Ô.ð GÐF[ð  Gð  GÐaeô  bEð  Gð  Gð
ñ 
ô 
ˆð ˆr#   r-   c                ó4  — ddddd| j         › �d| j        › d| j         › �d| j        › d| j         › �dd	g	}| j        D ]´}|j        r |                     d
|j        d›d�¦  «         Œ)|j        }|j        rdn|r|j	        j
        nd}|rd|j        › d|j        › �nd}|rd|j        › d|j        › �nd}|                     d
|j        d›d|d›d|d›d|d›d|j        › d|r|j        nd› d�¦  «         Œµ|                     d¦  «         d                     |¦  «        S )uS   Ä�á»‹nh dáº¡ng báº£ng theo dÃµi 10 slots cá»§a Faustus chuáº©n Rule 5 (ASCII-safe).zN==============================================================================z6 [MO PHONG THUAT TOAN HEADLESS - KHONG PHAI LIVE GAME]zK BANG QUAN TRI 10 SLOTS SAN FAUSTUS CURRENCY EXCHANGE (FAUSTUS ORDER BOARD)z Tong So Slots             : z Slots Dang Dung (Occupied): z / z Slots Con Trong (Available): zN------------------------------------------------------------------------------z TRANG THAI CHI TIET TUNG SLOT:z   Slot z>2z: [TRONG / SAN SANG NHAN LENH]zREADY TO CLAIMÚUNKNOWNzBan ú Ú zMua z: [z<14z] z<25z -> z
 (Filled: ú/r   r‡   ú
)r;   rS   rU   rJ   r"   rl   r   r   r   r^   ÚvaluerŒ   r‹   rd   rk   r   Újoin)r    ÚlinesrP   Úord_infoÚ
status_strÚ	sell_infoÚbuy_infos          r!   Úformat_ascii_order_boardz,FaustusOrderManager.format_ascii_order_boardé   sØ  € ð ØDØYØØ<¨D¬NÐ<Ð<ØZ¨DÔ,EÐZÐZÈ$Ì.ÐZÐZØ\¨TÔ-GÐ\Ð\ÈDÌNÐ\Ð\ØØ-ð

ˆð ”ð 	ð 	ˆAØŒzð 
Ø—’ÐT¨¬	ÐTÐTÐTÐTÑUÔUÐUÐUàœ7�Ø12Ô1DÐ|Ð-Ð-ÐdlÐK{È8Ì?ÔK`ÐK`Ðr{�
ØV^ÐfÐR 8Ô#7ÐRÐR¸(Ô:PÐRÐRÐRÐdf�	Ø\dÐlÐX (Ô">ÐXÐXÀÔAVÐXÐXÐXÐjl�Ø—’ðe˜qœyÐdð eð e°
Ðdð eð eÀ)Ðdð eð eÐU]Ðdð eð eØ !¤ðeð eØRZÐ2a°(Ô2NÐ2NÐ`aðeð eð eñô ð ð ð
 	�Š�XÑÔÐØ�yŠy˜ÑÔÐr#   )Nr>   )r?   r@   rA   rB   )r   r   )r   rV   )r   r   r   rY   r   )r   r   r   rV   r   r   )r   ri   )rp   N)rq   rB   r3   rr   r   rs   )r~   r   )r€   r   r�   r   r‚   r   rƒ   r   r„   r   r   r   )r   r-   )r$   r%   r&   r'   r;   r(   r=   rL   r)   rS   rU   rX   rb   rh   ro   r}   rš   r¨   r*   r#   r!   r9   r9   ;   sQ  € € € € € € ØVÐVà€IÐÐÐÑØ*+Ð"Ð+Ð+Ð+Ñ+ð 59Ø)-ð
8ð 
8ð 
8ð 
8ð 
8ð ð<ð <ð <ñ „Xð<ð ð:ð :ð :ñ „Xð:ðð ð ð ðið ið ið ið*ð ð ð ð ð$ð ð ð ð0 #Ø"&ðð ð ð ð ðJ Øð,ð ,ð ,ð ,ð ,ð\ ð  ð  ð  ð  ð  r#   r9   )r'   Ú
__future__r   r‘   Údataclassesr   r   r   Úenumr   Útypingr   r	   r
   r   r   Ú+src.assistant_tool.currency_exchange.modelsr   r   r   r   r   r   r,   r9   r*   r#   r!   ú<module>r®      s„  ððð ð  #Ð "Ð "Ð "Ð "Ð "à €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð
"ð 
"ð 
"ð 
"ð 
"ñ 
"ô 
"ñ „ð
"ð ðOð Oð Oð Oð Oñ Oô Oñ „ðOðJ ð J ð J ð J ð J ñ J ô J ð J ð J ð J r#   