# Copyright (c) 2013 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 cgi, os

from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib.cros import chrome

_DEFAULT_TIMEOUT = 60  # Seconds a tester has to respond to prompts


class semiauto_test(test.test):
    """Base class for semiauto tests in ChromeOS.

    All these tests use telemetry and a simple interative webpage that
    navigates the user through the test.
    """
    version = 1

    def login_and_open_interactive_tab(self):
        """Log in to machine, open browser, and navigate to dialog template.

        Dialog template is on first tab.  Any other needed tabs can be opened
        using the self._browser object.
        """
        self._browser = chrome.Chrome().browser
        self._tab = self._browser.tabs[0]
        self._browser.SetHTTPServerDirectories(
                os.path.join(self.bindir, '..', '..', 'cros'))
        self._tab.Navigate(self._browser.http_server.UrlOf(
                'semiauto_shell.html'))

    def close_browser(self):
        """Close browser if open."""
        if self._browser:
            self._browser.Close()

    def set_tab(self, html):
        """Replace the body of self._tab with provided html.

        @param html: the HTML that will replace the body of the dialog tab.
        """
        html_esc = html.replace('"', '\\"')

        # Use JavaScript to set the output.
        self._tab.ExecuteJavaScript('window.__ready = 0; '
                                    'document.body.innerHTML="%s";' % html_esc)
        self._tab.Activate()
        self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter()

    def clear_output(self):
        """Replace the body of self._tab with a blank screen.
        """
        self.set_tab('')

    def set_tab_with_buttons(self, html, buttons=['OK']):
        """Replace the body of self._tab with provided html and buttons.

        @param html: the HTML that will replace the body of the dialog tab.
        @param buttons: the titles of some number of buttons to add to the
                        page. Each button has an integer value, starting from
                        0 for the first. Defaults to an 'OK' button.
        """
        html_total = html+'<br>'
        index = 0
        for title in buttons:
            onclick = 'submit_button(%d)' % index
            html_total += ('<input type="button" value="%s" onclick="%s">' % (
                           cgi.escape(title), onclick))
            index += 1
        self.set_tab(html_total)

    def set_tab_with_textbox(self, html, title=''):
        """Replace the body of self._tab with provided html and a textbox.

        Adds a textbox and Submit button to the page.  The value returned after
        clicking the button is the text that was entered in the textbox.

        @param html: the HTML that will replace the body of the dialog tab.
        @param title: the title put next to the textbox.
        """
        textbox = '%s<input type="text" id="textinput"/>' % title
        button = '<input type="button" value="SUBMIT" onclick="get_text()"/>'
        html_total = '%s<br>%s<br>%s' % (html, textbox, button)
        self.set_tab(html_total)

    def wait_for_tab_result(self, timeout=_DEFAULT_TIMEOUT):
        """Wait for interactive tab to be ready and get return value.

        @param timeout: Maximum number of seconds to wait for result.

        @return: value of window.__result.
        """
        complete = lambda: self._tab.EvaluateJavaScript('window.__ready') == 1
        utils.poll_for_condition(condition=complete, timeout=timeout,
                                 desc='User response')

        result = self._tab.EvaluateJavaScript('window.__result')
        self._tab.ExecuteJavaScript('window.__ready = 0; '
                                    'window.__result = null;')
        return result
