#!/usr/bin/env python
# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Plots metrics from stdin.

Expected format:
PLOTTABLE_DATA: <json data>
Where json data has the following format:
{
  "graph_name": "<graph name>",
  "trace_name": "<test suite name>",
  "units": "<units>",
  "mean": <mean value>,
  "std": <standard deviation value>,
  "samples": [
    { "time": <sample time in us>, "value": <sample value> },
    ...
  ]
}
"""

import argparse
import fileinput
import json
import matplotlib.pyplot as plt

LINE_PREFIX = 'PLOTTABLE_DATA: '

GRAPH_NAME = 'graph_name'
TRACE_NAME = 'trace_name'
UNITS = 'units'

MICROSECONDS_IN_SECOND = 1e6


def main():
  parser = argparse.ArgumentParser(
      description='Plots metrics exported from WebRTC perf tests')
  parser.add_argument('-m', '--metrics', type=str, nargs='*',
      help='Metrics to plot. If nothing specified then will plot all available')
  args = parser.parse_args()

  metrics_to_plot = set()
  if args.metrics:
    for metric in args.metrics:
      metrics_to_plot.add(metric)

  metrics = []
  for line in fileinput.input('-'):
    line = line.strip()
    if line.startswith(LINE_PREFIX):
      line = line.replace(LINE_PREFIX, '')
      metrics.append(json.loads(line))
    else:
      print line

  for metric in metrics:
    if len(metrics_to_plot) > 0 and metric[GRAPH_NAME] not in metrics_to_plot:
      continue

    figure = plt.figure()
    figure.canvas.set_window_title(metric[TRACE_NAME])

    x_values = []
    y_values = []
    start_x = None
    samples = metric['samples']
    samples.sort(key=lambda x: x['time'])
    for sample in samples:
      if start_x is None:
        start_x = sample['time']
      # Time is us, we want to show it in seconds.
      x_values.append((sample['time'] - start_x) / MICROSECONDS_IN_SECOND)
      y_values.append(sample['value'])

    plt.ylabel('%s (%s)' % (metric[GRAPH_NAME], metric[UNITS]))
    plt.xlabel('time (s)')
    plt.title(metric[GRAPH_NAME])
    plt.plot(x_values, y_values)

  plt.show()


if __name__ == '__main__':
  main()
