///|
/// CLI application entry point for MoonBit Fiducial Marker vision toolkit.
fn main {
  println("================================================================")
  println(" MoonBit Fiducial Marker Vision Toolkit (CLI & Benchmark Engine)")
  println("================================================================")
  println("1. Initializing standard dictionaries...")
  let dict_aruco = @marker.dictionary_aruco_4x4_50()
  let dict_april = @marker.dictionary_apriltag_16h5()
  let dict_36h11 = @marker.dictionary_apriltag_36h11()
  let dict_25h9 = @marker.dictionary_apriltag_25h9()

  println(
    "   - Loaded ArUco 4x4_50: \{dict_aruco.codewords.length()} codewords",
  )
  println(
    "   - Loaded AprilTag 16h5: \{dict_april.codewords.length()} codewords",
  )
  println(
    "   - Loaded AprilTag 36h11: \{dict_36h11.codewords.length()} codewords",
  )
  println(
    "   - Loaded AprilTag 25h9: \{dict_25h9.codewords.length()} codewords",
  )

  println(
    "\n2. Generating synthetic marker scene (ID: 0, fronto-parallel pose)...",
  )
  let cfg = @marker.SyntheticSceneConfig::default(0, dict_aruco)
  let scene = @marker.render_synthetic_scene(cfg)
  println("   - Rendered 640x480 scene")

  println("\n3. Running end-to-end marker detection pipeline...")
  let detections = @marker.detect_markers(scene, dict_aruco)
  println("   - 3D synthetic scene detections: \{detections.length()}")
  println("   - Scene rendering and geometry smoke test completed")
  for d in detections {
    println(
      "   -> Detected ID: \{d.id}, Hamming Distance: \{d.hamming_distance}, Rotation: \{d.rotation_index}",
    )
  }

  println("\n4. Running 3D Pose Estimation & Camera Calibration smoke test...")
  let cam = @marker.CameraIntrinsics::new(500.0, 500.0, 320.0, 240.0)
  if detections.length() > 0 {
    let det = detections[0]
    match @marker.estimate_marker_pose(det.quad, cam, 0.1) {
      Some(pose) => {
        println("   - Estimated 6DOF Pose:")
        println("     rvec: (\{pose.rvec.x}, \{pose.rvec.y}, \{pose.rvec.z})")
        println("     tvec: (\{pose.tvec.x}, \{pose.tvec.y}, \{pose.tvec.z})")
      }
      None => println("   - Pose estimation failed")
    }
  }

  println("\n5. Testing Multi-Target Kalman Tracking & State Estimation...")
  let tracker = @marker.MultiMarkerTracker::new()
  let tracks = tracker.update(detections, dt=0.033)
  println("   - Active tracking tracks: \{tracks.length()}")

  println(
    "\n6. Measuring real detector throughput on reproducible marker frames...",
  )
  let qvga = @marker.run_resolution_benchmark("QVGA", 320, 240, 3)
  let vga = @marker.run_resolution_benchmark("VGA", 640, 480, 3)
  println(@marker.format_benchmark_markdown_table([qvga, vga]))

  println("\n================================================================")
  println(
    " Status: Smoke tests and measurements completed; inspect rates above.",
  )
  println("================================================================")
}