// Copyright 2026 Leo Cheng
// SPDX-License-Identifier: Apache-2.0

///|
/// A file sink cutting itself into segments: two kilobytes each, compressed as
/// they are cut, three of them kept.
///
///     moon run --target native src/examples/05-file
fn main raise {
  let now = [1_700_000_000_000_000_000L]
  let base = match @env.get_env_var("TMPDIR") {
    Some(dir) => if dir == "" { "." } else { dir }
    None =>
      match @env.get_env_var("TEMP") {
        Some(dir) => dir
        None => "."
      }
  }
  let joiner = if base.contains("\\") { "\\" } else { "/" }
  let path = base +
    joiner +
    "moonlog-example-" +
    @env.now().to_string() +
    joiner +
    "gateway.log"
  println("writing to " + path)
  let file = @file.File::new(
    path~,
    mkdir=true,
    rotation=@file.Rotation::new(size=2_048L),
    limits=@file.Limits::new(keep=3),
    compress=true,
    clock=fn() { now[0] },
  )
  let hub = @moonlog.Hub::new(clock=fn() { now[0] })
  ignore(hub.add(file.slot()))
  let log = hub.logger("gateway")
  for i in 0..<40 {
    log.info("a request came in", fields=[
      ("n", @moonlog.Value::of_int(i)),
      ("path", @moonlog.Value::of_str("/api/items/heading")),
    ])
    now[0] = now[0] + 1_000_000_000L
  }
  file.close()
  println(
    "the file being written holds " + file.written().to_string() + " bytes",
  )
  let segments = file.segments()
  println("cut " + segments.length().to_string() + " segments, three kept:")
  for segment in segments {
    println("  " + segment)
  }
}