"""
行为树和状态机插件使用示例
演示如何在项目中使用行为树和状态机插件
"""

import sys
import os

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

def main():
    """
    主函数，演示插件的使用方法
    """
    print("行为树和状态机插件使用示例")
    print("=" * 40)
    
    # 导入插件管理器
    from plugins.plugin_manager import PluginManager
    
    # 创建一个虚拟的世界对象（模拟项目中的世界对象）
    class MockWorld:
        def __init__(self):
            # 模拟世界对象的属性和方法
            self.render = None
            self.accept = lambda event, handler: None
            self.ignore = lambda event: None
    
    # 创建世界实例
    world = MockWorld()
    
    # 创建插件管理器
    plugin_manager = PluginManager(world)
    
    # 启用插件系统
    plugin_manager.enable_plugin_system()
    
    # 加载行为树插件
    print("\n1. 加载行为树插件...")
    bt_plugin = plugin_manager.load_plugin("behavior_tree")
    if bt_plugin:
        print("✅ 行为树插件加载成功")
        # 启用行为树插件
        if plugin_manager.enable_plugin("behavior_tree"):
            print("✅ 行为树插件启用成功")
        else:
            print("❌ 行为树插件启用失败")
    else:
        print("❌ 行为树插件加载失败")
        return
    
    # 加载状态机插件
    print("\n2. 加载状态机插件...")
    sm_plugin = plugin_manager.load_plugin("state_machine")
    if sm_plugin:
        print("✅ 状态机插件加载成功")
        # 启用状态机插件
        if plugin_manager.enable_plugin("state_machine"):
            print("✅ 状态机插件启用成功")
        else:
            print("❌ 状态机插件启用失败")
    else:
        print("❌ 状态机插件加载失败")
        return
    
    # 使用行为树插件创建一个简单的AI行为
    print("\n3. 使用行为树插件创建AI行为...")
    try:
        # 导入行为树节点类
        from plugins.user.behavior_tree import (
            SelectorNode, SequenceNode, 
            ConditionNode, ActionNode, 
            RepeaterNode
        )
        
        # 创建行为树结构
        # 根节点：选择节点
        root = SelectorNode("Root")
        
        # 创建巡逻行为序列
        patrol_sequence = SequenceNode("Patrol")
        patrol_condition = ConditionNode("PatrolCondition", 
                                        lambda bb: bb.get("should_patrol", True))
        patrol_action = ActionNode("PatrolAction", 
                                  lambda bb: print("🤖 AI正在巡逻...") or True)
        
        patrol_sequence.add_child(patrol_condition)
        patrol_sequence.add_child(patrol_action)
        
        # 创建重复节点，重复巡逻3次
        patrol_repeater = RepeaterNode(patrol_sequence, count=3)
        
        # 创建休息行为序列
        rest_sequence = SequenceNode("Rest")
        rest_condition = ConditionNode("RestCondition", 
                                      lambda bb: bb.get("should_rest", False))
        rest_action = ActionNode("RestAction", 
                                lambda bb: print("😴 AI正在休息...") or True)
        
        rest_sequence.add_child(rest_condition)
        rest_sequence.add_child(rest_action)
        
        # 组装行为树
        root.add_child(patrol_repeater)
        root.add_child(rest_sequence)
        
        # 创建行为树实例
        behavior_tree = bt_plugin.create_behavior_tree("ai_behavior", root)
        
        # 创建黑板并设置初始数据
        blackboard = bt_plugin.create_blackboard("ai_blackboard")
        blackboard.set("should_patrol", True)
        blackboard.set("should_rest", False)
        
        # 关联黑板到行为树
        behavior_tree.set_blackboard(blackboard)
        
        print("✅ 行为树创建成功")
        
        # 执行行为树
        print("\n4. 执行行为树...")
        for i in range(5):
            print(f"\n--- 第 {i+1} 次执行 ---")
            result = behavior_tree.run()
            print(f"执行结果: {result.value}")
            
            # 每隔几次切换状态
            if i == 2:
                blackboard.set("should_patrol", False)
                blackboard.set("should_rest", True)
                print("🔄 切换到休息状态")
                
    except Exception as e:
        print(f"❌ 行为树使用示例失败: {e}")
        import traceback
        traceback.print_exc()
    
    # 使用状态机插件创建一个简单的状态管理
    print("\n5. 使用状态机插件创建状态管理...")
    try:
        # 导入状态机类
        from plugins.user.state_machine import State
        
        # 定义状态类
        class IdleState(State):
            def enter(self, context):
                print("🎮 进入空闲状态")
                
            def execute(self, context):
                print("⏸️  空闲中...")
                # 检查是否需要切换到移动状态
                if context.get("want_move", False):
                    return context["states"]["move"]
                return None
                
            def exit(self, context):
                print("🔚 退出空闲状态")
        
        class MoveState(State):
            def enter(self, context):
                print("🚗 进入移动状态")
                
            def execute(self, context):
                print("➡️  移动中...")
                # 检查是否需要切换到空闲状态
                if not context.get("want_move", True):
                    return context["states"]["idle"]
                return None
                
            def exit(self, context):
                print("🔚 退出移动状态")
        
        # 创建状态机
        state_machine = sm_plugin.create_state_machine("game_character")
        
        # 创建状态实例
        states = {
            "idle": IdleState("Idle"),
            "move": MoveState("Move")
        }
        
        # 创建上下文
        context = {
            "want_move": False,
            "states": states
        }
        
        # 设置状态机上下文
        state_machine.set_context(context)
        
        # 设置初始状态
        state_machine.change_state(states["idle"])
        
        print("✅ 状态机创建成功")
        
        # 更新状态机
        print("\n6. 更新状态机...")
        for i in range(4):
            print(f"\n--- 第 {i+1} 次更新 ---")
            print(f"当前状态: {state_machine.get_current_state().name}")
            state_machine.update()
            
            # 模拟状态切换
            if i == 1:
                context["want_move"] = True
                print("🔄 设置为想要移动")
            elif i == 2:
                context["want_move"] = False
                print("🔄 设置为想要空闲")
                
    except Exception as e:
        print(f"❌ 状态机使用示例失败: {e}")
        import traceback
        traceback.print_exc()
    
    # 禁用和卸载插件
    print("\n7. 清理资源...")
    plugin_manager.disable_plugin("behavior_tree")
    plugin_manager.disable_plugin("state_machine")
    plugin_manager.unload_plugin("behavior_tree")
    plugin_manager.unload_plugin("state_machine")
    
    print("\n🎉 示例运行完成！")

if __name__ == "__main__":
    main()