#!/usr/bin/env python3

import argparse
import gzip
import logging
import os
import shutil
import subprocess
import sys


def get_browser_args(product, channel):
    if product == "firefox":
        local_binary = os.path.expanduser(os.path.join("~", "build", "firefox", "firefox"))
        if os.path.exists(local_binary):
            return ["--binary=%s" % local_binary]
        print("WARNING: Local firefox binary not found")
        return ["--install-browser", "--install-webdriver"]
    if product == "servo":
        return ["--install-browser", "--processes=12"]
    if product == "chrome":
        # Taskcluster machines do not have GPUs, so use software rendering via --enable-swiftshader.
        args = ["--enable-swiftshader"]
        if channel == "nightly":
            args.extend(["--install-browser", "--install-webdriver"])
        return args
    if product == "webkitgtk_minibrowser":
        return ["--install-browser"]
    return []


def find_wptreport(args):
    parser = argparse.ArgumentParser()
    parser.add_argument('--log-wptreport', action='store')
    return parser.parse_known_args(args)[0].log_wptreport


def find_wptscreenshot(args):
    parser = argparse.ArgumentParser()
    parser.add_argument('--log-wptscreenshot', action='store')
    return parser.parse_known_args(args)[0].log_wptscreenshot


def gzip_file(filename, delete_original=True):
    with open(filename, 'rb') as f_in:
        with gzip.open('%s.gz' % filename, 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)
    if delete_original:
        os.unlink(filename)


def main(product, channel, commit_range, wpt_args):
    """Invoke the `wpt run` command according to the needs of the Taskcluster
    continuous integration service."""

    logger = logging.getLogger("tc-run")
    logger.setLevel(logging.INFO)
    handler = logging.StreamHandler()
    handler.setFormatter(
        logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    )
    logger.addHandler(handler)

    subprocess.call(['python3', './wpt', 'manifest-download'])

    if commit_range:
        logger.info(
            "Running tests affected in range '%s'..." % commit_range
        )
        wpt_args += ['--affected', commit_range]
    else:
        logger.info("Running all tests")

    wpt_args += [
        "--log-mach-level=info",
        "--log-mach=-",
        "-y",
        "--no-pause",
        "--no-restart-on-unexpected",
        "--install-fonts",
        "--no-headless",
        "--verify-log-full"
    ]
    wpt_args += get_browser_args(product, channel)

    # Hack to run servo with one process only for wdspec
    if product == "servo" and "--test-type=wdspec" in wpt_args:
        wpt_args = [item for item in wpt_args if not item.startswith("--processes")]

    command = ["python3", "./wpt", "run"] + wpt_args + [product]

    logger.info("Executing command: %s" % " ".join(command))
    with open("/home/test/artifacts/checkrun.md", "a") as f:
        f.write("\n**WPT Command:** `%s`\n\n" % " ".join(command))

    retcode = subprocess.call(command, env=dict(os.environ, TERM="dumb"))
    if retcode != 0:
        sys.exit(retcode)

    wptreport = find_wptreport(wpt_args)
    if wptreport:
        gzip_file(wptreport)
    wptscreenshot = find_wptscreenshot(wpt_args)
    if wptscreenshot:
        gzip_file(wptscreenshot)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=main.__doc__)
    parser.add_argument("--commit-range", action="store",
                        help="""Git commit range. If specified, this will be
                             supplied to the `wpt tests-affected` command to
                             determine the list of test to execute""")
    parser.add_argument("product", action="store",
                        help="Browser to run tests in")
    parser.add_argument("channel", action="store",
                        help="Channel of the browser")
    parser.add_argument("wpt_args", nargs="*",
                        help="Arguments to forward to `wpt run` command")
    main(**vars(parser.parse_args()))  # type: ignore
