load(
    "//common:browsers.bzl",
    "COMMON_TAGS",
    "chrome_data",
    "edge_data",
    "firefox_beta_data",
    "firefox_data",
)
load(
    "//java:browsers.bzl",
    "chrome_jvm_flags",
    "edge_jvm_flags",
    "firefox_beta_jvm_flags",
    "firefox_jvm_flags",
)
load(":junit5_test.bzl", "junit5_test")

DEFAULT_BROWSER = "firefox"

BROWSERS = {
    "chrome": {
        "deps": ["//java/src/org/openqa/selenium/chrome"],
        "jvm_flags": ["-Dselenium.browser=chrome"] + chrome_jvm_flags,
        "data": chrome_data,
        "tags": COMMON_TAGS + ["chrome"],
    },
    "edge": {
        "deps": ["//java/src/org/openqa/selenium/edge"],
        "jvm_flags": ["-Dselenium.browser=edge"] + edge_jvm_flags,
        "data": edge_data,
        "tags": COMMON_TAGS + ["edge"],
    },
    "firefox": {
        "deps": ["//java/src/org/openqa/selenium/firefox"],
        "jvm_flags": ["-Dselenium.browser=ff"] + firefox_jvm_flags,
        "data": firefox_data,
        "tags": COMMON_TAGS + ["firefox"],
    },
    "firefox-beta": {
        "deps": ["//java/src/org/openqa/selenium/firefox"],
        "jvm_flags": ["-Dselenium.browser=ff"] + firefox_beta_jvm_flags,
        "data": firefox_beta_data,
        "tags": COMMON_TAGS + ["firefox", "firefox-beta"],
    },
    "ie": {
        "deps": ["//java/src/org/openqa/selenium/ie"],
        "jvm_flags": ["-Dselenium.browser=ie"] +
                     select({
                         "@selenium//common:windows": ["-Dselenium.skiptest=false"],
                         "@selenium//conditions:default": ["-Dselenium.skiptest=true"],
                     }),
        "data": [],
        "tags": COMMON_TAGS + ["exclusive-if-local", "ie", "skip-rbe"],
    },
    "safari": {
        "deps": ["//java/src/org/openqa/selenium/safari"],
        "jvm_flags": ["-Dselenium.browser=safari"] +
                     select({
                         "@selenium//common:macos": ["-Dselenium.skiptest=false"],
                         "@selenium//conditions:default": ["-Dselenium.skiptest=true"],
                     }),
        "data": [],
        "tags": COMMON_TAGS + ["exclusive-if-local", "safari", "skip-rbe"],
    },
}

DEFAULT_BROWSERS = [b for b in BROWSERS.keys() if b != "ie"]

def selenium_test(name, test_class, size = "medium", browsers = DEFAULT_BROWSERS, **kwargs):
    if len(browsers) == 0:
        fail("At least one browser must be specified.")

    default_browser = DEFAULT_BROWSER if DEFAULT_BROWSER in browsers else browsers[0]

    test_name = test_class.rpartition(".")[2]

    data = kwargs["data"] if "data" in kwargs else []
    jvm_flags = kwargs["jvm_flags"] if "jvm_flags" in kwargs else []
    tags = kwargs["tags"] if "tags" in kwargs else []

    remote = False
    if "selenium-remote" in tags:
        tags.remove("selenium-remote")
        remote = True

    stripped_args = dict(**kwargs)
    stripped_args.pop("data", None)
    stripped_args.pop("jvm_flags", None)
    stripped_args.pop("tags", None)
    inherited_env = stripped_args.pop("env_inherit", []) + ["REMOTE_BUILD"]

    all_tests = []

    for browser in browsers:
        if not browser in BROWSERS:
            fail("Unrecognized browser: " + browser)

        test = name if browser == default_browser else "%s-%s" % (name, browser)

        junit5_test(
            name = test,
            test_class = test_class,
            size = size,
            jvm_flags = BROWSERS[browser]["jvm_flags"] + jvm_flags,
            # Only allow linting on the default test
            tags = BROWSERS[browser]["tags"] + tags + ([] if test == name else ["no-lint"]),
            data = BROWSERS[browser]["data"] + data,
            env_inherit = inherited_env,
            **stripped_args
        )
        if browser == default_browser:
            native.alias(
                name = "%s-%s" % (name, browser),
                actual = test,
            )
        all_tests.append(":%s" % test)

        if remote:
            junit5_test(
                name = "%s-remote" % test,
                test_class = test_class,
                size = size,
                jvm_flags = BROWSERS[browser]["jvm_flags"] + jvm_flags + [
                    "-Dselenium.browser.remote=true",
                ],
                # No need to lint remote tests as the code for non-remote is the same and they get linted
                tags = BROWSERS[browser]["tags"] + tags + ["remote-browser", "no-lint"],
                data = BROWSERS[browser]["data"] + data + [
                    "@selenium//java/src/org/openqa/selenium/grid:selenium_server",
                ],
                **stripped_args
            )
            all_tests.append(":%s-remote" % test)

    # Handy way to run everything
    native.test_suite(name = "%s-all-browsers" % name, tests = all_tests, tags = tags + ["manual"])
