import ContentCacheManager from '../../app/js/ContentCacheManager.js'
import fs from 'node:fs'
import crypto from 'node:crypto'
import path from 'node:path'
import os from 'node:os'
import async from 'async'
const _createHash = crypto.createHash

const files = process.argv.slice(2)

function test(hashType, filePath, callback) {
  // override the default hash in ContentCacheManager
  crypto.createHash = function (hash) {
    if (hashType === 'hmac-sha1') {
      return crypto.createHmac('sha1', 'a secret')
    }
    hash = hashType
    return _createHash(hash)
  }
  fs.mkdtemp(path.join(os.tmpdir(), 'pdfcache'), (err, dir) => {
    if (err) {
      return callback(err)
    }
    const t0 = process.hrtime.bigint()
    ContentCacheManager.update(dir, filePath, x => {
      const t1 = process.hrtime.bigint()
      const cold = Number(t1 - t0) / 1e6
      ContentCacheManager.update(dir, filePath, x => {
        const t2 = process.hrtime.bigint()
        const warm = Number(t2 - t1) / 1e6
        fs.rm(dir, { recursive: true, force: true }, err => {
          if (err) {
            return callback(err)
          }
          console.log(
            'uvthreads',
            process.env.UV_THREADPOOL_SIZE,
            filePath,
            'hashType',
            hashType,
            'cold-start',
            cold.toFixed(2),
            'ms',
            'warm-start',
            warm.toFixed(2),
            'ms'
          )
          callback(null, [hashType, cold, warm])
        })
      })
    })
  })
}

const jobs = []
files.forEach(file => {
  jobs.push(cb => {
    test('md5', file, cb)
  })
  jobs.push(cb => {
    test('sha1', file, cb)
  })
  jobs.push(cb => {
    test('hmac-sha1', file, cb)
  })
  jobs.push(cb => {
    test('sha256', file, cb)
  })
})

async.timesSeries(10, (n, cb) => {
  async.series(jobs, cb)
})
