"""
Unit Tests cho Gemini 3.8 Flash SDK Pydantic Structured Outputs & Tool Calling
TASK-UPGRADE-TECH-TOOLCHAIN-20260907
"""

import os
import sys
import unittest

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

from src.assistant_tool.gemini_agent_bridge import (
    GameActionCommand,
    GeminiAgentBridge,
    ItemAppraisalResult,
    MacroDecisionResult,
    TradeWhisperAnalysis,
)


class TestGeminiStructuredAgent(unittest.TestCase):
    def test_item_appraisal_model(self):
        json_data = """{
            "item_name": "Mirror of Kalandra",
            "rarity": "Currency",
            "item_type": "Currency",
            "tier_score": 100.0,
            "estimated_chaos_value": 150000.0,
            "is_upgrade": false,
            "action": "STASH_FOR_TRADE",
            "reasoning": "Vật phẩm đắt đỏ nhất POE2, cần cất giữ tuyệt đối an toàn"
        }"""
        item = ItemAppraisalResult.model_validate_json(json_data)
        self.assertEqual(item.item_name, "Mirror of Kalandra")
        self.assertEqual(item.action, "STASH_FOR_TRADE")
        self.assertEqual(item.estimated_chaos_value, 150000.0)

    def test_macro_decision_model(self):
        json_data = """{
            "strategy": "DEFENSIVE_RETREAT",
            "priority": "SURVIVAL",
            "suggested_action": "DOUBLE_DODGE_BACKWARD",
            "reasoning": "Máu dưới 25% kèm 8 quái vật xung quanh, cần lùi lại hồi phục"
        }"""
        decision = MacroDecisionResult.model_validate_json(json_data)
        self.assertEqual(decision.strategy, "DEFENSIVE_RETREAT")
        self.assertEqual(decision.priority, "SURVIVAL")
        self.assertEqual(decision.suggested_action, "DOUBLE_DODGE_BACKWARD")

    def test_trade_whisper_analysis_model(self):
        json_data = """{
            "is_valid_trade": true,
            "buyer_name": "ExileWarrior",
            "item_requested": "Sekhema Key",
            "offered_currency": "divine",
            "offered_amount": 4.5,
            "is_fair_market_price": true,
            "auto_reply_message": "Chờ 1 lát, mình đang mở portal về hideout nhé!"
        }"""
        trade = TradeWhisperAnalysis.model_validate_json(json_data)
        self.assertTrue(trade.is_valid_trade)
        self.assertEqual(trade.buyer_name, "ExileWarrior")
        self.assertEqual(trade.offered_amount, 4.5)
        self.assertEqual(trade.offered_currency, "divine")

    def test_game_action_command_model(self):
        cmd = GameActionCommand(
            action_type="USE_FLASK",
            flask_slot=1,
            reasoning="Máu tụt dưới ngưỡng 30% cảnh báo khẩn cấp"
        )
        self.assertEqual(cmd.action_type, "USE_FLASK")
        self.assertEqual(cmd.flask_slot, 1)

    def test_bridge_fallback_when_uninitialized(self):
        bridge = GeminiAgentBridge(api_key="")
        self.assertFalse(bridge.is_ready())

        # plan_macro_strategy phải fallback về cấu trúc an toàn không gây crash
        res = bridge.plan_macro_strategy({"hp": 200, "max_hp": 1000, "area_name": "The Riverbank"})
        self.assertIn("strategy", res)
        self.assertEqual(res["strategy"], "MAINTAIN_COMBAT")
        self.assertEqual(res["priority"], "SURVIVAL")

        # analyze_trade_whisper trả về None an toàn
        trade_res = bridge.analyze_trade_whisper("WTS 5 div")
        self.assertIsNone(trade_res)


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