///|
pub(all) enum RdfContext {
  TriGRecognizerContext(TriGRecognizerContext)
  NQuadsRecognizerContext(NQuadsRecognizerContext)
  N3RecognizerContext(N3RecognizerContext)
}

///|
pub(all) enum RdfOut {
  Quad(Quad)
  Triple(Triple)
  N3Quad(N3Quad)
} derive(Debug)

///|
pub impl Show for RdfOut with fn output(self, logger : &Logger) -> Unit {
  match self {
    Quad(quad) => logger.write_object(quad)
    Triple(triple) => logger.write_object(triple)
    N3Quad(n3_quad) => logger.write_object(n3_quad)
  }
}

///|
pub fn RdfOut::new(quad : Quad) -> RdfOut {
  Quad(quad)
}

///|
pub fn[TR : TokenRecognizer, RR : RuleRecognizer] SliceIterator::next(
  self : SliceIterator[TR, RR],
) -> Result[RdfOut, LexerError]? {
  while !self.parser.is_end() {
    if self.parser.parse_next() is Some(result) {
      // 修复:将 TurtleError 转换为 String
      return Some(
        result.map_err(e => {
          LexerError::SyntaxError("Syntax Error: \{e.to_string()}")
        }),
      )
    }
    // 对于 slice 迭代器,数据已经在 parser 中,不需要额外读取
    break
  }
  None
}

///|
pub(all) struct ParserM[TR, M] {
  mut lexer : Lexer[TR]
  mut engine : GenericStateMachine[M] // ← 泛型状态机引擎
  context : RdfContext
  errors : Array[RuleRecognizerError]
}

///|
pub fn[TR, M] ParserM::ParserM(
  lexer : Lexer[TR],
  engine : GenericStateMachine[M], // ← 泛型状态机引擎
  context : RdfContext,
) -> ParserM[TR, M] {
  { lexer, engine, context, errors: [] }
  // pending_token: None,
}

///|

  pub fn[TR : TokenRecognizer, M : StateMachine + RuleRecognizer] ParserM::parse_next(
    self : ParserM[TR, M],
  ) -> Result[RdfOut, TurtleError]? {
    for ;; {
      // 1. 优先处理错误
      if self.errors.pop() is Some(e) {
        return Some(
          Err(
            TurtleError::InvalidToken(
              self.lexer.last_token_start(),
              "\{self.lexer.last_token_source()}\{e.to_string()} - TOKEN is not allowed here",
            ),
          ),
        )
      }

      // 2. ✅ 从状态机获取输出
      if self.try_output() is Some(result) {
        return Some(result)
      }

      // 3. 尝试从 Lexer 获取下一个 Token
      match self.lexer.parse_next(M::lexer_options(self.context)) {
        Some(Ok(located_token)) => {
          let previous_state = self.engine.current_state()
          self.engine.debug_logger.info("ParserM: token = \{located_token}")

          // ✅ 驱动状态机
          self.engine = self.engine.step(located_token)

          // ✅ 检查是否状态变化(token 没被消费)
          if self.engine.current_state() == previous_state {
            // 状态没变 = token 没被消费,重新用同一个 token 调用
            // 防止无限循环:最多重试一次
            self.engine = self.engine.step(located_token)
          }

          // ✅ 检查是否完成
          if self.try_finish() is Some(result) {
            return Some(result)
          }

          continue
        }
        Some(Err(e)) => {
          // 词法错误
          self.engine = self.engine.reset()
          return Some(
            Err(
              TurtleError::InvalidToken(
                self.lexer.last_token_start(),
                "- \{self.lexer.last_token_source()} \{e.to_string()} - TOKEN is not allowed here.",
              ),
            ),
          )
        }
        None =>
          if self.lexer.is_end() {
            // ✅ 结束处理

            if self.engine.is_accepting() {
              // 返回剩余输出
              if self.engine.outputs.length() > 0 {
                let output = match self.engine.outputs.pop() {
                  Some(o) => o
                  None => return None
                }
                self.engine = self.engine.remove_first_output()
                return Some(Ok(output))
              }
              return None
            } else {
              // 未完成
              self.errors.push(
                RuleRecognizerError::SyntaxError(
                  "Unexpected end of input",
                  self.lexer.last_token_range().to_range(),
                ),
              )
              return Some(
                Err(
                  TurtleError::UnexpectedEndOfInput(
                    self.lexer.last_token_end(),
                    "Unexpected end of input.",
                  ),
                ),
              )
            }
          } else {
            return None
          }
      }
    }
  }


// ===== ParserM 辅助方法 =====

///|
pub fn[TR, M : StateMachine] ParserM::is_end(self : ParserM[TR, M]) -> Bool {
  self.lexer.is_end() &&
  self.engine.is_accepting() &&
  self.engine.outputs.is_empty() &&
  self.errors.is_empty()
}

///|
pub fn[TR, M] ParserM::end(self : ParserM[TR, M]) -> Bool {
  self.lexer.is_end()
}

///|
/// 尝试返回一个输出
pub fn[TR, M] ParserM::try_output(
  self : ParserM[TR, M],
) -> Result[RdfOut, TurtleError]? {
  if self.engine.outputs.length() > 0 {
    // ✅ 使用 get(0) 获取第一个元素
    let output = match self.engine.outputs.get(0) {
      Some(o) => o
      None => return None
    }
    self.engine = self.engine.remove_first_output()
    return Some(Ok(output))
  }
  None
}

///|
/// 检查并处理完成状态
pub fn[TR, M : StateMachine] ParserM::try_finish(
  self : ParserM[TR, M],
) -> Result[RdfOut, TurtleError]? {
  if self.engine.is_accepting() {
    if self.engine.outputs.length() > 0 {
      let output = match self.engine.outputs.get(0) {
        Some(o) => o
        None => return None
      }
      self.engine = self.engine.remove_first_output()
      return Some(Ok(output))
    }
    // 已接受但无输出,可能是一个空的成功状态,继续解析
    return None
  } else {
     self.engine.debug_logger.warn("ParserM: Engine is accepting but no output generated yet.")

    // 尚未接受,属于中间状态,继续获取下一个 Token
    return None
  }
}