///|
/// 性能基准:输出各尺寸 × 各水印操作的耗时(µs,中位数)。
///
/// 用法:
///   moon run cmd/bench --             # 全部尺寸(默认 320×240 … 1920×1080)
///   moon run cmd/bench -- 640 360     # 指定尺寸
///
/// 输出为 JSON 行(每项一行),字段来自 core `@bench.Summary`:
/// mean / median / min / max / std_dev / runs / batch_size(单位 µs)。
/// README「性能基准」章节的数据即由此命令复现。
fn main {
  let args = @env.args()
  let sizes = if args.length() >= 3 {
    let w = parse_int_or(args[1], 640)
    let h = parse_int_or(args[2], 360)
    [(w, h)]
  } else {
    [(320, 240), (640, 360), (1280, 720), (1920, 1080)]
  }
  for (w, h) in sizes {
    println("bench \{w}x\{h}")
    let img = make_texture(w, h)
    let tcfg = @lib.TextConfig::with_font(
      "LIVE 42",
      8,
      h - 8 - 2 * 16,
      2,
      0.6,
      0xFF00_00FF,
      "cjk16",
    )
    let dcfg = @lib.DotConfig::default()
    let payload = @utf8.encode("UID-000042".to_string_view())
    let opts : @lib.EmbedOptions = {
      text_cfg: Some(tcfg),
      dot_cfg: Some(dcfg),
      lsb_payload: Some(payload),
      lsb_key: Some(42L),
      dct_payload: None,
      dct_delta: 24,
    }
    bench("embed_text(cjk16)", () => {
      let _ = img.embed_text(tcfg)
    })
    bench("embed_dots", () => {
      let _ = img.embed_dots(dcfg)
    })
    bench("embed_invisible(lsb)", () => {
      let _ = img.embed_invisible(payload, key=42L)
    })
    bench("embed_dct(delta=24)", () => {
      let _ = img.embed_dct(payload, delta=24)
    })
    bench("embed_all(text+dots+lsb)", () => {
      let _ = img.embed_all(opts)
    })
    bench("encode_png", () => {
      let _ = img.encode_png()
    })
  }
}

///|
/// 生成渐变纹理测试图(模拟直播画面背景,避免纯色掩盖 DCT 耗时特征)。
fn make_texture(w : Int32, h : Int32) -> @lib.RgbaImage {
  let img = @lib.RgbaImage::new(w, h, 0xFF00_0000)
  for y in 0.. Unit) -> Unit {
  let s = @corebench.single_bench(name~, f, count=10)
  println(@json.to_json(s).stringify(escape_slash=true))
}

///|
fn parse_int_or(s : String, d : Int32) -> Int32 {
  @string.parse_int(s.to_string_view()) catch {
    _ => d
  }
}