"""
测试行为树和状态机插件功能
"""

import sys
import os

# 添加项目根目录到Python路径
sys.path.insert(0, '/home/hello/EG')

def test_behavior_tree_plugin():
    """
    测试行为树插件功能
    """
    print("开始测试行为树插件...")
    
    # 导入插件管理器
    from plugins.plugin_manager import PluginManager
    
    # 创建一个虚拟的世界对象（用于测试）
    class MockWorld:
        def __init__(self):
            self.accept = lambda event, handler: None
            self.ignore = lambda event: None
    
    # 创建世界实例
    world = MockWorld()
    
    # 创建插件管理器
    plugin_manager = PluginManager(world)
    plugin_manager.enable_plugin_system()
    
    # 加载行为树插件
    bt_plugin = plugin_manager.load_plugin("behavior_tree")
    if not bt_plugin:
        print("❌ 无法加载行为树插件")
        return False
    
    # 启用行为树插件
    if not plugin_manager.enable_plugin("behavior_tree"):
        print("❌ 无法启用行为树插件")
        return False
    
    print("✅ 行为树插件加载和启用成功")
    
    # 导入示例并运行
    try:
        from plugins.user.behavior_tree.examples.patrol_example import run_patrol_example
        run_patrol_example(bt_plugin)
        print("✅ 行为树示例运行成功")
    except Exception as e:
        print(f"❌ 行为树示例运行失败: {e}")
        import traceback
        traceback.print_exc()
        return False
    
    # 测试基本节点功能
    try:
        from plugins.user.behavior_tree import SelectorNode, SequenceNode, ActionNode, ConditionNode
        
        # 创建一个简单的序列节点
        sequence = SequenceNode("TestSequence")
        
        # 添加一个条件节点
        condition = ConditionNode("TestCondition", lambda bb: True)
        sequence.add_child(condition)
        
        # 添加一个动作节点
        action = ActionNode("TestAction", lambda bb: print("测试动作执行") or True)
        sequence.add_child(action)
        
        # 创建黑板
        blackboard = bt_plugin.create_blackboard("test_blackboard")
        
        # 创建行为树
        tree = bt_plugin.create_behavior_tree("test_tree", sequence)
        tree.set_blackboard(blackboard)
        
        # 执行行为树
        result = tree.run()
        print(f"✅ 基本节点功能测试成功，执行结果: {result.value}")
        
    except Exception as e:
        print(f"❌ 基本节点功能测试失败: {e}")
        import traceback
        traceback.print_exc()
        return False
    
    # 禁用和卸载插件
    plugin_manager.disable_plugin("behavior_tree")
    plugin_manager.unload_plugin("behavior_tree")
    
    print("✅ 行为树插件测试完成")
    return True

def test_state_machine_plugin():
    """
    测试状态机插件功能
    """
    print("开始测试状态机插件...")
    
    # 导入插件管理器
    from plugins.plugin_manager import PluginManager
    
    # 创建一个虚拟的世界对象（用于测试）
    class MockWorld:
        def __init__(self):
            self.accept = lambda event, handler: None
            self.ignore = lambda event: None
    
    # 创建世界实例
    world = MockWorld()
    
    # 创建插件管理器
    plugin_manager = PluginManager(world)
    plugin_manager.enable_plugin_system()
    
    # 加载状态机插件
    sm_plugin = plugin_manager.load_plugin("state_machine")
    if not sm_plugin:
        print("❌ 无法加载状态机插件")
        return False
    
    # 启用状态机插件
    if not plugin_manager.enable_plugin("state_machine"):
        print("❌ 无法启用状态机插件")
        return False
    
    print("✅ 状态机插件加载和启用成功")
    
    # 导入示例并运行
    try:
        from plugins.user.state_machine.examples.ai_example import run_ai_example
        run_ai_example(sm_plugin)
        print("✅ 状态机示例运行成功")
    except Exception as e:
        print(f"❌ 状态机示例运行失败: {e}")
        import traceback
        traceback.print_exc()
        return False
    
    # 测试基本状态功能
    try:
        from plugins.user.state_machine import State, StateMachine
        
        # 创建一个简单的状态
        class TestState(State):
            def enter(self, context):
                print("进入测试状态")
                
            def execute(self, context):
                print("执行测试状态")
                return None  # 保持当前状态
                
            def exit(self, context):
                print("退出测试状态")
        
        # 创建状态机
        state_machine = sm_plugin.create_state_machine("test_state_machine")
        
        # 创建上下文（简单字典作为上下文）
        context = {"data": {}}
        
        def get_data(key, default=None):
            return context["data"].get(key, default)
        
        def set_data(key, value):
            context["data"][key] = value
        
        context["get_data"] = get_data
        context["set_data"] = set_data
        
        # 设置状态机上下文
        state_machine.set_context(context)
        
        # 创建测试状态并切换
        test_state = TestState("TestState")
        state_machine.change_state(test_state)
        
        # 更新状态机
        state_machine.update()
        
        print("✅ 基本状态功能测试成功")
        
    except Exception as e:
        print(f"❌ 基本状态功能测试失败: {e}")
        import traceback
        traceback.print_exc()
        return False
    
    # 禁用和卸载插件
    plugin_manager.disable_plugin("state_machine")
    plugin_manager.unload_plugin("state_machine")
    
    print("✅ 状态机插件测试完成")
    return True

if __name__ == "__main__":
    print("开始测试行为树和状态机插件...")
    
    # 测试行为树插件
    bt_success = test_behavior_tree_plugin()
    
    print("\n" + "="*50 + "\n")
    
    # 测试状态机插件
    sm_success = test_state_machine_plugin()
    
    print("\n" + "="*50)
    print("测试总结:")
    print(f"行为树插件测试: {'✅ 通过' if bt_success else '❌ 失败'}")
    print(f"状态机插件测试: {'✅ 通过' if sm_success else '❌ 失败'}")
    
    if bt_success and sm_success:
        print("🎉 所有插件测试通过！")
    else:
        print("❌ 部分测试失败，请检查插件实现。")
