///|
pub fn N3State::to_str(self : N3State) -> String {
  Show::to_string(self)
}

///|
pub impl StateMachine for N3Recognizer with fn initial_state(
  _self : N3Recognizer,
) -> RdfState {
  RdfState::N3State(N3State::N3Doc)
}

///|
pub impl StateMachine for N3Recognizer with fn error_recovery_statemachine(self) -> N3Recognizer {
  self.error_recovery_state()
}

///|
pub impl StateMachine for N3Recognizer with fn current_state(self) -> RdfState {
  self.stack.last().unwrap_or(N3State::N3Doc).as_state_enum()
}

///|
pub impl StateMachine for N3Recognizer with fn step(self, event : Event) -> N3Recognizer {
  let current_state = self.current_state()
  let result = self.transition(
    current_state.as_state_enum(),
    event,
    self.context(),
  )
  match result {
    Ok((new_machine, new_state, _output)) => {
      let new_context = new_machine.context()
      let new_machine = new_machine.set_context(new_context)
      let new_machine = new_machine.set_current_state(new_state)
      new_machine
    }
    Err(_e) => abort("Error")
  }
}

///|
pub impl StateMachine for N3Recognizer with fn reset(self) -> N3Recognizer {
  self.error_recovery_state()
}

///|
pub impl StateMachine for N3Recognizer with fn transition(
  self : N3Recognizer,
  state : RdfState,
  event : Event,
  context : RdfContext,
) -> TransitionResult[N3Recognizer, RdfState, RdfOut] { // 1. 修正返回类型为 Result
  // 解包 RdfState
  let n3_state = match state {
    RdfState::N3State(s) => s
    _ =>
      return Err(
        RuleRecognizerError::SyntaxError(
          "Invalid state type for N3Recognizer",
          self.last_range,
        ),
      )
  }

  self.debug_logger.info("N3 State: \{n3_state}, Event: \{event}")

  let result = match n3_state {
    N3State::N3Doc => self.handle_n3_doc_m(event, context)
    N3State::N3DocExpectDot => self.handle_n3_doc_expect_dot_m(event, context)
    N3State::BaseExpectIri => self.handle_base_expect_iri_m(event, context)
    N3State::PrefixExpectPrefix =>
      self.handle_prefix_expect_prefix_m(event, context)
    N3State::PrefixExpectIri(name~) =>
      self.handle_prefix_expect_iri_m(name, event, context)
    N3State::Triples => self.handle_triples_m(event, context)
    N3State::TriplesMiddle => self.handle_triples_middle_m(event, context)
    N3State::TriplesEnd => self.handle_triples_end_m(event, context)
    N3State::PredicateObjectList =>
      self.handle_predicate_object_list_m(event, context)
    N3State::PredicateObjectListEnd =>
      self.handle_predicate_object_list_end_m(event, context)
    N3State::PredicateObjectListPossibleContinuation =>
      self.handle_predicate_object_list_possible_continuation_m(event, context)
    N3State::ObjectsList => self.handle_objects_list_m(event, context)
    N3State::ObjectsListEnd => self.handle_objects_list_end_m(event, context)
    N3State::Verb => self.handle_verb_m(event, context)
    N3State::AfterRegularVerb =>
      self.handle_after_regular_verb_m(event, context)
    N3State::AfterInvertedVerb =>
      self.handle_after_inverted_verb_m(event, context)
    N3State::AfterVerbIs => self.handle_after_verb_is_m(event, context)
    N3State::Path => self.handle_path_m(event, context)
    N3State::PathFollowUp => self.handle_path_follow_up_m(event, context)
    N3State::PathAfterIndicator(is_inverse~) =>
      self.handle_path_after_indicator_m(is_inverse, event, context)
    N3State::PathItem => self.handle_path_item_m(event, context)
    N3State::PropertyListMiddle =>
      self.handle_property_list_middle_m(event, context)
    N3State::PropertyListEnd => self.handle_property_list_end_m(event, context)
    N3State::IriPropertyList => self.handle_iri_property_list_m(event, context)
    N3State::CollectionBeginning =>
      self.handle_collection_beginning_m(event, context)
    N3State::CollectionPossibleEnd =>
      self.handle_collection_possible_end_m(event, context)
    N3State::LiteralPossibleSuffix(value~) =>
      self.handle_literal_possible_suffix_m(value, event, context)
    N3State::LiteralExpectDatatype(value~) =>
      self.handle_literal_expect_datatype_m(value, event, context)
    N3State::FormulaContent => self.handle_formula_content_m(event, context)
    N3State::FormulaContentExpectDot =>
      self.handle_formula_content_expect_dot_m(event, context)
  }
  match result {
    Ok((new_self, new_state, output)) =>
      Ok((new_self, new_state.as_state_enum(), output))
    Err(e) => Err(e)
  }
}

///|
pub impl StateMachine for N3Recognizer with fn is_accepting(self : N3Recognizer) -> Bool {
  self.current_state() == RdfState::N3State(N3State::N3Doc) &&
  self.stack.is_empty()
}

///|
pub impl StateMachine for N3Recognizer with fn context(_self : N3Recognizer) -> RdfContext {
  RdfContext::N3RecognizerContext({
    lexer_options: LexerOptions::{ base_iri: None },
    prefixes: Map([]),
  })
}

///|
pub impl StateMachine for N3Recognizer with fn set_context(
  self : N3Recognizer,
  _context : RdfContext,
) -> N3Recognizer {
  // 假设 N3Recognizer 有一个 context 字段或者通过其他方式管理
  // 这里简单返回 self,实际可能需要更新内部状态
  self
}

///|
pub impl StateMachine for N3Recognizer with fn[ST : StateWrapper] set_current_state(
  self : N3Recognizer,
  state : ST,
) -> N3Recognizer {
  let state = ST::as_state_enum(state)
  match state {
    RdfState::N3State(s) => {
      // debug("[Step 3] Set current state: \{s}")
      let new_stack = self.stack
      if !new_stack.is_empty() {
        let _ = new_stack.pop() // 移除旧状态
      }
      new_stack.push(s)
      { ..self, stack: new_stack }
    }
    _ => self
  }
}

///|
pub fn N3Recognizer::add_error(
  self : N3Recognizer,
  err : RuleRecognizerError,
) -> N3Recognizer {
  let new_errors = self.errors
  new_errors.push(err)
  { ..self, errors: new_errors }
}