///|
fn demo_client_hello() -> Bytes {
  Bytes::from_array([
    0x16, 0x03, 0x01, 0x00, 0x79, 0x01, 0x00, 0x00, 0x75, 0x03, 0x03, 0x00, 0x01,
    0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
    0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
    0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x00, 0x08, 0x13, 0x01, 0x13, 0x02, 0xc0, 0x2f,
    0x00, 0xff, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00,
    0x00, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x67,
    0x00, 0x10, 0x00, 0x0e, 0x00, 0x0c, 0x02, 0x68, 0x32, 0x08, 0x68, 0x74, 0x74,
    0x70, 0x2f, 0x31, 0x2e, 0x31, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d,
    0x00, 0x17, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0d, 0x00,
    0x08, 0x00, 0x06, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01,
  ])
}

///|
fn demo_server_hello() -> Bytes {
  Bytes::from_array([
    0x16, 0x03, 0x03, 0x00, 0x3b, 0x02, 0x00, 0x00, 0x37, 0x03, 0x03, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0x00, 0x13, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x02, 0x03, 0x04,
    0x00, 0x10, 0x00, 0x05, 0x00, 0x03, 0x02, 0x68, 0x32,
  ])
}

///|
fn demo_alert() -> Bytes {
  Bytes::from_array([0x15, 0x03, 0x03, 0x00, 0x02, 0x02, 0x28])
}

///|
fn main {
  println("=========================================================")
  println("        MoonTLS-Parser - Advanced Security Audit Engine")
  println("=========================================================")

  println("\n=== 1. Hex Dumps ===")
  let ch = demo_client_hello()
  println("ClientHello Hex:")
  println(@tls.hex_dump(ch[:]))

  println("\n=== 2. Parsing Records ===")
  let parsed_ch = @tls.parse_tls_record(ch).unwrap()
  println(@tls.TlsRecord::dump_tree(parsed_ch))

  let sh = demo_server_hello()
  let parsed_sh = @tls.parse_tls_record(sh).unwrap()
  println(@tls.TlsRecord::dump_tree(parsed_sh))

  let al = demo_alert()
  let parsed_al = @tls.parse_tls_record(al).unwrap()
  println(@tls.TlsRecord::dump_tree(parsed_al))

  println("\n=== 3. Cipher and Extension Formatting ===")
  println(parsed_ch.cipher_summary())
  let exts = parsed_ch.extension_summary()
  let exts_str = exts.join(", ")
  println("Client offered extensions: [\{exts_str}]")

  println(parsed_sh.cipher_summary())
  let sh_exts = parsed_sh.extension_summary()
  let sh_exts_str = sh_exts.join(", ")
  println("Server response extensions: [\{sh_exts_str}]")

  println("\n=== 4. Security Auditing ===")
  match parsed_ch {
    ClientHelloRecord(hello) => {
      let findings = @tls.audit_client_hello_security(hello)
      @tls.print_security_audit_report(findings)
    }
    _ => ()
  }

  println("\n=== 5. Sequence Flow Diagrams ===")
  let records = [parsed_ch, parsed_sh, parsed_al]
  let directions = [true, false, false]
  let text_diag = @tls.visualize_handshake(records, directions)
  println("Sequence Flow Diagram:")
  println(text_diag)

  let mermaid_diag = @tls.generate_mermaid_diagram(records, directions)
  println("Mermaid Diagram Output:")
  println(mermaid_diag)

  println("\n=== 6. Fingerprint Profiling & Database Auditing ===")
  match parsed_ch {
    ClientHelloRecord(hello) => {
      let ja4 = hello.ja4()
      println("Parsed Client JA4 Hash: \{ja4}")
      let info = @tls.lookup_fingerprint_info(ja4)
      println("Database Lookup: \{info}")
    }
    _ => ()
  }

  // Custom lookup examples
  let chrome_fp = "t13d0405_6a170f7f5ea4_c6ca7aae4a09"
  println("Audit Chrome JA4: \{@tls.lookup_fingerprint_info(chrome_fp)}")

  let curl_fp = "a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0"
  println("Audit curl JA3: \{@tls.lookup_fingerprint_info(curl_fp)}")

  let nginx_fp = "nginx_124_ja4s"
  println("Audit Nginx JA4S: \{@tls.lookup_fingerprint_info(nginx_fp)}")

  println("\n=== 7. Performance Diagnostics ===")
  @tls.run_parser_benchmark(100)
  @tls.run_and_print_performance_audit()
  println("=========================================================")
}