# 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

DEPS = [
    "fuchsia/checkout",
    "fuchsia/jiri",
    "fuchsia/status_check",
    "recipe_engine/cipd",
    "recipe_engine/path",
    "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(basestring), 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.
    api.checkout.fuchsia_with_options(
        manifest=manifest, path=api.path["start_dir"], remote=remote,
    )

    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))
    )
