///|
/// Lightweight millow demo that depends only on the millow library itself.
/// Generates a synthetic gradient image and applies various operations,
/// printing info at each step. No external image I/O required.
/// Run with `moon run cmd/main` from the project root.
fn main {
  println("=== millow Demo (synthetic) ===")
  println(" ")

  // Create a synthetic 128x128 gradient image
  let h = 128
  let w = 128
  let img = @millow.Image::new(h, w)
  for y = 0; y < h; y = y + 1 {
    for x = 0; x < w; x = x + 1 {
      let o = (y * w + x) * 4
      img.data[o] = (x * 2 % 256).to_byte()
      img.data[o + 1] = (y * 2 % 256).to_byte()
      img.data[o + 2] = ((x + y) % 256).to_byte()
      img.data[o + 3] = 255
    }
  }
  println("Created synthetic image: \{@millow.info(img)}")
  println(" ")

  // === Color operations ===
  let gray = @millow.to_grayscale(img)
  println("1. to_grayscale: \{@millow.info(gray)}")

  let inverted = @millow.invert(img)
  println("2. invert: \{@millow.info(inverted)}")

  let tinted = @millow.tint(img, 100, 150, 200)
  println("3. tint(100,150,200): \{@millow.info(tinted)}")
  println(" ")

  // === Enhancement ===
  let bright = @millow.adjust_brightness(img, 30)
  println("4. adjust_brightness(+30): \{@millow.info(bright)}")

  let contrast = @millow.adjust_contrast(img, 1.5)
  println("5. adjust_contrast(1.5): \{@millow.info(contrast)}")

  let gamma = @millow.adjust_gamma(img, 1.5)
  println("6. adjust_gamma(1.5): \{@millow.info(gamma)}")

  let sharpened = @millow.sharpen(img, 1.0)
  println("7. sharpen(1.0): \{@millow.info(sharpened)}")
  println(" ")

  // === Filters ===
  let blurred = @millow.gaussian_blur(img, 2.0)
  println("8. gaussian_blur(σ=2.0): \{@millow.info(blurred)}")

  let median = @millow.median_filter(img, 3)
  println("9. median_filter(3): \{@millow.info(median)}")

  let bilateral = @millow.bilateral_filter(gray, 5, 10.0, 10.0)
  println("10. bilateral_filter: \{@millow.info(bilateral)}")
  println(" ")

  // === Edge detection ===
  let sobel = @millow.sobel(gray)
  println("11. sobel: \{@millow.info(sobel)}")

  let scharr = @millow.scharr(gray)
  println("12. scharr: \{@millow.info(scharr)}")

  let laplacian = @millow.laplacian(gray)
  println("13. laplacian: \{@millow.info(laplacian)}")
  println(" ")

  // === Morphology ===
  let eroded = @millow.erode(gray, @millow.Kernel::Square(3))
  println("14. erode: \{@millow.info(eroded)}")

  let dilated = @millow.dilate(gray, @millow.Kernel::Square(3))
  println("15. dilate: \{@millow.info(dilated)}")

  let morph_open = @millow.morph_open(gray, @millow.Kernel::Square(3))
  println("16. morph_open: \{@millow.info(morph_open)}")

  let morph_close = @millow.morph_close(gray, @millow.Kernel::Square(3))
  println("17. morph_close: \{@millow.info(morph_close)}")
  println(" ")

  // === Geometry ===
  let rotated = @millow.rotate_any(img, 45.0, @millow.Interp::Bilinear)
  println("18. rotate_any(45°): \{@millow.info(rotated)}")

  let flipped_h = @millow.flip_horizontal(img)
  println("19. flip_horizontal: \{@millow.info(flipped_h)}")

  let flipped_v = @millow.flip_vertical(img)
  println("20. flip_vertical: \{@millow.info(flipped_v)}")

  let resized = @millow.resize(img, 64, 64, @millow.Interp::Bilinear)
  println("21. resize(64x64): \{@millow.info(resized)}")

  let translated = @millow.translate(img, 20.0, 20.0, @millow.Interp::Bilinear)
  println("22. translate(20,20): \{@millow.info(translated)}")
  println(" ")

  // === Threshold & Histogram ===
  let (otsu_thr, otsu_binary) = @millow.threshold_otsu(gray)
  println(
    "23. threshold_otsu(thr=\{otsu_thr.to_int()}): \{@millow.info(otsu_binary)}",
  )

  let equalized = @millow.equalize_histogram(gray)
  println("24. equalize_histogram: \{@millow.info(equalized)}")

  let sauvola_binary = @millow.threshold_sauvola(gray, 15, 0.2)
  println("25. threshold_sauvola: \{@millow.info(sauvola_binary)}")
  println(" ")

  // === Feature detection ===
  let corners = @millow.corner_harris(gray, 0.04)
  let corner_count = {
    let mut n = 0
    for row in corners {
      for v in row {
        if v > 0.1 {
          n = n + 1
        }
      }
    }
    n
  }
  println("26. corner_harris: \{corner_count} corners above 0.1")

  let lbp_codes = @millow.lbp(gray, 1, 8)
  println("27. lbp(radius=1, n=8): \{lbp_codes.length()} codes")
  println(" ")

  // === Measurement ===
  let (_labels, cc_count) = @millow.connected_components(otsu_binary, 4)
  println("28. connected_components: \{cc_count} components")

  let contours = @millow.find_contours(otsu_binary)
  println("29. find_contours: \{contours.length()} contours found")

  let m = @millow.moments(gray)
  println("30. moments: m00=\{m[0]}, centroid=(\{m[1] / m[0]}, \{m[2] / m[0]})")

  let hu = @millow.hu_moments(gray)
  println("31. hu_moments: \{hu.length()} values (h1=\{hu[0]})")
  println(" ")

  // === Augmentation pipeline ===
  let augmented = @millow.augment_pipeline(img, [
    @millow.Augmentation::FlipHorizontal,
    @millow.Augmentation::Rotate(15.0),
    @millow.Augmentation::Brightness(1.2),
    @millow.Augmentation::Contrast(1.3),
    @millow.Augmentation::NoiseGaussian(8.0),
  ]) catch {
    _ => {
      println("Error: augment_pipeline failed")
      return
    }
  }
  println("32. augment_pipeline (5 ops): \{@millow.info(augmented)}")
  println(" ")

  // === Metrics ===
  println("Quality metrics:")
  println("  PSNR(original, blurred) = \{@millow.psnr(img, blurred)} dB")
  println("  MSE(original, blurred)  = \{@millow.mse(img, blurred)}")
  println("  SSIM(original, blurred) = \{@millow.ssim(img, blurred)}")
  println(" ")

  // === PPM serialization ===
  let ppm = @millow.to_ppm(img)
  println("PPM serialization: \{ppm.length()} bytes")
  println(" ")

  println("=== Demo complete! ===")
  println("For full demo with JPEG I/O, see examples/ directory.")
}