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

from recipe_engine import recipe_test_api


class GerritAutoSubmitTestApi(recipe_test_api.RecipeTestApi):
    def properties(self, **kwargs):
        kwargs.setdefault("tree_status_host", "fuchsia-stem-status.appspot.com")
        return {"$fuchsia/gerrit_auto_submit": kwargs}

    def cq_success(self):
        return self.step_data("cq.3965", self.m.json.output({}), retcode=0)

    def changes_query_test_data(self):
        return self.step_data(
            "get eligible.get changes for fuchsia-review.googlesource.com",
            self.m.json.output(
                [
                    {
                        "id": "myProject~main~I8473b95934b5732ac55d26311a706c9c2bde9939",
                        "project": "myProject",
                        "branch": "main",
                        "change_id": "I8473b95934b5732ac55d26311a706c9c2bde9939",
                        "subject": 'Revert "Implementing Feature X"',
                        "status": "NEW",
                        "created": "2013-02-01 09:59:32.126000000",
                        "updated": "2013-02-21 11:16:36.775000000",
                        "_number": 3965,
                        "owner": {"name": "John Doe"},
                        "current_revision": "27cc4558b5a3d3387dd11ee2df7a117e7e581822",
                    }
                ]
            ),
        )

    def change_detail_messages(self, num):
        # Include a message posted without an author email address because
        # some prod accounts don't use an email address.
        messages = [
            {"author": {"email": "nobody@example.com"}},
            {"author": {}},
        ]

        for i in range(num):
            messages.append({"author": {"email": "auto-submit@example.com"}})
            messages.append({"tag": "autogenerated:cq:full-run"})

        return self.step_data(
            "get eligible.get messages for 3965.get details",
            self.m.json.output(
                {
                    "id": "myProject~main~I8473b95934b5732ac55d26311a706c9c2bde9939",
                    "status": "NEW",
                    "messages": messages,
                }
            ),
        )

    def changes_submitted_together_test_data(self, other_change_count=0):
        return self.step_data(
            "get eligible.get details for 3965.find dependent changes",
            self.m.json.output(
                {
                    "changes": [
                        {
                            "id": "myProject~main~I8473b95934b5732ac55d26311a706c9c2bde994%d"
                            % n,
                        }
                        for n in range(other_change_count)
                    ],
                    "non_visible_changes": other_change_count,
                }
            ),
        )

    def mergeable_test_data(self, mergeable=True, retcode=0):
        return self.step_data(
            "get eligible.get details for 3965.get mergeable",
            self.m.json.output({"mergeable": mergeable}),
            retcode=retcode,
        )

    def rebase_test_data(self, success=True):
        return self.step_data(
            "get eligible.get details for 3965.rebase",
            retcode=0 if success else 1,
        )
