"""
Unit tests for Vạn Giới Kỳ Trân Các (Universal Consignment Vault) Search & Trade in FreeExile.
Verifies listing items, multi-criteria filtering (rarity, currency, max price, min level),
and executing instant buyouts across accounts.
"""

import unittest
import sys
import os

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../server")))

from trade.consignment_vault import UniversalConsignmentVault, VaultItemFilter
from world.primal_stones_crafting import GearItem, ItemRarity


class TestConsignmentVault(unittest.TestCase):
    def setUp(self):
        self.vault = UniversalConsignmentVault()
        # Setup seller and buyer accounts
        self.seller_id = "seller_trader_01"
        self.buyer_id = "buyer_warrior_02"
        self.vault.buyout_engine.register_account(self.seller_id)
        self.vault.buyout_engine.register_account(self.buyer_id)

        # List sample items in the vault
        item1 = GearItem(
            item_uuid="gear_sword_fire_01",
            item_name="Liệt Hỏa Tuyệt Ảnh Kiếm",
            item_level=75,
            rarity=ItemRarity.CUC_PHAM
        )
        self.vault.list_item_for_sale(
            seller_id=self.seller_id,
            item=item1,
            price_currency="HonNguyen",
            price_amount=25
        )

        item2 = GearItem(
            item_uuid="gear_bow_ice_02",
            item_name="Hàn Băng Thần Xạ Cung",
            item_level=85,
            rarity=ItemRarity.CUC_PHAM
        )
        self.vault.list_item_for_sale(
            seller_id=self.seller_id,
            item=item2,
            price_currency="ThienMenh",
            price_amount=3
        )

    def test_search_by_currency_and_max_price(self):
        """Filter items priced in HonNguyen with max price 30."""
        search_filter = VaultItemFilter(
            currency="HonNguyen",
            max_price=30
        )
        results = self.vault.search_listings(search_filter)
        self.assertEqual(len(results), 1)
        self.assertEqual(results[0]["item_name"], "Liệt Hỏa Tuyệt Ảnh Kiếm")
        self.assertEqual(results[0]["price_amount"], 25)

    def test_search_by_item_level(self):
        """Filter items with min item level >= 80."""
        search_filter = VaultItemFilter(
            min_item_level=80
        )
        results = self.vault.search_listings(search_filter)
        self.assertEqual(len(results), 1)
        self.assertEqual(results[0]["item_name"], "Hàn Băng Thần Xạ Cung")

    def test_execute_instant_buyout_via_vault(self):
        """Buyer with 50 HonNguyen buys item1 (cost 25) via vault -> instant buyout succeeds."""
        # Fund buyer
        buyer_stash = self.vault.buyout_engine.accounts[self.buyer_id]
        buyer_stash.currencies["HonNguyen"] = 50

        success, msg, tx_id = self.vault.buy_instant(
            buyer_id=self.buyer_id,
            item_uuid="gear_sword_fire_01"
        )
        self.assertTrue(success)
        self.assertIsNotNone(tx_id)

        # Item should no longer appear in search listings
        results = self.vault.search_listings(VaultItemFilter())
        self.assertEqual(len(results), 1) # Only item2 remains
        self.assertEqual(results[0]["item_uuid"], "gear_bow_ice_02")


if __name__ == "__main__":
    unittest.main()
