#!/usr/bin/python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from urllib.parse import urlparse, parse_qs


if __name__ == '__main__':
    options = webdriver.firefox.options.Options()
    options.binary_location = "/usr/bin/firefox"
    options.add_argument("-headless")
    driver = webdriver.Firefox(options=options)

    # The following search engines are expected to be present for every locale,
    # and their label and netloc locale-independent
    expected_engines = [
        {'label': "Google", 'netloc': "www.google.com",
         'params': {"client": "ubuntu"}},
        {'label': "DuckDuckGo", 'netloc': "duckduckgo.com",
         'params': {"t": "canonical"}},
    ]

    search_settings_page = "about:preferences#search"
    homepage = "about:home"

    def print_engines(prefix, engines):
        print("{}{}".format(prefix,
                            ", ".join(["[{}]".format(e) for e in engines])))

    for i, v in enumerate(expected_engines):
        driver.get(search_settings_page)
        selector = driver.find_element_by_id("defaultEngine")
        popup = selector.find_element_by_tag_name("menupopup")
        selector.click()
        WebDriverWait(driver, 10).until(EC.visibility_of(popup))

        # For some reason, an XPath selector doesn't work here
        engines = popup.find_elements_by_tag_name("menuitem")
        found = False
        expected = v['label']
        for engine in engines:
            if engine.get_attribute("label") == expected:
                found = True
                break
        assert found, "Search engine not found: {}".format(expected)
        WebDriverWait(driver, 10).until(EC.visibility_of(engine))
        engine.click()

        driver.get(homepage)
        driver.find_element_by_id("newtab-search-text").send_keys("foobarbaz")
        driver.find_element_by_id("searchSubmit").click()
        WebDriverWait(driver, 10).until(EC.url_changes(homepage))
        url = urlparse(driver.current_url)
        print("netloc for {} [{}]: {}".format(
                expected, v['netloc'], url.netloc))
        assert url.netloc == v['netloc']
        query = parse_qs(url.query)
        for pk, pv in v['params'].items():
            print("query parameter for {} [{}={}]: {}".format(
                    expected, pk, pv, query.get(pk)))
            assert query[pk] == [pv]

    driver.quit()
