// Copyright 2026 lkdrt. Licensed under Apache-2.0.

///|
fn print_usage() -> Unit {
  println(
    "=======================================================================",
  )
  println("  MoonBit Palette Forge - Strict Parse, Theme, Audit & Export Demo")
  println(
    "=======================================================================",
  )
  println("Usage: moon run src/cli")
  println("Runs a built-in workflow demo through the public facade APIs.")
  println(
    "=======================================================================",
  )
}

///|
fn format_scale_error(error : @harmony.ScaleError) -> String {
  match error {
    UnsupportedStepCount(steps) => "unsupported step count " + steps.to_string()
    InvalidLightnessRange(minimum, maximum) =>
      "invalid lightness range " +
      @core.format_decimal(minimum, 3) +
      ".." +
      @core.format_decimal(maximum, 3)
    InvalidChromaScale(scale) =>
      "invalid chroma scale " + @core.format_decimal(scale, 3)
    InvalidHueOffset(offset) =>
      "invalid hue offset " + @core.format_decimal(offset, 3)
  }
}

///|
fn format_theme_error(error : @tokens.ThemeError) -> String {
  match error {
    EmptyName => "empty theme or token name"
    DuplicateToken(name) => "duplicate token " + name
    MissingAlias(name) => "missing alias " + name
    AliasCycle(name) => "alias cycle " + name
    InvalidRole(role) => "invalid role " + role
  }
}

///|
fn format_analysis_error(error : @analysis.AnalysisError) -> String {
  match error {
    InvalidBinCount => "invalid bin count"
    InvalidThreshold => "invalid duplicate threshold"
  }
}

///|
fn main {
  print_usage()
  let seed_input = "oklch(62% 0.19 258)"
  let spec : @harmony.ScaleSpec = {
    steps: 5,
    lightness_min: 0.18,
    lightness_max: 0.92,
    chroma_scale: 1.0,
    hue_offset: 0.0,
  }
  let policy : @accessibility.AuditPolicy = {
    min_text_ratio: 4.5,
    min_large_ratio: 3.0,
    min_ui_ratio: 3.0,
    min_apca: 60.0,
  }

  match @lib.parse_color_strict(seed_input) {
    Err(error) =>
      println("strict parse failed: " + @spaces.format_parse_error(error))
    Ok(seed_color) => {
      println("strict parse: " + seed_input + " -> " + seed_color.to_hex())

      match @lib.create_scale(seed_color, spec) {
        Err(error) =>
          println("scale generation failed: " + format_scale_error(error))
        Ok(scale) => {
          println("scale colors: " + scale.colors.length().to_string())

          match @lib.create_theme(seed_color, spec) {
            Err(error) =>
              println("theme generation failed: " + format_theme_error(error))
            Ok(theme) => {
              println("theme tokens: " + theme.tokens.length().to_string())

              let audit = @lib.audit_palette(scale, policy)
              println(
                "audit summary: " +
                audit.passed.to_string() +
                "/" +
                audit.total.to_string() +
                " passed",
              )

              match @lib.analyze_palette(scale) {
                Err(error) =>
                  println("analysis failed: " + format_analysis_error(error))
                Ok(report) => {
                  println(
                    "analysis readability: " +
                    @core.format_decimal(report.readability_score, 3),
                  )
                  println(
                    "analysis duplicate groups: " +
                    report.duplicates.length().to_string(),
                  )
                }
              }

              println("\nTheme CSS export:")
              println(@export.export_theme_css(theme))
              println("Theme JSON export:")
              println(@export.export_theme_json(theme))
            }
          }
        }
      }
    }
  }
}