# Copyright 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.

import os
import time

from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.chameleon import chameleon_port_finder
from autotest_lib.client.cros.video import method_logger


class ChameleonScreenshotCapturer(object):
    """
    Provides an interface to capture a dut screenshot using a Chameleon Board.

    Example use:
        with ChameleonScreenshotCapturer(board, 'HDMI', dutil, '/tmp', 10) as c:
            c.capture(filename)
    """


    def __init__(self, chameleon_board, interface, display_utility, dest_dir,
                 timeout_video_input_s, box=None):
        """
        @param chameleon_board: object representing the ChameleonBoard.
        @param interface: string, display interface to use. eg.: HDMI
        @param display_utility: DisplayUtility object to interact with DUT
        @param dest_dir: path, full path to the dest dir to put the screenshot.
        @param timeout_video_input_s: int, max time to wait for chameleon video
                                      input to become stable.
        @box: int tuple, left, upper, right, lower pixel coordinates
              defining a desired image region

        """
        self.chameleon_board = chameleon_board
        self.display_utility = display_utility
        self.interface = interface.lower()
        self.dest_dir = dest_dir
        self.port = None
        self.box = box
        self.timeout_video_input_s = timeout_video_input_s
        self.was_plugged = False
        self._find_connected_port()


    @method_logger.log
    def __enter__(self):

        if not self.was_plugged:
            self.port.plug()

        self.port.wait_video_input_stable(self.timeout_video_input_s)

        self.display_utility.set_mirrored(True)
        time.sleep(self.timeout_video_input_s)

        return self


    @method_logger.log
    def _find_connected_port(self):
        """
        Gets a connected port of the pre-specified interface.

        @raises TestError if desired port was not detected.

        """
        self.chameleon_board.reset()
        finder = chameleon_port_finder.ChameleonPortFinder(self.chameleon_board)

        connected_port = finder.find_video_port(self.interface)

        if connected_port is None:
            msg = 'No %s port found.\n' % self.interface
            raise error.TestError(msg + str(finder))

        self.port = connected_port
        self.was_plugged = connected_port.plugged


    @method_logger.log
    def capture(self, filename, box=None):
        """
        Captures a screenshot using provided chameleon board.

        We save to a file because comparers like bp take files.

        @param filename: string, filename of the image to save to.
        @param box: int tuple, left, upper, right, lower pixel coordinates
                    defining a box region of what the image should be.
        @returns a fullpath to the image just captured.

        """

        fullpath = os.path.join(self.dest_dir, filename)

        if not box:
            box = self.box

        img = self.port.capture_screen()
        img.crop(box).save(fullpath)

        return fullpath


    @method_logger.log
    def __exit__(self, exc_type, exc_val, exc_tb):
        if not self.was_plugged:
            self.port.unplug()
