# Copyright (c) 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.

from autotest_lib.client.cros.power import power_dashboard

class ServerTestDashboard(power_dashboard.BaseDashboard):
    """Dashboard class for autotests that run on server side.
    """

    def __init__(self, logger, testname, host, start_ts=None, resultsdir=None,
                 uploadurl=None, note=''):
        """Create ServerTestDashboard objects.

        Args:
            logger: object that store the log. This will get convert to
                    dictionary by self._convert()
            testname: name of current test
            resultsdir: directory to save the power json
            uploadurl: url to upload power data
            host: autotest_lib.server.hosts.cros_host.CrosHost object of DUT
            note: note for current test run
        """

        self._host = host
        self._note = note
        super(ServerTestDashboard, self).__init__(logger, testname, start_ts,
                                                  resultsdir, uploadurl)

    def _create_dut_info_dict(self, power_rails):
        """Create a dictionary that contain information of the DUT.

        Args:
            power_rails: list of measured power rails

        Returns:
            DUT info dictionary
        """

        board = self._host.get_board().replace('board:', '')
        platform = self._host.get_platform()

        if not platform.startswith(board):
            board += '_' + platform

        if self._host.has_hammer():
            board += '_hammer'

        dut_info_dict = {
            'board': board,
            'version': {
                'hw': self._host.get_hardware_revision(),
                'milestone': self._host.get_chromeos_release_milestone(),
                'os': self._host.get_release_version(),
                'channel': self._host.get_channel(),
                'firmware': self._host.get_firmware_version(),
                'ec': self._host.get_ec_version(),
                'kernel': self._host.get_kernel_version(),
            },
            'sku' : {
                'cpu': self._host.get_cpu_name(),
                'memory_size': self._host.get_mem_total_gb(),
                'storage_size': self._host.get_disk_size_gb(),
                'display_resolution': self._host.get_screen_resolution(),
            },
            'ina': {
                'version': 0,
                'ina': power_rails,
            },
            'note': self._note,
        }

        if self._host.has_battery():
            # Round the battery size to nearest tenth because it is fluctuated
            # for platform without battery nominal voltage data.
            dut_info_dict['sku']['battery_size'] = round(
                    self._host.get_battery_size(), 1)
            dut_info_dict['sku']['battery_shutdown_percent'] = \
                    self._host.get_low_battery_shutdown_percent()
        return dut_info_dict

class PowerTelemetryLoggerDashboard(ServerTestDashboard):
    """Dashboard class for power_telemetry_logger.PowerTelemetryLogger class.
    """

    def __init__(self, logger, testname, host, start_ts, checkpoint_logger,
                 resultsdir=None, uploadurl=None, note=''):
        if uploadurl is None:
            uploadurl = 'http://chrome-power.appspot.com'
        self._checkpoint_logger = checkpoint_logger
        super(PowerTelemetryLoggerDashboard, self).__init__(
                logger, testname, host, start_ts, resultsdir, uploadurl, note)

    def _create_checkpoint_dict(self):
        """Create dictionary for checkpoint.
        """
        return self._checkpoint_logger.convert_relative(self._start_ts)

    def _convert(self):
        """
        self._logger is already in correct format, so just return it.

        Returns:
            raw measurement dictionary
        """
        self._tag_with_checkpoint(self._logger)
        return self._logger
