# Copyright 2018 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.
import logging
import time

from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros.input_playback import keyboard
from autotest_lib.client.cros.power import power_dashboard
from autotest_lib.client.cros.power import power_status
from autotest_lib.client.cros.power import power_test


class power_ThermalLoad(power_test.power_Test):
    """class for power_ThermalLoad test.
    """
    version = 2

    FISHTANK_URL = 'http://storage.googleapis.com/chrome-power/aquarium/aquarium/aquarium.html'
    HOUR = 60 * 60

    def run_once(self, test_url=FISHTANK_URL, duration=2.5*HOUR, numFish=3000):
        """run_once method.

        @param test_url: url of webgl heavy page.
        @param duration: time in seconds to display url and measure power.
        @param numFish: number of fish to pass to WebGL Aquarium.
        """
        with chrome.Chrome(init_network_controller=True) as self.cr:
            tab = self.cr.browser.tabs.New()
            tab.Activate()

            # Just measure power in full-screen.
            fullscreen = tab.EvaluateJavaScript('document.webkitIsFullScreen')
            if not fullscreen:
                with keyboard.Keyboard() as keys:
                    keys.press_key('f4')

            self.backlight.set_percent(100)

            url = test_url + "?numFish=" + str(numFish)
            logging.info('Navigating to url: %s', url)
            tab.Navigate(url)
            tab.WaitForDocumentReadyStateToBeComplete()

            self._flog = FishTankFpsLogger(tab,
                    seconds_period=self._seconds_period,
                    checkpoint_logger=self._checkpoint_logger)
            self._meas_logs.append(self._flog)

            self.start_measurements()
            time.sleep(duration)

    def publish_dashboard(self):
        """Report results power dashboard."""
        super(power_ThermalLoad, self).publish_dashboard()

        vdash = power_dashboard.VideoFpsLoggerDashboard(
            self._flog, self.tagged_testname, self.resultsdir,
            note=self._pdash_note)
        vdash.upload()


class FishTankFpsLogger(power_status.MeasurementLogger):
    """Class to measure Video WebGL Aquarium fps & fish per sec."""

    def __init__(self, tab, seconds_period=20.0, checkpoint_logger=None):
        """Initialize a FishTankFpsLogger.

        Args:
            tab: Chrome tab object
        """
        super(FishTankFpsLogger, self).__init__([], seconds_period,
                                                    checkpoint_logger)
        self._tab = tab
        self._lastFrameCount = 0
        fishCount = self._tab.EvaluateJavaScript('fishCount')
        self.domains = ['avg_fps_%04d_fishes' % fishCount]
        self.refresh()

    def refresh(self):
        frameCount = self._tab.EvaluateJavaScript('frameCount')
        fps = (frameCount - self._lastFrameCount) / self.seconds_period
        self._lastFrameCount = frameCount
        return [fps]

    def save_results(self, resultsdir, fname_prefix=None):
        if not fname_prefix:
            fname_prefix = '%s_results_%.0f' % (self.domains[0], time.time())
        super(FishTankFpsLogger, self).save_results(resultsdir, fname_prefix)

    def calc(self, mtype='fps'):
        return super(FishTankFpsLogger, self).calc(mtype)
