# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Recipe for building AEMU."""

from recipe_engine.recipe_api import Property

DEPS = [
    "fuchsia/archive",
    "fuchsia/git",
    "fuchsia/macos_sdk",
    "fuchsia/status_check",
    "fuchsia/upload",
    "recipe_engine/buildbucket",
    "recipe_engine/cipd",
    "recipe_engine/context",
    "recipe_engine/file",
    "recipe_engine/path",
    "recipe_engine/platform",
    "recipe_engine/properties",
    "recipe_engine/python",
    "recipe_engine/raw_io",
    "recipe_engine/step",
]

REPO_CIPD_PKG = ("fuchsia/third_party/repo", "version:2.8", "repo")

PROPERTIES = {
    "platform": Property(kind=str, help="CIPD target platform", default=None),
}

PLATFORM_TO_TARGET = {
    "linux-amd64": "linux",
    "linux-arm64": "linux_aarch64",
    "mac-amd64": "darwin",
}

BREAKPAD_UPLOAD_KEY_PATH = {
    "linux": "/creds/aemu/symbols_upload",
    "mac": "/creds/generic/generic-fuchsia-aemu-symbols-upload-api-token",
}


def RunSteps(api, platform):
    is_prod = api.buildbucket.build.builder.bucket == "prod"

    # AEMU build expects the breakpad upload key in $HOME, so create a fake
    # $HOME and move the key to it.
    fake_home = api.path.mkdtemp()
    if is_prod:
        api.file.copy(
            "copy upload key",
            BREAKPAD_UPLOAD_KEY_PATH[api.platform.name],
            fake_home.join(".emulator_symbol_server_key"),
        )

    cipd_dir = api.path["start_dir"].join("cipd")
    pkgs = api.cipd.EnsureFile()
    pkgs.add_package(*REPO_CIPD_PKG)
    api.cipd.ensure(cipd_dir, pkgs)

    repo_dir = cipd_dir.join("repo")

    src_dir = api.path["start_dir"].join("aemu", "src")
    api.file.ensure_directory("aemu src dir", src_dir)
    install_dir = api.path["start_dir"].join("aemu", "install")
    with api.context(cwd=src_dir):
        api.step(
            "repo init",
            [
                repo_dir.join("repo"),
                "init",
                "-u",
                "https://android.googlesource.com/platform/manifest",
                "-b",
                "emu-master-dev",
            ],
        )
        api.step(
            "repo sync",
            [repo_dir.join("repo"), "sync", "-j%d" % api.platform.cpu_count],
        )
        qemu_dir = src_dir.join("external", "qemu")

    with api.macos_sdk(additional_sdks=[("MacOSX10.13.sdk", "9f2000")]), api.context(
        cwd=qemu_dir
    ):
        repository = api.git.get_remote_url("aosp")
        revision = api.git.get_hash()

        cmd = [
            qemu_dir.join("android", "build", "python", "cmake.py"),
            "--cmake_option",
            "ANDROIDSTUDIO=OFF",
            "--no-qtwebengine",
            "--minbuild",
            "--dist",
            install_dir,
        ]

        if platform:
            cmd.extend(["--target", PLATFORM_TO_TARGET[platform]])
        if is_prod:
            cmd.extend(["--crash", "prod"])

        with api.context(env={"HOME": fake_home}):
            api.python("cmake", cmd[0], cmd[1:], venv=api.resource("cmake.vpython"))

    pkg_dir = qemu_dir.join("objs", "distribution", "emulator")

    api.archive.upload(pkg_dir, output_property="isolated")

    if is_prod:
        if not platform:
            platform = "%s-%s" % (
                api.platform.name.replace("win", "windows"),
                {
                    "intel": {32: "386", 64: "amd64",},
                    "arm": {32: "armv6", 64: "arm64",},
                }[api.platform.arch][api.platform.bits],
            )

        api.upload.cipd_package(
            "fuchsia/third_party/aemu/" + platform,
            pkg_dir,
            [api.upload.DirectoryPath(pkg_dir)],
            {"git_revision": revision},
            repository=repository,
        )


def GenTests(api):
    yield (
        api.status_check.test("cipd_pkg_exists")
        + api.buildbucket.ci_build(
            project="fuchsia",
            bucket="prod",
            git_repo="https://android.googlesource.com/platform/external/qemu/",
            revision="a" * 40,
        )
        + api.platform.name("linux")
    )

    yield (
        api.status_check.test("mac")
        + api.buildbucket.ci_build(
            project="fuchsia",
            bucket="prod",
            git_repo="https://android.googlesource.com/platform/external/qemu/",
            revision="a" * 40,
        )
        + api.platform.name("mac")
    )

    yield (
        api.status_check.test("aarch64_cipd_pkg_exists")
        + api.buildbucket.ci_build(
            project="fuchsia",
            bucket="prod",
            git_repo="https://android.googlesource.com/platform/external/qemu/",
            revision="a" * 40,
        )
        + api.properties(platform="linux-arm64")
    )

    yield (
        api.status_check.test("cipd_pkg_new")
        + api.buildbucket.ci_build(
            project="fuchsia",
            bucket="prod",
            git_repo="https://android.googlesource.com/platform/external/qemu/",
            revision="a" * 40,
        )
        + api.step_data("git rev-parse", api.raw_io.stream_output("a" * 40))
        + api.platform.name("linux")
        + api.step_data(
            "cipd.cipd search fuchsia/third_party/aemu/linux-amd64 "
            + "git_revision:"
            + "a" * 40,
            api.cipd.example_search("fuchsia/third_party/aemu/linux-amd64", []),
        )
    )
