# 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(init_network_controller=True).browser
        self._tab = self._browser.tabs[0]
        self._browser.platform.SetHTTPServerDirectories(
                os.path.join(self.bindir, '..', '..', 'cros'))
        self._tab.Navigate(self._browser.platform.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
