# Copyright 2020 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 itertools
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_status
from autotest_lib.client.cros.power import power_test


class power_VideoEncode(power_test.power_Test):
    """class for power_VideoEncode test."""
    version = 1

    video_url = 'https://crospower.page.link/power_VideoEncode'
    extra_browser_args = ['--use-fake-ui-for-media-stream']

    codecs = ['h264', 'vp8', 'vp9', 'av1']
    resolutions = ['360', '720', '1080', '4k']
    framerates = [30, 60]

    def run_once(self, seconds_per_test=120, codecs=codecs,
                 resolutions=resolutions, framerates=framerates):
        """run_once method.

        @param seconds_per_test: time in seconds for each subtest.
        @param codecs: list of codec to test. Possible value are
                       ['h264', 'vp8', 'vp9', 'av1'].
        @param resolutions: list of resolutions to test. Possible value are
                       ['360', '540', '720', '1080', '1440', '4k'].
        @param framerates: list of framerate to test. Possible value are
                           number in the range of 1 to 60.

        """
        with chrome.Chrome(init_network_controller=True,
                           extra_browser_args=self.extra_browser_args) as cr:

            tab = 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')

            url = self.video_url
            tab.Navigate(url)
            tab.WaitForDocumentReadyStateToBeComplete()
            time.sleep(10)

            self._vlog = power_status.VideoFpsLogger(tab,
                seconds_period=self._seconds_period,
                checkpoint_logger=self._checkpoint_logger)
            self._meas_logs.append(self._vlog)

            loop = 0
            self.start_measurements()
            for codec, resolution, fps in itertools.product(codecs, resolutions,
                                                            framerates):
                tagname = '%s_%s_%sfps' % (codec, resolution, fps)
                js = 'changeFormat("%s", "%s", %d)' % (codec, resolution, fps)
                logging.info(js)
                tab.EvaluateJavaScript(js)
                loop_start = time.time()
                self.loop_sleep(loop, seconds_per_test)
                self.checkpoint_measurements(tagname, loop_start)
                loop += 1
