# Copyright 2020 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 updating CIPD refs based on the contents of Fuchsia integration."""

from recipe_engine.config import List
from recipe_engine.recipe_api import Property

PYTHON_VERSION_COMPATIBILITY = "PY3"

DEPS = [
    "fuchsia/checkout",
    "fuchsia/jiri",
    "fuchsia/status_check",
    "recipe_engine/cipd",
    "recipe_engine/context",
    "recipe_engine/properties",
]

PROPERTIES = {
    "manifest": Property(kind=str, help="Jiri manifest to use.", default="flower"),
    "remote": Property(
        kind=str,
        help="Remote manifest repository.",
        default="https://fuchsia.googlesource.com/integration",
    ),
    "packages": Property(
        kind=List(str),
        help="List of CIPD packages to set <ref> on.",
    ),
    "ref": Property(
        kind=str,
        help="Ref to set on the CIPD packages.",
        default="integration",
    ),
}


def RunSteps(api, manifest, remote, packages, ref):
    # TODO(nmulcahey): Get the manifest structure without checkout out all of
    # Fuchsia. Jiri doesn't currently expose this as an explicit option, it
    # may be possible to do it by running int + import + using remote
    # manifests.
    checkout = api.checkout.fuchsia_with_options(
        manifest=manifest,
        remote=remote,
    )

    with api.context(cwd=checkout.root_dir):
        package_data = api.jiri.package(packages).json.output

        for package in package_data:
            platforms = package.get("platforms", None)
            if not platforms:
                api.cipd.set_ref(
                    package_name=package["name"], version=package["version"], refs=[ref]
                )
                continue
            for platform in platforms:
                package_name = package["name"].replace("${platform}", platform)
                api.cipd.set_ref(
                    package_name=package_name, version=package["version"], refs=[ref]
                )


def GenTests(api):
    package_test_data = [
        {
            "name": "ref-set/${platform}",
            "platforms": ["linux-x64", "mac-x64"],
            "version": "0123456789ABCDEF",
        },
        {"name": "ref-set/linux-arm64", "version": "0123456789ABCDEF,1"},
        {
            "name": "ref-unset/${platform}",
            "platforms": ["linux-x64"],
            "version": "DEADBEAF",
        },
    ]

    properties = {"packages": ["ref-set", "ref-unset"]}

    yield (
        api.status_check.test("default")
        + api.properties(**properties)
        + api.step_data("jiri package", api.jiri.package(package_test_data))
    )
