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

"""Classes to do comparison for mirrored mode."""

import logging

from autotest_lib.client.cros.chameleon import screen_capture
from autotest_lib.client.cros.chameleon import screen_comparison


class MirrorComparer(object):
    """A class to compare the resolutions and screens for mirrored mode.

    Calling its member method compare() does the comparison.

    """

    def __init__(self, display_facade, output_dir):
        """Initializes the MirrorComparer objects.

        @param display_facade: A display facade object
        @param output_dir: The directory for output images.
        """
        self._display_facade = display_facade
        int_capturer = screen_capture.CrosInternalScreenCapturer(display_facade)
        ext_capturer = screen_capture.CrosExternalScreenCapturer(display_facade)
        # The frame buffers of screens should be perfectly matched.
        # Skip if the image sizes are different.
        self._screen_comparer = screen_comparison.ScreenComparer(
                int_capturer, ext_capturer, output_dir, 0, 0, True)


    def compare(self):
        """Compares the resolutions and screens on all CrOS screens.

        This method first checks if CrOS is under mirrored mode or not. Skip
        the following tests if not in mirrored mode.

        Then it checks all the resolutions identical and also all the screens
        identical.

        @return: None if the check passes; otherwise, a string of error message.
        """
        if not self._display_facade.is_mirrored_enabled():
            message = 'Do mirror comparison but not in mirrored mode.'
            logging.error(message)
            return message

        logging.info('Checking the resolutions of all screens identical...')
        # TODO(waihong): Support the case without internal screen.
        internal_resolution = self._display_facade.get_internal_resolution()
        # TODO(waihong): Support multiple external screens.
        external_resolution = self._display_facade.get_external_resolution()

        if internal_resolution != external_resolution:
            logging.info('Sofware-based mirroring, skip the screen comparison. '
                         'Resolutions: Internal %r; External %r',
                         internal_resolution, external_resolution)
            return None
        else:
            logging.info('Resolutions across all CrOS screens match: %dx%d',
                         *internal_resolution)

        logging.info('Checking all the screens mirrored...')
        return self._screen_comparer.compare()
