///|
/// CLI Demonstration Entrypoint for moonbit-sse
fn main {
  println("=================================================================")
  println("  moonbit-sse: Searchable Symmetric Encryption & Privacy IR     ")
  println("=================================================================")

  let master_key = @crypto.hex_to_bytes(
    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  )
  let trapdoor_gen = @trapdoor.TrapdoorGenerator::new(master_key)
  let sample_token = trapdoor_gen.generate_search_token("privacy", 1U)
  println(
    "[1] Initializing Encrypted Database Engine (Token len: " +
    sample_token.get_token().length().to_string() +
    ")...",
  )
  let db = @engine.EncryptedDatabase::new(master_key)

  println(
    "[2] Indexing Sample Documents into the dynamic SSE reference engine...",
  )
  let doc1 = @engine.Document::new(
    1,
    "MoonBit Modern Toolchain",
    "Fast compact Wasm and native compiler with rich cryptographic ecosystem",
    ["moonbit", "wasm", "compiler"],
    1700000000UL,
  )
  let doc2 = @engine.Document::new(
    2,
    "Searchable Symmetric Encryption",
    "Dynamic encrypted inverted index for query experiments",
    ["sse", "crypto", "privacy"],
    1700000100UL,
  )
  let doc3 = @engine.Document::new(
    3,
    "Oblivious RAM Path Protocol",
    "Path ORAM-shaped data structure for access-trace experiments",
    ["oram", "privacy", "security"],
    1700000200UL,
  )
  let doc4 = @engine.Document::new(
    4,
    "Private Information Retrieval",
    "Information-theoretic two-server PIR enabling query privacy without server collusion",
    ["pir", "privacy", "database"],
    1700000300UL,
  )

  db.insert_document(doc1)
  db.insert_document(doc2)
  db.insert_document(doc3)
  db.insert_document(doc4)
  println("    Successfully indexed 4 encrypted documents.")

  println("[3] Executing Encrypted Keyword Searches:")
  let res_privacy = db.search_keyword("privacy")
  println(
    "    Query keyword: 'privacy' -> Found " +
    res_privacy.doc_ids.length().to_string() +
    " matching document(s)",
  )
  for i in 0.. c
      None => "N/A"
    }
    println("      - Doc ID " + doc_id.to_string() + ": " + content)
  }

  println("[4] Multi-Keyword Conjunctive Search:")
  let conj_kws : Array[String] = ["privacy", "security"]
  let res_conj = db.search_conjunctive(conj_kws)
  println(
    "    Query: 'privacy' AND 'security' -> Matches: " +
    res_conj.doc_ids.length().to_string(),
  )
  for i in 0..