// JSON Parsing Benchmark
//
// Benchmarks JSON parsing performance.
// Run with: lux benchmarks/json_benchmark.lux
//
// This benchmark:
// 1. Generates a large JSON string
// 2. Parses it multiple times
// 3. Reports timing

// Generate a JSON string with n objects
fn generateJsonObject(i: Int): String = {
    "{\"id\":" + toString(i) + ",\"name\":\"item" + toString(i) + "\",\"active\":true,\"value\":" + toString(i * 100) + "}"
}

fn generateJsonArray(n: Int, i: Int, acc: String): String = {
    if i >= n then acc
    else {
        let obj = generateJsonObject(i)
        let sep = if i == 0 then "" else ","
        generateJsonArray(n, i + 1, acc + sep + obj)
    }
}

fn generateLargeJson(n: Int): String = {
    "[" + generateJsonArray(n, 0, "") + "]"
}

// Simple JSON token counting (simulates parsing)
fn countJsonTokens(json: String, i: Int, count: Int): Int = {
    if i >= String.length(json) then count
    else {
        let char = String.substring(json, i, i + 1)
        let newCount =
            if char == "{" then count + 1
            else if char == "}" then count + 1
            else if char == "[" then count + 1
            else if char == "]" then count + 1
            else if char == ":" then count + 1
            else if char == "," then count + 1
            else count
        countJsonTokens(json, i + 1, newCount)
    }
}

// Run benchmark n times
fn runBenchmark(json: String, n: Int, totalTokens: Int): Int = {
    if n <= 0 then totalTokens
    else {
        let tokens = countJsonTokens(json, 0, 0)
        runBenchmark(json, n - 1, totalTokens + tokens)
    }
}

fn main(): Unit with {Console, Time} = {
    Console.print("JSON Parsing Benchmark")
    Console.print("======================")
    Console.print("")

    // Generate large JSON (~100 objects)
    Console.print("Generating JSON data...")
    let json = generateLargeJson(100)
    Console.print("  JSON size: " + toString(String.length(json)) + " bytes")
    Console.print("")

    // Benchmark parsing
    Console.print("Running benchmark (1000 iterations)...")
    let startTime = Time.now()
    let totalTokens = runBenchmark(json, 1000, 0)
    let endTime = Time.now()
    let elapsed = endTime - startTime

    Console.print("")
    Console.print("Results:")
    Console.print("  Total tokens parsed: " + toString(totalTokens))
    Console.print("  Time: " + toString(elapsed) + " ms")
    Console.print("  Iterations per second: " + toString((1000 * 1000) / elapsed))
    Console.print("")
}

let result = run main() with {}
