# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, # You can obtain one at http://mozilla.org/MPL/2.0/.
import logging
import os
import sys
import tempfile

from mach.decorators import Command, CommandArgument
from mozbuild.base import BinaryNotFoundException

requirements = os.path.join(os.path.dirname(__file__), "requirements", "base.txt")


def _init(command_context):
    command_context.activate_virtualenv()
    command_context.virtualenv_manager.install_pip_requirements(
        requirements, require_hashes=False
    )


@Command("fetch-condprofile", category="testing")
@CommandArgument("--target-dir", default=None, help="Target directory")
@CommandArgument("--platform", default=None, help="Platform")
@CommandArgument("--scenario", default="full", help="Scenario")  # grab choices
@CommandArgument("--customization", default="default", help="Customization")  # same
@CommandArgument("--task-id", default=None, help="Task ID")
@CommandArgument("--download-cache", action="store_true", default=True)
@CommandArgument(
    "--repo",
    default="mozilla-central",
    choices=["mozilla-central", "try"],
    help="Repository",
)
def fetch(
    command_context,
    target_dir,
    platform,
    scenario,
    customization,
    task_id,
    download_cache,
    repo,
):
    _init(command_context)
    from condprof.client import get_profile
    from condprof.util import get_current_platform, get_version

    if platform is None:
        platform = get_current_platform()

    if target_dir is None:
        target_dir = tempfile.mkdtemp()

    version = get_version(command_context.get_binary_path())

    get_profile(
        target_dir,
        platform,
        scenario,
        customization,
        task_id,
        download_cache,
        repo,
        version,
    )
    print("Downloaded conditioned profile can be found at: %s" % target_dir)


@Command("run-condprofile", category="testing")
@CommandArgument("archive", help="Archives Dir", type=str, default=None)
@CommandArgument("--firefox", help="Firefox Binary", type=str, default=None)
@CommandArgument("--scenario", help="Scenario to use", type=str, default="all")
@CommandArgument("--profile", help="Existing profile Dir", type=str, default=None)
@CommandArgument(
    "--customization", help="Profile customization to use", type=str, default="all"
)
@CommandArgument(
    "--visible", help="Don't use headless mode", action="store_true", default=False
)
@CommandArgument(
    "--archives-dir", help="Archives local dir", type=str, default="/tmp/archives"
)
@CommandArgument(
    "--force-new", help="Create from scratch", action="store_true", default=False
)
@CommandArgument(
    "--strict",
    help="Errors out immediatly on a scenario failure",
    action="store_true",
    default=True,
)
@CommandArgument(
    "--geckodriver",
    help="Path to the geckodriver binary",
    type=str,
    default=sys.platform.startswith("win") and "geckodriver.exe" or "geckodriver",
)
@CommandArgument("--device-name", help="Name of the device", type=str, default=None)
def run(command_context, **kw):
    os.environ["MANUAL_MACH_RUN"] = "1"
    _init(command_context)

    if kw["firefox"] is None:
        try:
            kw["firefox"] = command_context.get_binary_path()
        except BinaryNotFoundException as e:
            command_context.log(
                logging.ERROR,
                "run-condprofile",
                {"error": str(e)},
                "ERROR: {error}",
            )
            command_context.log(
                logging.INFO, "run-condprofile", {"help": e.help()}, "{help}"
            )
            return 1

    from condprof.runner import run

    run(**kw)
