///|
fn main {
  let json_config =
    #|{
    #|  "flags": [
    #|    {
    #|      "name": "multivariate_promo_banner",
    #|      "enabled": true,
    #|      "default_enabled": false,
    #|      "rollout": 100,
    #|      "salt": "promo_salt",
    #|      "is_multivariate": true,
    #|      "default_variant": "control",
    #|      "variants": [
    #|        { "name": "control", "weight": 50 },
    #|        { "name": "treatment_red", "weight": 30 },
    #|        { "name": "treatment_blue", "weight": 20 }
    #|      ],
    #|      "rules": [
    #|        { "type": "AllowVariant", "subject": "vip_user_1", "variant": "treatment_blue" },
    #|        { "type": "WhenVariant", "key": "plan", "op": "In", "value": "pro,enterprise", "variant": "treatment_red" }
    #|      ]
    #|    },
    #|    {
    #|      "name": "canary_release",
    #|      "enabled": true,
    #|      "default_enabled": false,
    #|      "rollout": 35,
    #|      "salt": "canary_salt",
    #|      "is_multivariate": false,
    #|      "default_variant": "off",
    #|      "variants": [],
    #|      "rules": [
    #|        { "type": "Deny", "subject": "bad_actor" },
    #|        { "type": "When", "key": "age", "op": ">=", "value": "18" }
    #|      ]
    #|    }
    #|  ]
    #|}

  let provider = @moonflagkit.JsonConfigProvider::new(json_config)
  match provider.load_flags() {
    Ok(flags) => run_demo(flags)
    Err(err) => println("Error loading configuration: " + err)
  }
}

///|
fn run_demo(flags : Array[@moonflagkit.Flag]) -> Unit {
  println("================================================")
  println("           MoonFlagKit Integration Demo         ")
  println("================================================")
  println("Loaded flags count: " + flags.length().to_string())

  // Test User 1: VIP user getting specific variant
  let user1 : @moonflagkit.EvalContext = {
    subject: "vip_user_1",
    environment: "production",
    attributes: [{ key: "plan", value: "free" }, { key: "age", value: "25" }],
  }

  // Test User 2: Pro plan user matching condition variant
  let user2 : @moonflagkit.EvalContext = {
    subject: "user_bob",
    environment: "production",
    attributes: [{ key: "plan", value: "pro" }, { key: "age", value: "20" }],
  }

  // Test User 3: Underage user blocked by activation condition
  let user3 : @moonflagkit.EvalContext = {
    subject: "user_kid",
    environment: "production",
    attributes: [{ key: "plan", value: "free" }, { key: "age", value: "16" }],
  }

  // Test User 4: Bad actor denied explicitly
  let user4 : @moonflagkit.EvalContext = {
    subject: "bad_actor",
    environment: "production",
    attributes: [{ key: "plan", value: "free" }, { key: "age", value: "30" }],
  }

  show_decisions(flags, user1)
  show_decisions(flags, user2)
  show_decisions(flags, user3)
  show_decisions(flags, user4)

  println("\n--- Configuration Diagnostics ---")
  let diagnostics = @moonflagkit.validate_flags(flags)
  if diagnostics.length() == 0 {
    println("No diagnostics warning: configuration is valid.")
  } else {
    for diag in diagnostics {
      println("[" + diag.kind + "] Flag: " + diag.flag + " -> " + diag.message)
    }
  }
}

///|
fn show_decisions(
  flags : Array[@moonflagkit.Flag],
  context : @moonflagkit.EvalContext,
) -> Unit {
  println("\nEvaluating for Subject: " + context.subject)
  for decision in @moonflagkit.evaluate_all(flags, context) {
    println(@moonflagkit.explain(decision))
  }
}