var nota = use('nota')
var os = use('os')
var io = use('io')

var ll = io.slurp('benchmarks/nota.json')

var newarr = []
var accstr = ""
for (var i = 0; i < 10000; i++) {
  accstr += i;
  newarr.push(i.toString())
}
// Arrays to store timing results
var jsonDecodeTimes = [];
var jsonEncodeTimes = [];
var notaEncodeTimes = [];
var notaDecodeTimes = [];
var notaSizes = [];

// Run 100 tests
for (let i = 0; i < 100; i++) {
    // JSON Decode test
    let start = os.now();
    var jll = json.decode(ll);
    jsonDecodeTimes.push((os.now() - start) * 1000);

    // JSON Encode test
    start = os.now();
    let jsonStr = JSON.stringify(jll);
    jsonEncodeTimes.push((os.now() - start) * 1000);

    // NOTA Encode test
    start = os.now();
    var nll = nota.encode(jll);
    notaEncodeTimes.push((os.now() - start) * 1000);

    // NOTA Decode test
    start = os.now();
    var oll = nota.decode(nll);
    notaDecodeTimes.push((os.now() - start) * 1000);
}

// Calculate statistics
function getStats(arr) {
    def avg = arr.reduce((a, b) => a + b) / arr.length;
    def min = Math.min(...arr);
    def max = Math.max(...arr);
    return { avg, min, max };
}

// Pretty print results
log.console("\n== Performance Test Results (100 iterations) ==");
log.console("\nJSON Decoding (ms):");
def jsonDecStats = getStats(jsonDecodeTimes);
log.console(`Average: ${jsonDecStats.avg.toFixed(2)} ms`);
log.console(`Min: ${jsonDecStats.min.toFixed(2)} ms`);
log.console(`Max: ${jsonDecStats.max.toFixed(2)} ms`);

log.console("\nJSON Encoding (ms):");
def jsonEncStats = getStats(jsonEncodeTimes);
log.console(`Average: ${jsonEncStats.avg.toFixed(2)} ms`);
log.console(`Min: ${jsonEncStats.min.toFixed(2)} ms`);
log.console(`Max: ${jsonEncStats.max.toFixed(2)} ms`);

log.console("\nNOTA Encoding (ms):");
def notaEncStats = getStats(notaEncodeTimes);
log.console(`Average: ${notaEncStats.avg.toFixed(2)} ms`);
log.console(`Min: ${notaEncStats.min.toFixed(2)} ms`);
log.console(`Max: ${notaEncStats.max.toFixed(2)} ms`);

log.console("\nNOTA Decoding (ms):");
def notaDecStats = getStats(notaDecodeTimes);
log.console(`Average: ${notaDecStats.avg.toFixed(2)} ms`);
log.console(`Min: ${notaDecStats.min.toFixed(2)} ms`);
log.console(`Max: ${notaDecStats.max.toFixed(2)} ms`);

