# Copyright 2023 The Servo Project Developers. See the COPYRIGHT
# file at the top-level directory of this distribution.
#
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.

from argparse import ArgumentParser
import os
import sys

import mozlog.commandline

from . import test

SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
SERVO_ROOT = os.path.abspath(os.path.join(SCRIPT_PATH, "..", ".."))
WPT_PATH = os.path.join(SERVO_ROOT, "tests", "wpt")
WPT_TOOLS_PATH = os.path.join(WPT_PATH, "tests", "tools")
CERTS_PATH = os.path.join(WPT_TOOLS_PATH, "certs")

sys.path.insert(0, WPT_TOOLS_PATH)
import localpaths  # noqa: F401,E402
import wptrunner.wptcommandline  # noqa: E402


def create_parser() -> ArgumentParser:
    parser = wptrunner.wptcommandline.create_parser()
    parser.add_argument(
        "--rr-chaos", default=False, action="store_true", help="Run under chaos mode in rr until a failure is captured"
    )
    parser.add_argument("--pref", default=[], action="append", dest="prefs", help="Pass preferences to servo")
    parser.add_argument(
        "--log-servojson",
        action="append",
        type=mozlog.commandline.log_file,
        help="Servo's JSON logger of unexpected results",
    )
    parser.add_argument("--always-succeed", default=False, action="store_true", help="Always yield exit code of zero")
    parser.add_argument(
        "--no-default-test-types",
        default=False,
        action="store_true",
        help="Run all of the test types provided by wptrunner or specified explicitly by --test-types",
    )
    parser.add_argument(
        "--filter-intermittents",
        default=None,
        action="store",
        help="Filter intermittents against known intermittents and save the filtered output to the given file.",
    )
    parser.add_argument(
        "--log-raw-unexpected",
        default=None,
        action="store",
        help="Raw structured log messages for unexpected results."
        " '--log-raw' Must also be passed in order to use this.",
    )
    return parser


def run_tests() -> bool:
    return test.run_tests()
