fn show_opt(opt : String?) -> String {
  match opt {
    Some(v) => "\"\{v}\""
    None => "(nil)"
  }
}

fn show_opt_int(opt : Int?) -> String {
  match opt {
    Some(v) => "\{v}"
    None => "(nil)"
  }
}

fn show_opt_float(opt : Float?) -> String {
  match opt {
    Some(v) => "\{v}"
    None => "(nil)"
  }
}

fn main() -> Unit {
  println("========================================")
  println("  MoonBitDB - 快速开始演示")
  println("========================================")
  
  let db = @lib.Database::new()
  
  println("\n📌 1. String 基础操作")
  println("----------------------------------------")
  db.set("greeting", "Hello, MoonBitDB!")
  println("  SET greeting 'Hello, MoonBitDB!'")
  println("  GET greeting = \{show_opt(db.get("greeting"))}")
  println("  STRLEN greeting = \{db.strlen("greeting")}")
  
  db.set("counter", "10")
  println("  SET counter 10")
  println("  INCR counter = \{show_opt_int(db.incr("counter"))}")
  println("  INCR counter = \{show_opt_int(db.incr("counter"))}")
  println("  DECR counter = \{show_opt_int(db.decr("counter"))}")
  
  println("\n📌 2. Hash 用户信息存储")
  println("----------------------------------------")
  db.hset("user:1001", "username", "alice") |> ignore
  db.hset("user:1001", "email", "alice@example.com") |> ignore
  db.hset("user:1001", "level", "42") |> ignore
  println("  HSET user:1001 {username, email, level}")
  println("  HGET user:1001 username = \{show_opt(db.hget("user:1001", "username"))}")
  println("  HLEN user:1001 = \{db.hlen("user:1001")}")
  let user_email = db.hget("user:1001", "email")
  let has_email = match user_email {
    Some(_) => true
    None => false
  }
  println("  email字段存在 = \{has_email}")
  let all_fields = db.hgetall("user:1001")
  let field_list : Array[String] = []
  for f, _ in all_fields {
    field_list.push(f)
  }
  println("  字段列表 = [\{field_list.join(", ")}]")
  
  println("\n📌 3. List 任务队列")
  println("----------------------------------------")
  db.rpush("tasks", "完成报告") |> ignore
  db.rpush("tasks", "代码审查") |> ignore
  db.rpush("tasks", "团队会议") |> ignore
  println("  RPUSH tasks [完成报告, 代码审查, 团队会议]")
  println("  LLEN tasks = \{db.llen("tasks")}")
  let task_list = db.lrange("tasks", 0, -1)
  println("  LRANGE tasks 0 -1 = [\{task_list.join(", ")}]")
  println("  LPOP tasks = \{show_opt(db.lpop("tasks"))}")
  println("  RPOP tasks = \{show_opt(db.rpop("tasks"))}")
  println("  剩余 LLEN = \{db.llen("tasks")}")
  
  println("\n📌 4. Set 标签系统")
  println("----------------------------------------")
  db.sadd("tags:post:1", "技术") |> ignore
  db.sadd("tags:post:1", "编程") |> ignore
  db.sadd("tags:post:1", "MoonBit") |> ignore
  db.sadd("tags:post:1", "技术") |> ignore
  println("  SADD tags:post:1 {技术, 编程, MoonBit, 技术}")
  println("  SCARD = \{db.scard("tags:post:1")} (自动去重)")
  println("  SISMEMBER MoonBit = \{db.sismember("tags:post:1", "MoonBit")}")
  let tags = db.smembers("tags:post:1")
  println("  SMEMBERS = [\{tags.join(", ")}]")
  
  println("\n📌 5. Sorted Set 排行榜")
  println("----------------------------------------")
  db.zadd("leaderboard", 1000.0, "玩家A") |> ignore
  db.zadd("leaderboard", 2500.0, "玩家B") |> ignore
  db.zadd("leaderboard", 1800.0, "玩家C") |> ignore
  db.zadd("leaderboard", 3200.0, "玩家D") |> ignore
  println("  ZADD leaderboard {玩家A:1000, 玩家B:2500, 玩家C:1800, 玩家D:3200}")
  println("  ZCARD = \{db.zcard("leaderboard")}")
  println("  ZSCORE 玩家B = \{show_opt_float(db.zscore("leaderboard", "玩家B"))}")
  println("  ZRANK 玩家B = \{show_opt_int(db.zrank("leaderboard", "玩家B"))} (从小到大)")
  let top3 = db.zrevrange("leaderboard", 0, 2)
  println("  TOP 3 (ZREVRANGE 0 2):")
  for i = 0; i < top3.length(); i = i + 1 {
    let score = db.zscore("leaderboard", top3[i])
    let score_str = show_opt_float(score)
    println("    #\{i + 1} \{top3[i]} - \{score_str}分")
  }
  
  println("\n📌 6. Key 过期机制")
  println("----------------------------------------")
  db.set("session:token_abc", "user:1001")
  db.expire("session:token_abc", 60) |> ignore
  println("  SET session:token_abc + EXPIRE 60s")
  println("  TTL = \{db.ttl("session:token_abc")} 秒")
  db.advance_time(30000)
  println("  30秒后 TTL = \{db.ttl("session:token_abc")} 秒")
  db.advance_time(35000)
  println("  65秒后 EXISTS = \{db.exists("session:token_abc")}")
  println("  TTL = \{db.ttl("session:token_abc")} (-2 表示不存在)")
  
  println("\n📌 7. 批量操作")
  println("----------------------------------------")
  db.mset(["config:theme", "config:lang", "config:tz"], ["dark", "zh-CN", "Asia/Shanghai"]) |> ignore
  println("  MSET 3个配置项")
  let config_vals = db.mget(["config:theme", "config:lang", "config:tz", "config:nonexist"])
  println("  MGET 结果:")
  let keys = ["config:theme", "config:lang", "config:tz", "config:nonexist"]
  for i = 0; i < config_vals.length(); i = i + 1 {
    println("    \{keys[i]} = \{show_opt(config_vals[i])}")
  }
  
  println("\n📌 8. 服务器信息")
  println("----------------------------------------")
  println("  DBSIZE = \{db.dbsize()}")
  println("  PING = \{@lib.Database::ping()}")
  let rk = db.randomkey()
  println("  RANDOMKEY = \{show_opt(rk)}")
  let all_keys = db.keys()
  println("  KEYS * (\{all_keys.length()} 个): [\{all_keys.join(", ")}]")
  println("  支持命令数 = \{@lib.Database::command().length()}")
  
  println("\n========================================")
  println("  ✅ 演示完成!")
  println("========================================")
}