// examples/compress_workbench — runnable demonstration of the
// `src/infra_compress` direction as a log-shipping workflow: compress a
// repetitive log payload with DEFLATE / zlib / gzip / zstd / LZ4, compare
// ratios, verify lossless round-trips, exploit shared dictionaries for
// small payloads, and reject corrupted archives.
//
// Run with:
//   moon run examples/compress_workbench

///|
fn build_log_payload() -> Array[Int] {
  let sb = StringBuilder::new()
  for i in 0..<40 {
    sb.write_string(
      "2026-07-12T18:0\{i % 10}:00Z INFO request handled path=/api/v1/route status=200\n",
    )
  }
  @codec.utf8_bytes_of_string(sb.to_string())
}

///|
fn ratio_permille(compressed : Int, original : Int) -> Int {
  compressed * 1000 / original
}

///|
fn main {
  let data = build_log_payload()
  let n = data.length()
  println("=== 1. codec shoot-out on a \{n}-byte log payload ===")
  let df = @compress.deflate(data)
  let zl = @compress.zlib_compress(data)
  let gz = @compress.gzip_compress(data)
  let zs = @compress.zstd_compress_entropy(data, true)
  let lz = @compress.lz4_compress(data)
  println(
    "deflate: \{df.length()} bytes (\{ratio_permille(df.length(), n)}‰)",
  )
  println(
    "zlib   : \{zl.length()} bytes (\{ratio_permille(zl.length(), n)}‰)",
  )
  println(
    "gzip   : \{gz.length()} bytes (\{ratio_permille(gz.length(), n)}‰)",
  )
  println(
    "zstd   : \{zs.length()} bytes (\{ratio_permille(zs.length(), n)}‰)",
  )
  println(
    "lz4    : \{lz.length()} bytes (\{ratio_permille(lz.length(), n)}‰)",
  )
  println("")
  println("=== 2. lossless round-trips ===")
  println("inflate(deflate)  == input: \{@compress.inflate(df) == Some(data)}")
  println(
    "zlib_decompress   == input: \{@compress.zlib_decompress(zl) == Some(data)}",
  )
  println(
    "gzip_decompress   == input: \{@compress.gzip_decompress(gz) == Some(data)}",
  )
  println(
    "zstd_decompress   == input: \{@compress.zstd_decompress(zs, n) == Some(data)}",
  )
  println(
    "lz4_decompress    == input: \{@compress.lz4_decompress(lz, n) == Some(data)}",
  )
  let frame = @compress.lz4_frame_compress(data)
  println(
    "lz4 frame decode  == input: \{@compress.lz4_frame_decompress(frame, n) == Some(data)}",
  )
  println("")
  println("=== 3. dictionary compression for small payloads ===")
  let dict = @codec.utf8_bytes_of_string(
    "INFO request handled path=/api/v1/route status=200",
  )
  let small = @codec.utf8_bytes_of_string(
    "INFO request handled path=/api/v1/route status=200 rt=3ms",
  )
  let plain = @compress.zlib_compress(small)
  let with_dict = @compress.zlib_compress_with_dict(small, dict)
  println("zlib plain    : \{plain.length()} bytes")
  println("zlib with dict: \{with_dict.length()} bytes")
  println(
    "dict round-trip ok: \{@compress.zlib_decompress_with_dict(with_dict, dict) == Some(small)}",
  )
  println("")
  println("=== 4. corrupted archives are rejected, not mis-decoded ===")
  let bad = gz.copy()
  bad[bad.length() - 1] = (bad[bad.length() - 1] + 1) % 256
  let bad_verdict = match @compress.gzip_decompress(bad) {
    Some(_) => "accepted (unexpected)"
    None => "rejected"
  }
  println("gzip with flipped CRC byte -> \{bad_verdict}")
  let truncated = zl.copy()
  let _ = truncated.pop()
  let trunc_verdict = match @compress.zlib_decompress(truncated) {
    Some(_) => "accepted (unexpected)"
    None => "rejected"
  }
  println("zlib truncated by 1 byte   -> \{trunc_verdict}")
}