# Copyright 2022 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.

"""Create release branches of sub-projects of integration.git.

It's not possible to create cherry-pick CLs in a repo until that repo has a
branch corresponding to the integration.git branch that the CL is targetting.
This recipe solves the problem of creating a branch B in a repo R pinned in
integration.git, based on the revision of R that's pinned on branch B of
integration.git.
"""

from PB.go.chromium.org.luci.buildbucket.proto import build as build_pb2
from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2
from PB.recipe_engine.result import RawResult
from PB.recipes.fuchsia.release.init_project_branch import InputProperties

DEPS = [
    "fuchsia/checkout",
    "fuchsia/gerrit",
    "fuchsia/jiri",
    "fuchsia/release",
    "fuchsia/status_check",
    "recipe_engine/context",
    "recipe_engine/properties",
    "recipe_engine/step",
]

PROPERTIES = InputProperties


def RunSteps(api, props):
    with api.step.nest("check inputs"):
        if not api.release.validate_branch(props.target_branch):
            return RawResult(
                summary_markdown='`target_branch` must start with "releases/"',
                status=common_pb2.FAILURE,
            )

    checkout = api.checkout.fuchsia_with_options(
        build_input=build_pb2.Build.Input(
            gitiles_commit=common_pb2.GitilesCommit(
                ref="refs/heads/%s" % props.target_branch,
                project=props.project,
            ),
        ),
        project=props.project,
        manifest=props.manifest,
        remote=props.remote,
        # Skip for faster checkout.
        fetch_packages=False,
    )
    integration_root = api.release.get_project_path(checkout.root_dir, props.project)

    with api.step.nest("initialize branches"), api.context(cwd=integration_root):
        for project_info in api.jiri.project(
            projects=props.projects,
            test_data=[
                {
                    "name": project,
                    "revision": "abc123",
                    "gerrithost": "https://fuchsia-review.googlesource.com",
                }
                for project in props.projects
            ],
        ).json.output:
            project_name = project_info["name"]
            step_name = "create branch %s in %s" % (props.target_branch, project_name)
            if props.dryrun:
                api.step.empty("(dry run) would %s" % step_name)
            else:
                api.gerrit.create_branch(
                    name=step_name,
                    host=project_info["gerrithost"],
                    project=project_name,
                    ref=props.target_branch,
                    revision=project_info["revision"],
                )


def GenTests(api):
    def properties(**kwargs):
        props = dict(
            target_branch="releases/f2",
            remote="https://fuchsia.googlesource.com/integration",
            project="integration",
            manifest="minimal",
            projects=["foo", "bar"],
        )
        props.update(kwargs)
        return api.properties(**props)

    yield api.status_check.test("success") + properties()

    yield api.status_check.test("dry_run") + properties(dryrun=True)

    yield (
        api.status_check.test("invalid_branch_input", status="failure")
        + properties(target_branch="invalidbranch")
    )
