# Copyright 2021 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Routines for printing boot time performance test results."""

import resultset


def PrintRawData(reader, dirlist, keytype, keylist):
  """Print 'bootperf' results in "raw data" format.

  Args:
    reader: Function for reading results from results
           directories.
    dirlist: List of directories to read results from.
    keytype: Selector specifying the desired key set (e.g.
            the boot time keyset, the disk stats keyset, etc.)
    keylist: List of event keys to be printed in the report.
  """
  for dir_ in dirlist:
    results = reader(dir_)
    keyset = results.KeySet(keytype)
    for i in range(0, keyset.num_iterations):
      if len(dirlist) > 1:
        line = '{} {:3d}'.format(results.name, i)
      else:
        line = '{:3d}'.format(i)
      if keylist is not None:
        markers = keylist
      else:
        markers = keyset.markers
      for stat in markers:
        (_, v) = keyset.PrintableStatistic(keyset.RawData(stat)[i])
        line += ' {!s:>5}'.format(v)
      print(line)


def PrintStatisticsSummary(reader, dirlist, keytype, keylist):
  """Print 'bootperf' results in "summary of averages" format.

  Args:
    reader: Function for reading results from results
           directories.
    dirlist: List of directories to read results from.
    keytype: Selector specifying the desired key set (e.g.
            the boot time keyset, the disk stats keyset, etc.)
    keylist: List of event keys to be printed in the report.
  """
  if (keytype == resultset.TestResultSet.BOOTTIME_KEYSET or
      keytype == resultset.TestResultSet.FIRMWARE_KEYSET):
    header = '{:>5} {:>3}  {:>5} {:>3}  {}'.format(
        'time', 's%', 'dt', 's%', 'event')
    tformat = '{:>5} {:2d}%  {:>5} {}  {}'
  else:
    header = '{:>7} {:>3}  {:>7} {:>3}  {}'.format(
        'diskrd', 's%', 'delta', 's%', 'event')
    tformat = '{:>7} {:2d}%  {:>7} {}  {}'
  havedata = False
  for dir_ in dirlist:
    results = reader(dir_)
    keyset = results.KeySet(keytype)
    if keylist is not None:
      markers = keylist
    else:
      markers = keyset.markers
    if havedata:
      print('')
    if len(dirlist) > 1:
      print('{}'.format(results.name), end='')
    print('(on {:d} cycles):'.format(keyset.num_iterations))
    print(header)
    prevvalue = 0
    prevstat = None
    for stat in markers:
      (valueavg, valuedev) = keyset.Statistics(stat)
      valuepct = int(100.0 * valuedev / valueavg + 0.5)
      if prevstat:
        try:
          (deltaavg, deltadev) = keyset.DeltaStatistics(prevstat, stat)
          if deltaavg == 0.0:
            deltaavg = 1.0
            print(f'deltaavg is zero! (delta is {prevstat} to {stat})')
          deltapct = '{:2d}%'.format(int(100.0 * deltadev / deltaavg + 0.5))
        except ValueError as ve:
          print('Warning:', ve)
          deltapct = '(N/A)'

      else:
        deltapct = '{:2d}%'.format(valuepct)
      (valstring, val_printed) = keyset.PrintableStatistic(valueavg)
      delta = val_printed - prevvalue
      (deltastring, _) = keyset.PrintableStatistic(delta)
      print(tformat.format(valstring, valuepct, '+' + deltastring, deltapct,
                           stat))
      prevvalue = val_printed
      prevstat = stat
    havedata = True
