# Copyright (c) 2014 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.video import method_logger


class VideoScreenShotCollector(object):
    """
    Captures and collects screenshots of a video at specified time points.

    """


    @method_logger.log
    def __init__(self, player, screenshot_namer, screenshot_capturer):
        self.player = player
        self.screnshot_namer = screenshot_namer
        self.screnshot_capturer = screenshot_capturer


    @method_logger.log
    def collect_screenshot(self, timestamp):
        """
        Get a screenshot of video at a particular time.

        Navigates player to a given time value, captures and saves a
        screenshot at that time value.

        @param timestamp: time_delta, the time value to capture screenshot for.

        @returns a complete path to the screenshot captured.

        """
        filename = self.screnshot_namer.get_filename(timestamp)

        self.player.seek_video_to_timestamp(timestamp)
        self.player.wait_for_video_to_seek()

        return self.screnshot_capturer.capture(filename)


    @method_logger.log
    def ensure_player_is_ready(self):
        """
         Loads video and waits for player to be ready.

         @raises whatever load_video() raises.

        """
        self.player.load_video()


    @method_logger.log
    def collect_multiple_screenshots(self, timestamps):
        """
        Collects screenshots for each timevalue in a list.

        @param timestamps: time_delta list, time values to collect
        screenshots for.

        @returns a list of complete paths for screenshot captured.

        """
        self.ensure_player_is_ready()

        with self.screnshot_capturer:
            return [self.collect_screenshot(t) for t in timestamps]