// ===== 泛型状态机引擎 =====

///|
pub(all) struct GenericStateMachine[M] {
  machine : M
  context : Ctx
  outputs : Array[O]
}
// fn[M: RuleRecognizer] GenericStateMachine::error_recovery_state(self: M) ->M  {
//   M::error_recovery_state(self)
// }

///|
pub fn[M] GenericStateMachine::GenericStateMachine(
  machine : M,
  context : Ctx,
) -> GenericStateMachine[M] {
  GenericStateMachine::{ machine, context, outputs: [] }
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn initial_state(
  self : GenericStateMachine[M],
) -> RdfState {
  self.machine.initial_state()
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn error_recovery_statemachine(
  self : GenericStateMachine[M],
) -> GenericStateMachine[M] {
  self.error_recovery_statemachine()
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn current_state(
  self,
) -> RdfState {
  // 从栈中获取当前状态
  self.machine.current_state() // ← 委托给 machine
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn step(
  self,
  event : Event,
) -> GenericStateMachine[M] {
  // debug("step: state_before = [\{self.current_state()}]")
  // debug("step: event = \{event}")

  let current_state = self.machine.current_state() // ← 从 machine 获取

  let result = self.machine.transition(current_state, event, self.context)

  match result {
    Ok((new_machine, new_state, output)) => {
      // debug(
      //   "step: new_state = \{new_state.to_string()} output received = \{@debug.to_string(output)}",
      // )

      let outputs = self.outputs
      if output is Some(o) {
        // debug("step: pushing output to engine: \{o}") // ✅ 确认是否执行了 push
        outputs.push(o)
      }

      let updated_machine = new_machine.set_current_state(new_state)
      let new_engine = GenericStateMachine::{
        machine: updated_machine,
        context: self.context,
        outputs,
      }
      new_engine
    }
    Err(e) => {
      debug("step: transition failed with error: \{e}") // ✅ 记录错误
      self.reset()
    }
  }
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn reset(
  self,
) -> GenericStateMachine[M] {
  let new_machine = self.machine.error_recovery_statemachine()
  // let new_state = new_machine.initial_state()
  GenericStateMachine::{
    machine: new_machine,
    context: self.context,
    outputs: [],
  }
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn transition(
  self : GenericStateMachine[M],
  state : RdfState,
  event : Event,
  context : Ctx,
) -> TransitionResult[GenericStateMachine[M], RdfState, O] {
  // ✅ 1. 调用 machine.transition,返回 Result
  match self.machine.transition(state, event, context) {
    // ✅ 2. 成功:解构元组
    Ok((new_machine, new_state, output)) => {
      // 3. 构造新的 GenericStateMachine
      let new_gsm = GenericStateMachine::{
        machine: new_machine,
        context: self.context,
        outputs: self.outputs,
      }
      // 4. 返回 Ok
      Ok((new_gsm, new_state, output))
    }
    // ✅ 5. 错误:向上传播
    Err(e) => Err(e)
  }
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn is_accepting(
  self : GenericStateMachine[M],
) -> Bool {
  self.machine.is_accepting()
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn[
  ST : StateWrapper,
] set_current_state(self : GenericStateMachine[M], state : ST) -> GenericStateMachine[
  M,
] {
  let new_machine = self.machine.set_current_state(state)
  {
    machine: new_machine,
    context: self.context,
    outputs: self.outputs,
  }
}

///|
pub fn[M : StateMachine] GenericStateMachine::run(
  self : GenericStateMachine[M],
  events : Array[Event],
) -> Result[Array[O], RuleRecognizerError]? {
  let mut current_machine = self.machine
  let mut current_state = current_machine.initial_state()
  let outputs : Array[O] = []
  let current_context = self.context

  for event in events {
    // ✅ 1. 匹配 Result
    match current_machine.transition(current_state, event, current_context) {
      // ✅ 2. 成功:解构元组
      Ok((next_machine, next_state, output)) => {
        current_machine = next_machine
        current_state = next_state

        if output is Some(o) {
          outputs.push(o)
        }

        if current_machine.is_accepting() {
          break
        }
      }
      // ✅ 3. 失败:返回错误
      Err(e) => return Some(Err(e))
    }
  }

  Some(Ok(outputs))
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn context(
  self : GenericStateMachine[M],
) -> Ctx {
  self.context
}

///|
pub impl[M : StateMachine] StateMachine for GenericStateMachine[M] with fn set_context(
  self : GenericStateMachine[M],
  new_context : Ctx,
) -> GenericStateMachine[M] {
  {
    machine: self.machine,
    context: new_context,
    outputs: self.outputs,
  }
}

///|
pub fn[M] GenericStateMachine::remove_first_output(
  self : GenericStateMachine[M],
) -> GenericStateMachine[M] {
  let new_outputs = if self.outputs.length() > 1 {
    // 从索引 1 到末尾
    self.outputs[1:].to_owned()
  } else {
    []
  }

  GenericStateMachine::{
    machine: self.machine,
    context: self.context,
    outputs: new_outputs,
  }
}