# 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.
"""Recipe for flagging large-scale changes (LSCs) that may impact downstream projects."""

import datetime

from recipe_engine import post_process

from PB.recipes.fuchsia.lsc_suggester import InputProperties

DEPS = [
    "fuchsia/gerrit",
    "fuchsia/status_check",
    "recipe_engine/json",
    "recipe_engine/properties",
    "recipe_engine/url",
]

PROPERTIES = InputProperties

# TODO(akbiggs): Remove message once changes to add comment have been tested.
FX_LSC_MESSAGE = """
Please run `fx lsc presubmit` on API+1 changes. See http://go/run-fx-lsc-presubmit.

Note that the LSC tryjobs are non-blocking. You will need to check the results manually.
"""
FX_LSC_COMMENT = """
`fx lsc presubmit` must be run on API+1 changes. Please run `fx lsc presubmit` and then resolve this comment. See http://go/run-fx-lsc-presubmit.

Note that the LSC tryjobs are non-blocking. You will need to check the results manually.
"""
FX_LSC_TAG = "autogenerated:suggest-fx-lsc"


def RunSteps(api, props):
    assert props.gerrit_host, "props.gerrit_host must be specified"
    for change in get_eligible_changes_with_messages(api, props.gerrit_host):
        # Only comment on the change if it has not been commented on before
        # regardless of patchset. change["messages"] contains messages from all
        # patchsets.
        assert "messages" in change, "change %s must have a `messages` key" % change
        has_fx_lsc_tag = any(
            message.get("tag") == FX_LSC_TAG for message in change["messages"]
        )

        # Add an unresolved comment instead of a message when
        # akbiggs@google.com is the author of the commit.
        # TODO(akbiggs): Simplify this logic once changes have been tested.
        author_is_akbiggs = (
            change.get("author") and change["author"]["email"] == "akbiggs@google.com"
        )

        comment = None
        step_name = "add fx lsc message to %d" % change["_number"]
        if author_is_akbiggs:
            comment = {"message": FX_LSC_COMMENT, "unresolved": True}
            step_name = "add fx lsc message V2 to %d" % change["_number"]

        if not has_fx_lsc_tag:
            api.gerrit.set_review(
                step_name,
                api.url.unquote(change["id"]),
                patchset_level_comment=comment,
                # We leave a message on the commit with a tag to easily identify
                # commits that have already been commented on. We need a message
                # because get_eligible_changes_with_messages uses
                # Gerrit.ChangeQuery, which can only retrieve messages, not comments.
                message=FX_LSC_MESSAGE,
                tag=FX_LSC_TAG,
                notify="OWNER",
                host=props.gerrit_host,
            )


def get_eligible_changes_with_messages(api, gerrit_host):
    """Finds changes to suggest running fx lsc.

    Eligible changes have the following properties:
      * unsubmitted
      * recently modified/created
      * need the API-Review label or have API+1 label
      * in directory:sdk

    Args:
      gerrit_host (str): Gerrit Host to query.

    Returns:
      changes ([]json ChangeInfo): list of changes that are suggested to run
      fx lsc. See
      https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#change-info.
    """
    # We restrict the results to recently modified/created changes. This is to
    # avoid messaging abandoned changes so that we do not spam users.
    #
    # The following change fxr/644416 had 80 messages and the result size was
    # ~52KB -> 100KB.  We expect a max of O(10) eligible changes, where result
    # size will be 1MB.
    raw_query = "is:open -is:wip (label:Api-Review=need OR label:Api-Review+1) -age:1h directory:sdk"
    # Query for unsubmitted changes that are api+1. Get the messages so that we
    # can determine if the change has been fx lsc commented before. The query
    # will get all the messages from all patchsets from a change.
    changes = api.gerrit.change_query(
        name="get eligible changes",
        query_string=raw_query,
        query_params=["MESSAGES"],
        host=gerrit_host,
        max_attempts=3,
        timeout=datetime.timedelta(seconds=120),
    ).json.output

    # API returns None if there is no search results instead of [].
    return changes or []


def GenTests(api):
    # For this test, check that there are no fx lsc comments added.
    yield api.status_check.test("empty") + api.properties(
        gerrit_host="fuchsia-review.googlesource.com"
    ) + api.step_data("get eligible changes", api.json.output([]))
    # For this test, check that only change 1000, 1001 and 1002 got
    # a fx lsc comment added. 1002 should use the new logic with an
    # unresolved comment.
    yield api.status_check.test("default") + api.properties(
        gerrit_host="fuchsia-review.googlesource.com"
    ) + api.step_data(
        "get eligible changes",
        api.json.output(
            [
                {
                    "id": "myProject~main~1000",
                    "project": "myProject",
                    "status": "NEW",
                    "_number": 1000,
                    "messages": [],
                },
                {
                    "id": "myProject~main~1001",
                    "project": "myProject",
                    "status": "NEW",
                    "_number": 1001,
                    "messages": [
                        {"message": ""},
                        {"message": "nothing"},
                    ],
                },
                {
                    "id": "myProject~main~1002",
                    "project": "myProject",
                    "status": "NEW",
                    "_number": 1002,
                    "author": {
                        "name": "Alexander Biggs",
                        "email": "akbiggs@google.com",
                        "date": "2012-04-24 18:08:08.000000000",
                        "tz": 120,
                    },
                    "messages": [
                        {"message": ""},
                        {"message": "nothing"},
                    ],
                },
                {
                    "id": "myProject~main~1003",
                    "project": "myProject",
                    "status": "NEW",
                    "_number": 1003,
                    "messages": [
                        {"message": ""},
                        {"message": FX_LSC_MESSAGE, "tag": FX_LSC_TAG},
                        {"message": "nothing"},
                    ],
                },
                {
                    "id": "myProject~main~1004",
                    "project": "myProject",
                    "status": "NEW",
                    "_number": 1004,
                    "messages": [
                        {
                            "message": "Different from current FX_LSC_MESSAGE",
                            "tag": FX_LSC_TAG,
                        },
                    ],
                },
            ]
        ),
    ) + api.post_process(
        post_process.MustRun,
        "add fx lsc message to 1000",
        "add fx lsc message to 1001",
        "add fx lsc message V2 to 1002",
    )
