///|
/// Parse N-Quads 文件示例:main 只留 argv/路径解析;计时管线在 `bench_all`(wbtest 直调同链)
async fn main {
  let argv = @env.args()
  let path = if argv.length() > 1 { argv[1] } else { "./test_1000.nq" }
  let path = if @fs.exists(path) { path } else { "./src/bench/" + path }
  bench_all(path, @fs.read_file(path).binary())
}

///|
/// 四段管线计时(wbtest 直调同链;main 只留 argv/路径解析)
async fn bench_all(path : String, content : Bytes) -> Unit {
  @async.with_task_group() <| _root => {
    let data = content.to_fixedarray()

    // 1. 仅词法(纯 MoonBit Lexermoon;C FFI 对照见 gen_nquads 的 lexer_bench_wbtest)
    let start1 = @bench.monotonic_clock_start()
    let lexer = @nquads.Lexermoon::new(data[:])
    let mut lexer_count = 0
    for ;; {
      match lexer.next() {
        Some(@nquads.NQuadsEvent::NQuadsEOF) => break
        Some(_) => lexer_count = lexer_count + 1
        None => break
      }
    }
    let elapsed1 = @bench.monotonic_clock_end(start1)

    // 2. NQuadsEngine (不含验证)
    let engine = @nquads.NQuadsEngine::from_bytes(Array::from_fixed_array(data))
    let start2 = @bench.monotonic_clock_start()
    let mut parser_count = 0
    for ;; {
      match engine.next() {
        Some(Ok(_)) => parser_count = parser_count + 1
        Some(Err(_)) => ()
        None => break
      }
    }

    let elapsed2 = @bench.monotonic_clock_end(start2)

    // 3. SliceParser::parse_all (含验证)
    let engine2 = @nquads.NQuadsEngine::from_bytes(
      Array::from_fixed_array(data),
    )
    let slice = @nquads.SliceParser::new(engine2, data)
    let start3 = @bench.monotonic_clock_start()
    let (quads, parse_errors) = slice.parse_all()
    let elapsed3 = @bench.monotonic_clock_end(start3)

    // 4. materialize
    let engine3 = @nquads.NQuadsEngine::from_bytes(
      Array::from_fixed_array(data),
    )
    let slice3 = @nquads.SliceParser::new(engine3, data)
    let (quad_spans, _) = slice3.parse_all()
    let start4 = @bench.monotonic_clock_start()
    let (quad_emits, mat_errors) = @nquads.materialize_all(quad_spans)
    let elapsed4 = @bench.monotonic_clock_end(start4)

    let total_ms = (elapsed3 + elapsed4) / 1000.0
    let quads_per_sec = if total_ms > 0.0 {
      quads.length().to_double() / (total_ms / 1000.0)
    } else {
      0.0
    }
    let ms_per_quad = if quads.length() > 0 {
      total_ms / quads.length().to_double()
    } else {
      0.0
    }

    println("=== MoonBit 解析 \{path} ===")
    println("文件: \{path}")
    println("文件大小: \{data.length()} bytes")
    println("")
    println("=== 性能数据 ===")
    println("Lexer:       \{elapsed1} µs (\{lexer_count} tokens)")
    println("Parser:     \{elapsed2} µs (\{parser_count} quads)")
    println(
      "验证:        \{elapsed3} µs (\{quads.length()} quads, \{parse_errors.length()} errors)",
    )
    println(
      "物化:        \{elapsed4} µs (\{quad_emits.length()} quads, \{mat_errors.length()} errors)",
    )
    println("")
    println("=== 总计 ===")
    println("总时间:      \{total_ms} ms")
    println("三元组数量:  \{quads.length()}")
    println("每秒解析:    \{quads_per_sec.to_string()}")
    println("每三元组:    \{ms_per_quad.to_string()} ms")
  }
}