const Metrics = require('./Metrics')

const ONE_MB = 1024 * 1024

function emitPdfStats(stats, timings) {
  if (timings['compute-pdf-caching']) {
    emitPdfCachingStats(stats, timings)
  } else {
    // How much bandwidth will the pdf incur when downloaded in full?
    Metrics.summary('pdf-bandwidth', stats['pdf-size'])
  }
}

function emitPdfCachingStats(stats, timings) {
  if (!stats['pdf-size']) return // double check

  // How large is the overhead of hashing up-front?
  const fraction =
    timings.compileE2E - timings['compute-pdf-caching'] !== 0
      ? timings.compileE2E /
        (timings.compileE2E - timings['compute-pdf-caching'])
      : 1
  Metrics.summary('overhead-compute-pdf-ranges', fraction * 100 - 100)

  // How does the hashing scale to pdf size in MB?
  Metrics.timing(
    'compute-pdf-caching-relative-to-pdf-size',
    timings['compute-pdf-caching'] / (stats['pdf-size'] / ONE_MB)
  )
  if (stats['pdf-caching-total-ranges-size']) {
    // How does the hashing scale to total ranges size in MB?
    Metrics.timing(
      'compute-pdf-caching-relative-to-total-ranges-size',
      timings['compute-pdf-caching'] /
        (stats['pdf-caching-total-ranges-size'] / ONE_MB)
    )
    // How fast is the hashing per range on average?
    Metrics.timing(
      'compute-pdf-caching-relative-to-ranges-count',
      timings['compute-pdf-caching'] / stats['pdf-caching-n-ranges']
    )

    // How many ranges are new?
    Metrics.summary(
      'new-pdf-ranges-relative-to-total-ranges',
      (stats['pdf-caching-n-new-ranges'] / stats['pdf-caching-n-ranges']) * 100
    )
  }

  // How much content is cacheable?
  Metrics.summary(
    'cacheable-ranges-to-pdf-size',
    (stats['pdf-caching-total-ranges-size'] / stats['pdf-size']) * 100
  )

  const sizeWhenDownloadedInFull =
    // All of the pdf
    stats['pdf-size'] -
    // These ranges are potentially cached.
    stats['pdf-caching-total-ranges-size'] +
    // These ranges are not cached.
    stats['pdf-caching-new-ranges-size']

  // How much bandwidth can we save when downloading the pdf in full?
  Metrics.summary(
    'pdf-bandwidth-savings',
    100 - (sizeWhenDownloadedInFull / stats['pdf-size']) * 100
  )

  // How much bandwidth will the pdf incur when downloaded in full?
  Metrics.summary('pdf-bandwidth', sizeWhenDownloadedInFull)

  // How much space do the ranges use?
  // This will accumulate the ranges size over time, skipping already written ranges.
  Metrics.summary('pdf-ranges-disk-size', stats['pdf-caching-new-ranges-size'])
}

module.exports = {
  emitPdfStats
}
