# Copyright 2017 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.
"""Helper functions to parse result collected from device"""

from __future__ import print_function
from fix_skia_results import _TransformBenchmarks

import json

def normalize(bench, dict_list):
    bench_base = {
        'Panorama': 1,
        'Dex2oat': 1,
        'Hwui': 10000,
        'Skia': 1,
        'Synthmark': 1,
        'Binder': 0.001
    }
    result_dict = dict_list[0]
    for key in result_dict:
        result_dict[key] = result_dict[key] / bench_base[bench]
    return [result_dict]


# Functions to parse benchmark result for data collection.
def parse_Panorama(bench, fin):
    result_dict = {}
    for line in fin:
        words = line.split()
        if 'elapsed' in words:
            #TODO: Need to restructure the embedded word counts.
            result_dict['total_time_s'] = float(words[3])
            result_dict['retval'] = 0
            return normalize(bench, [result_dict])
    raise ValueError('You passed the right type of thing, '
                     'but it didn\'t have the expected contents.')


def parse_Synthmark(bench, fin):
    result_dict = {}
    accum = 0
    cnt = 0
    for line in fin:
        words = line.split()
        if 'normalized' in words:
            #TODO: Need to restructure the embedded word counts.
            accum += float(words[-1])
            cnt += 1
    if accum != 0:
        result_dict['total_voices'] = accum / cnt
        result_dict['retval'] = 0
        return normalize(bench, [result_dict])
    raise ValueError('You passed the right type of thing, '
                     'but it didn\'t have the expected contents.')


def parse_Binder(bench, fin):
    result_dict = {}
    accum = 0
    cnt = 0
    for line in fin:
        words = line.split()
        for word in words:
            if 'average' in word:
                #TODO: Need to restructure the embedded word counts.
                accum += float(word[8:-2])
                cnt += 1
    if accum != 0:
        result_dict['avg_time_ms'] = accum / cnt
        result_dict['retval'] = 0
        return normalize(bench, [result_dict])
    raise ValueError('You passed the right type of thing, '
                     'but it didn\'t have the expected contents.')


def parse_Dex2oat(bench, fin):
    result_dict = {}
    cnt = 0
    for line in fin:
        words = line.split()
        if 'elapsed' in words:
            cnt += 1
            #TODO: Need to restructure the embedded word counts.
            if cnt == 1:
                # First 'elapsed' time is for microbench 'Chrome'
                result_dict['chrome_s'] = float(words[3])
            elif cnt == 2:
                # Second 'elapsed' time is for microbench 'Camera'
                result_dict['camera_s'] = float(words[3])

                result_dict['retval'] = 0
                # Two results found, return
                return normalize(bench, [result_dict])
    raise ValueError('You passed the right type of thing, '
                     'but it didn\'t have the expected contents.')


def parse_Hwui(bench, fin):
    result_dict = {}
    for line in fin:
        words = line.split()
        if 'elapsed' in words:
            #TODO: Need to restructure the embedded word counts.
            result_dict['total_time_s'] = float(words[3])
            result_dict['retval'] = 0
            return normalize(bench, [result_dict])
    raise ValueError('You passed the right type of thing, '
                     'but it didn\'t have the expected contents.')


def parse_Skia(bench, fin):
    obj = json.load(fin)
    return normalize(bench, _TransformBenchmarks(obj))
