///|
/// Demo: Snowflake ID generator.
/// Run with `moon run cmd/main` from the project root.
fn main {
  let node = match @snowflake.Node::new_default(1L) {
    Some(n) => n
    None => abort("failed to create node")
  }

  println("=== Snowflake ID Generator Demo ===")
  println("Node ID      : 1")
  println("Epoch        : \{@snowflake.default_epoch} (2024-09-01)")
  println("Node bits    : \{@snowflake.node_bits}")
  println("Step bits    : \{@snowflake.step_bits}")
  println("")

  println("── Generated IDs ──")
  for i = 0; i < 5; i = i + 1 {
    let id = node.generate()
    println("[\{i}] \{id}")
    println(
      "    time = \{id.time()}  node = \{id.node_id()}  step = \{id.step()}",
    )
    println("    base2 = \{id.to_base2()}")
    println("    base36= \{id.to_base36()}")
    println("    base58= \{id.to_base58()}")
    println("    base64= \{id.to_base64()}")
    println("")
  }

  println("── Encoding Round-Trips ──")
  let id = node.generate()
  println("Original       : \{id}")

  match @snowflake.Snowflake::from_string(id.to_string()) {
    Some(v) => println("string -> parse : \{v}")
    None => println("string -> parse : FAILED")
  }

  match @snowflake.Snowflake::from_base32(id.to_base32()) {
    Some(v) => println("base32 -> parse : \{v}  (was \{id.to_base32()})")
    None => println("base32 -> parse : FAILED")
  }

  match @snowflake.Snowflake::from_base58(id.to_base58()) {
    Some(v) => println("base58 -> parse : \{v}  (was \{id.to_base58()})")
    None => println("base58 -> parse : FAILED")
  }

  match @snowflake.Snowflake::from_int_bytes(id.to_int_bytes()) {
    Some(v) => println("int-bytes -> parse : \{v}")
    None => println("int-bytes -> parse : FAILED")
  }

  let nid = node.extract_node_id(id)
  let step = node.extract_step(id)
  let tm = node.extract_time(id)
  println("Node.extract: node=\{nid} step=\{step} time=\{tm}")
}