///|
/// Parse N-Quads file example
///
/// This example demonstrates how to parse N-Quads format RDF data from a file.
/// N-Quads is a line-based format for RDF triples/quads.
async fn main {
  demo_all()
  validate_mode_demo()
}

///|
/// 档位用法(B2):**默认 Deep / 显式 Light** 各跑一次——README「档位分档」片段的可编译出处。
/// 示例包**不可加 `@nquads` 别名**(与包自身同名),故用默认别名 `@gen_nquads`;写盘须带 `create_mode`。
async fn validate_mode_demo() -> Unit {
  @async.with_task_group() <| root => {
    let path = "./mode_demo.nq"
    root.add_defer(() => @fs.remove(path))
    let content =
      #|   .
      #|   .
    @fs.write_file(path, @utf8.encode(content), create_mode=CreateOrTruncate)
    let data = @fs.read_file(path).binary().to_fixedarray()
    let deep = @gen_nquads.SliceParser::new(
      @gen_nquads.NQuadsEngine::from_bytes(Array::from_fixed_array(data)),
      data[:],
    )
    let (q1, _) = deep.parse_all()
    let (e1, _) = @gen_nquads.materialize_all(q1)
    let light = @gen_nquads.SliceParser::new(
      @gen_nquads.NQuadsEngine::from_bytes(Array::from_fixed_array(data)),
      data[:],
      mode=@gen_nquads.ValidateMode::Light,
    )
    let (q2, _) = light.parse_all()
    let (e2, _) = @gen_nquads.materialize_all(q2)
    println(
      "档位演示:Deep quads=\{e1.length()} / Light quads=\{e2.length()}(两档等价 ⇒ 轻验不误拒)",
    )
  }
}

///|
async test "档位冒烟:Deep 与 Light 两档 quad 数等价(轻验不误拒)" {
  validate_mode_demo()
}

///|
/// 冒烟/演示本体(wbtest 直调同链;main 只留进程入口)
async fn demo_all() -> Unit {
  // Create a task group for cleanup
  @async.with_task_group() <| root => {
    let path = "./example.nq"
    root.add_defer(() => @fs.remove(path))

    // Sample N-Quads content
    let content =
      #|   .
      #|   .
      #|    .

    // Write content to file
    @fs.write_file(path, content, create_mode=CreateOrTruncate)
    println("Written N-Quads content to: \{path}")

    // Read file content as binary
    let data = @fs.read_file(path).binary()
    println("Data length: \{data.length()} bytes")

    // Create parser
    let engine = @gen_nquads.NQuadsEngine::from_bytes(data.to_array())
    let slice = @gen_nquads.SliceParser::new(engine, Bytes::to_array(data))

    // Parse all quads
    println("")
    println("=== Parsing N-Quads ===")

    let (quad_spans, parse_errors) = slice.parse_all()

    // Print parse errors
    for err in parse_errors {
      println("Parse Error: \{err}")
    }

    println("Parsed \{quad_spans.length()} quads")

    // Materialize
    println("")
    println("=== Materializing ===")

    let (quads, mat_errors) = @gen_nquads.materialize_all(quad_spans)

    println("Materialized \{quads.length()} quads")
    // Print materialize errors

    for err in mat_errors {
      println("Materialize Error: \{err}")
    }

    println("Materialized \{quads.length()} quads")

    // Serialize and print
    println("")
    println("=== Serialized Output ===")

    let output = match
      @gen_nquads.Serializer::new(format=@gen_nquads.SerializeFormat::Quad).serialize_all(
        quads,
      ) {
      Ok(value) => value
      Err(error) => {
        println("Serialize Error: \{error}")
        ""
      }
    }
    println(output)

    // Summary
    println("")
    println("=== Summary ===")
    println("Total quads: \{quads.length()}")
    println("Parse errors: \{parse_errors.length()}")
    println("Materialize errors: \{mat_errors.length()}")
  }
}