///|
fn main {
  let args = @env.args()
  if args.length() < 2 {
    println("Usage: moon run cmd/main  [--json]")
    return
  }
  let filepath = args[1]
  let json_output = args.contains("--json")
  if !json_output {
    println("Loading file: \{filepath}")
  }

  let is_glb = filepath.to_lower().has_suffix(".glb")

  // 读取文件内容
  let file_bytes = @fs.read_file_to_bytes(filepath) catch {
    err => {
      println("Failed to read file: \{err}")
      return
    }
  }

  // 解析并提取数据
  let doc = if is_glb {
    try {
      let unpacked = @gltf.unpack_glb(file_bytes)
      println("GLB Container unpacked successfully.")
      @gltf.parse_gltf_string(unpacked.json_str)
    } catch {
      err => {
        println("Error unpacking/parsing GLB: \{err}")
        return
      }
    }
  } else {
    try {
      let content = @gltf.bytes_to_utf8_string(file_bytes)
      @gltf.parse_gltf_string(content)
    } catch {
      err => {
        println("Error parsing glTF JSON: \{err}")
        return
      }
    }
  }

  if json_output {
    let report = @gltf.build_default_asset_report(doc)
    println(@gltf.report_to_json(report))
    return
  }

  // 1. 验证报告
  println("\n--- 1. Validation Report ---")
  let val_report = @gltf.validate_document(doc)
  if val_report.is_valid {
    println("[SUCCESS] The model structure is valid.")
  } else {
    println("[WARNING/ERROR] Model structure contains validation errors:")
    for err in val_report.errors {
      println("  - [Error] \{err.path}: \{err.message}")
    }
  }

  // 2. 节点树分析
  println("\n--- 2. Node Tree analysis ---")
  let tree_info = @gltf.traverse_node_tree(doc)
  println("Total nodes: \{tree_info.total_nodes}")
  println("Max depth: \{tree_info.max_depth}")
  println("Mesh nodes: \{tree_info.mesh_node_count}")
  println("Skinned nodes: \{tree_info.skinned_node_count}")
  println("Root nodes index: \{Repr(tree_info.root_nodes).to_string()}")

  // 3. 元数据提取 (Mesh & Animation)
  println("\n--- 3. Mesh & Animation Metadata ---")
  let meshes_meta = @gltf.extract_mesh_metadata(doc)
  println("Meshes (count: \{meshes_meta.length()}):")
  for i, meta in meshes_meta {
    let name = match meta.name {
      Some(n) => n
      None => ""
    }
    println(
      "  - Mesh \{i} [\{name}]: Vertex count: \{meta.vertex_count}, Primitives: \{meta.primitive_count}, Indexed: \{meta.has_indices}, Attributes: \{Repr(meta.attributes).to_string()}",
    )
  }
  let anims_meta = @gltf.extract_animation_metadata(doc)
  println("Animations (count: \{anims_meta.length()}):")
  for i, meta in anims_meta {
    let name = match meta.name {
      Some(n) => n
      None => ""
    }
    println(
      "  - Anim \{i} [\{name}]: Channels: \{meta.channel_count}, Targets: \{Repr(meta.target_nodes).to_string()}, Interpolation: \{Repr(meta.interpolations).to_string()}",
    )
  }

  // 4. 资源依赖
  println("\n--- 4. Resource Dependencies ---")
  let deps = @gltf.collect_resource_deps(doc)
  println("Total buffer bytes: \{deps.total_buffer_bytes}")
  println("Embedded buffers: \{deps.embedded_buffer_count}")
  println("Embedded images: \{deps.embedded_image_count}")
  println("External URI references (count: \{deps.external_uris.length()}):")
  for uri in deps.external_uris {
    println("  - \{uri}")
  }

  // 5. 优化分析
  println("\n--- 5. Optimization Report & Suggestions ---")
  let opt_report = @gltf.analyze_optimization(doc)
  println("Total Vertices: \{opt_report.total_vertices}")
  println("Draw Calls (Primitives): \{opt_report.draw_calls}")
  if opt_report.suggestions.length() == 0 {
    println("No optimization suggestion. Model is clean and efficient!")
  } else {
    println("Suggestions:")
    for suggestion in opt_report.suggestions {
      println("  - [Suggestion] \{suggestion}")
    }
  }

  println("\n--- 6. Quality Gate ---")
  let asset_report = @gltf.build_default_asset_report(doc)
  let gate = @gltf.quality_gate_default(asset_report)
  println("Quality score: \{gate.score}/100")
  if gate.passed {
    println("[PASS] Asset meets the default quality policy.")
  } else {
    for line in @gltf.quality_violation_lines(gate) {
      println("  - [Quality] \{line}")
    }
  }
}