"""
状态转换类
定义状态之间的转换条件和规则
"""

class Transition:
    """
    状态转换类
    """
    
    def __init__(self, to_state, condition_func=None):
        self.to_state = to_state  # 目标状态
        self.condition_func = condition_func  # 转换条件函数
        
    def is_triggered(self, context):
        """
        检查转换条件是否满足
        :param context: 状态上下文
        :return: 是否满足转换条件
        """
        if self.condition_func:
            try:
                return self.condition_func(context)
            except Exception as e:
                print(f"转换条件检查出错: {e}")
                return False
        else:
            # 如果没有提供条件函数，默认满足转换条件
            return True

class StateWithTransitions:
    """
    带有转换条件的状态类
    扩展基础状态类，添加状态转换功能
    """
    
    def __init__(self, name="StateWithTransitions"):
        self.name = name
        self.transitions = []  # 状态转换列表
        
    def add_transition(self, transition):
        """添加状态转换"""
        self.transitions.append(transition)
        
    def remove_transition(self, transition):
        """移除状态转换"""
        if transition in self.transitions:
            self.transitions.remove(transition)
            
    def get_transitions(self):
        """获取状态转换列表"""
        return self.transitions
        
    def check_transitions(self, context):
        """
        检查所有转换条件，返回满足条件的目标状态
        :param context: 状态上下文
        :return: 目标状态，如果没有满足条件的转换则返回None
        """
        for transition in self.transitions:
            if transition.is_triggered(context):
                return transition.to_state
        return None
        
    def enter(self, context):
        """
        进入状态时调用
        :param context: 状态上下文
        """
        pass
        
    def execute(self, context):
        """
        执行状态逻辑
        :param context: 状态上下文
        :return: 下一个状态，如果为None则保持当前状态
        """
        # 检查状态转换
        next_state = self.check_transitions(context)
        return next_state
        
    def exit(self, context):
        """
        退出状态时调用
        :param context: 状态上下文
        """
        pass