///|
/// N3 示例总入口:顺序跑若干 N3 特性 case(公式/规则/集合/属性列表/路径/@keywords),
/// 每个 case 走"解析 → 物化 → 序列化打印"同一条管线(API 全部来自 `gen_n3v2` 公共面)。
async fn main {
  demo_all()
}

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

    case_basic()
    case_prefix_and_base()
    case_formula_and_rule()
    case_collection_and_bnode()
    case_operators()
    case_keywords()

    println("done: all n3 samples printed")
  }
}

///|
/// 公共演示管线:写盘 → 读字节 → 解析(统计/错误)→ 物化 → 序列化打印
async fn demo(content : String) -> Unit {
  let path = "./example.n3"
  @fs.write_file(path, content, create_mode=CreateOrTruncate)
  let data = @fs.read_file(path).binary()
  let engine = @gen_n3v2.N3Engine::from_bytes(data.to_array())
  let slice = @gen_n3v2.N3SliceParser::new(engine, Bytes::to_array(data))
  let (quad_spans, parse_errors) = slice.parse_all()
  println(
    "parsed quads=\{quad_spans.length()}, errors=\{parse_errors.length()}",
  )
  for err in parse_errors {
    println("   ERR: \{err}")
  }
  // 物化:前缀账本与 base 链经窄入口取出(ctx 已收为包内可见)
  let mat = @gen_n3v2.N3Materializer::new(
    data.to_array()[:],
    slice.prefixes(),
    bases=slice.bases(),
  )
  let (emits, mat_errors) = mat.materialize_all(quad_spans)
  for err in mat_errors {
    println("   MAT-ERR: \{err}")
  }
  match @gen_n3v2.N3Serializer::new().serialize(emits) {
    Ok(text) => if text.length() > 0 { println(text) }
    Err(err) => println("   SER-ERR: \{err}")
  }
}

///|
/// case_basic:最朴素的 N3 三元组
async fn case_basic() -> Unit {
  println("-- case_basic --")
  let content =
    #|   .
  demo(content)
}

///|
/// case_prefix_and_base:`@prefix` 与 `@base` 指令(相对 IRI 按 base 解析)
async fn case_prefix_and_base() -> Unit {
  println("-- case_prefix_and_base --")
  let content =
    #|@prefix ex:  .
    #|@base  .
    #|ex:s ex:p  .
  demo(content)
}

///|
/// case_formula_and_rule:公式 `{ ... }`(不透明值)+ 规则 `=>`(N3 核心特性)
async fn case_formula_and_rule() -> Unit {
  println("-- case_formula_and_rule --")
  let content =
    #|@prefix ex:  .
    #|{ ex:a ex:b ex:c } => { ex:c ex:b ex:a } .
    #|ex:holder ex:rule { ex:a ex:b ex:c } .
  demo(content)
}

///|
/// case_collection_and_bnode:集合 `( ... )` 与属性列表 `[ ... ]`(fresh 节点)
async fn case_collection_and_bnode() -> Unit {
  println("-- case_collection_and_bnode --")
  let content =
    #|@prefix ex:  .
    #|ex:s ex:list ( 1 2 3 ) .
    #|ex:s ex:node [ ex:p ex:o ] .
  demo(content)
}

///|
/// case_operators:N3 操作符谓词——`=>`(蕴含)/ `<=`(被蕴含)/ `=`(等同)
async fn case_operators() -> Unit {
  println("-- case_operators --")
  let content =
    #|@prefix ex:  .
    #|ex:a ex:p ex:b .
    #|{ ex:a ex:p ex:b } => { ex:b ex:p ex:a } .
    #|{ ex:y ex:q ex:x } <= { ex:x ex:q ex:y } .
    #|ex:m = ex:n .
  demo(content)
}

///|
/// case_keywords:`@keywords` 声明 + `a` 缩写(`a` → rdf:type)
async fn case_keywords() -> Unit {
  println("-- case_keywords --")
  let content =
    #|@keywords a .
    #|@prefix ex:  .
    #|ex:s a ex:C .
  demo(content)
}